Glossário

Quanto o session replay deixa a velocidade do site mais lenta?

Taras Shynkarenko
Taras Shynkarenko
•Atualizado: •9 min de leitura
Quanto o session replay deixa a velocidade do site mais lenta?Quanto o session replay deixa a velocidade do site mais lenta?

TL;DR, Resposta rápida

9 min de leitura

O session replay custa a uma página em três lugares: o script do gravador baixado no primeiro carregamento, a CPU da thread principal que serializa as mutações do DOM em eventos, e a banda de upload que envia esses eventos. O benchmark publicado da Sentry colocou o plugin de replay em cerca de 36 KB gzipped e mediu o Total Blocking Time subindo de 2621.67 ms para 3036.80 ms com o replay ligado, enquanto o Largest Contentful Paint não piorou. O custo cai na thread principal, não na rede.

O session replay deixa a performance do site mais lenta?

O session replay, ou seja, a reprodução de visitas gravadas, custa a uma página em três lugares, e é por isso que a resposta para "o session replay deixa a performance do site mais lenta" é sim: bytes de script no primeiro carregamento, CPU da thread principal serializando mutações do DOM e banda de upload durante a visita. O tamanho de cada custo depende do gravador, do tamanho do DOM da página e da configuração de amostragem. A Sentry publica um benchmark datado com a metodologia junto, e esses números colocam o custo visível na thread principal, não na rede.

Quais são os três custos de gravar uma sessão?

Um gravador cobra de uma página uma vez no carregamento e depois continuamente pelo resto da visita. A cobrança única é o bundle, que baixa, é parseado e executa antes de conseguir tirar seu primeiro snapshot do DOM. A cobrança contínua se divide entre CPU, que serializa os registros de mutação em eventos JSON, e rede, que sobe esses eventos em lotes. Como o session replay reconstrói uma visita a partir de mutações do DOM em vez de quadros de vídeo, a linha de CPU é a que escala com a sua página.

CustoQuando apareceO que o dirigeO que você controla
Bytes de scriptPrimeiro carregamento, uma vezTamanho comprimido do bundle do gravadorQual gravador, e se ele carrega async
CPU da thread principalSnapshot inicial, depois cada lote de mutaçõesNúmero de nós do DOM e taxa de mutaçãoAmostragem, subárvores bloqueadas, slimDOM
Banda de uploadDurante toda a visitaVolume de eventos após amostragem e empacotamentoIntervalos de amostragem, captura de mousemove

Qual é o tamanho de um script de session replay?

O bundle do gravador é a única parte que um visitante paga antes de a página ficar interativa. O Bundlephobia mede o @rrweb/record 2.1.4, a metade de gravação do rrweb, em 23.262 bytes gzipped, e o pacote rrweb completo com o player em 78.597 bytes gzipped. A própria documentação da Sentry afirma que "as of version 7.78.0 the Session Replay plugin is an additional ~36KB gzipped" em cima do SDK de erros. A Flowsery entrega um script abaixo de 10 KB. Carregue o gravador que você escolher de forma assíncrona para que os bytes dele nunca fiquem na frente do primeiro paint, e depois faça você mesmo a comparação antes e depois no Lighthouse em vez de confiar em um selo de tamanho.

Quanto tempo de thread principal custa a serialização do DOM?

O custo de CPU se concentra no primeiro snapshot completo e depois cai para trabalho por lote no resto da sessão. O rrweb registra um MutationObserver, e por isso o guia dele afirma que o rrweb "does not support IE11 and below because it uses the MutationObserver API"; essa API entrega ao gravador um lote enfileirado de registros em vez de disparar uma vez por mudança do DOM, então a serialização roda um lote de cada vez, não a cada nó tocado. Existem números publicados para o snapshot: a issue do rrweb #1337 mediu a serialização do snapshot completo em 34,55 ms de média em um documento de divs profundamente aninhados, e em 27,35 ms depois de remover buscas repetidas de closest().

O artigo do web.dev do Google sobre long tasks define o limite e a aritmética:

blocking time = task duration - 50 ms

Um snapshot de 34,55 ms contribui, portanto, com 0 ms de blocking time, porque "any task that takes longer than 50 milliseconds is a long task" e nada mais curto conta. Snapshots em árvores do DOM bem maiores cruzam essa linha, e o tracker do rrweb tem os relatos: a issue #1547 diz que uma checagem interna "lags by 1 to 3 seconds on pages with lots of nodes", e a issue #1820 documenta a thread principal travando quando há um widget do Zendesk na página. Nenhum benchmark público mapeia número de nós do DOM para milissegundos de serialização, então trate qualquer número fixo de CPU por página alegado por um fornecedor como não medido.

Gravadores podem empurrar o trabalho não urgente para o requestIdleCallback, mas a especificação do W3C limita cada deadline ociosa "to a maximum value of 50ms" para o navegador manter folga e responder a entradas dentro da janela de 100 ms que parece instantânea. A MDN avisa que sem a opção timeout "it's possible multiple seconds will elapse before the callback is fired", então o agendamento ocioso serve para compressão e upload, não para o snapshot.

Um notebook exibe um painel de medição de desempenho, ao lado da seção sobre a banda de upload do session replay.

Quanta banda um session replay envia por upload?

O benchmark da Sentry mediu o upload de rede do cenário dela subindo de 3,84 KB só com o SDK de erros para 272,51 KB com o replay ligado, enquanto o download ficou estável em 8,09 MB e 8,07 MB. O upload é o custo que o seu servidor e a conexão do seu visitante carregam juntos, e ele escala linearmente com as sessões gravadas:

monthly replay upload = uploaded bytes per session x sessions per month

Com os 272,51 KB medidos pela Sentry por cenário gravado e 50.000 sessões por mês, isso dá 13.625.500 KB, ou cerca de 13 GB de upload. Apps com muito texto e DOM de mudança lenta ficam abaixo desse número e apps com muito canvas ou animação ficam acima, e é para isso que existe a receita de armazenamento do rrweb.

O session replay muda as Core Web Vitals?

Na execução publicada pela Sentry, o session replay deixou Largest Contentful Paint e Cumulative Layout Shift em paz e moveu o Total Blocking Time. O benchmark estava "last updated on Sept 25, 2023" e rodou "on an Apple M1 MacBook Pro against a remote preview server and a remote API backend with 50 iterations".

Métrica medianaSem SDKSDK de errosSDK de erros mais Replay
Largest Contentful Paint1599,19 ms1546,07 ms1529,11 ms
Cumulative Layout Shift0,400,400,40
First Input Delay1,26 ms1,30 ms1,50 ms
Total Blocking Time2621,67 ms2663,35 ms3036,80 ms
Upload de rede21 B3,84 KB272,51 KB

O Total Blocking Time subiu 415,13 ms entre o SDK de erros e a build com replay, e a Sentry observa que uma página de teste mais simples "produced an increase of ~100 ms of total JS blocking time". A estabilidade de layout não se moveu nem um pouco, o que combina com o funcionamento da métrica: a gravação lê o DOM e o Cumulative Layout Shift pontua o movimento dentro dele. Um notebook M1 não é um celular Android intermediário, e ninguém publicou o mesmo benchmark em hardware móvel de entrada, então meça as Core Web Vitals com os seus próprios dados de campo antes de decidir que os números se transferem.

Como cortar o overhead do session replay sem perder a gravação?

A amostragem remove os eventos que mais custam e menos provam. A receita de armazenamento do rrweb recomenda mousemove: false para descartar o movimento do mouse, scroll: 150 para emitir no máximo um evento de scroll a cada 150 ms, media: 800 para interação com mídia, e input: 'last' para gravar apenas o valor final de um campo digitado, com o argumento de que a amostragem "can reduce the storage size by dropping some events". Além da amostragem, o blockClass pula subárvores inteiras, já que "an element with the class name .rr-block will not be recorded, instead it will replay as a placeholder", e o slimDOMOptions tira partes do DOM que não agregam valor à reprodução. Comece por mousemove e scroll na sua página mais pesada, e meça de novo. O mascaramento roda dentro da mesma passagem de serialização, então como você configura o mascaramento muda o custo de CPU tanto quanto a sua postura de privacidade.

Flowsery
Flowsery

Comece seu teste grátis de 14 dias

Painel em tempo real

Rastreamento de metas

Rastreamento sem cookies

Cinco formas de reduzir o overhead do replay
1
Desativar o mousemove. mousemove: false descarta os eventos de movimento do mouse, que são os que mais custam e menos entregam.
2
Limitar o scroll. scroll: 150 limita o gravador a um evento de scroll a cada 150 ms.
3
Limitar mídia. media: 800 amostra a interação com mídia a cada 800 ms.
4
Amostrar a entrada. input: 'last' registra apenas o valor final de um campo digitado.
5
Bloquear subárvores pesadas. blockClass ignora qualquer elemento com a classe rr-block, reproduzido como um espaço reservado, e slimDOMOptions remove partes do DOM sem valor para a reprodução.
A receita de armazenamento do rrweb lista essas configurações de amostragem antes de recomendar blockClass e slimDOMOptions para subárvores inteiras.

Perguntas frequentes

O session replay bloqueia a primeira renderização de uma página?

Não quando o gravador carrega de forma assíncrona, porque um script async não fica no caminho crítico do parser. O que pode cair perto da primeira renderização é o snapshot inicial do DOM, que roda depois que o gravador começa e escala com o número de nós. O benchmark da Sentry mostrou Largest Contentful Paint em 1529,11 ms com o replay ligado contra 1599,19 ms sem SDK nenhum, então o primeiro paint não foi o ponto de pressão naquela execução.

Quanto o script do gravador adiciona ao peso da página?

O Bundlephobia lista o @rrweb/record 2.1.4 em 23.262 bytes gzipped e o bundle rrweb completo em 78.597 bytes gzipped, e a Sentry documenta o plugin Session Replay dela em cerca de 36 KB gzipped em cima do SDK de erros. O script da Flowsery fica abaixo de 10 KB. Confira o tamanho de transferência comprimido no painel de rede do seu navegador, já que números sem compressão exageram o que um visitante baixa.

O session replay aumenta o consumo de dados de um visitante?

Sim, no lado do upload. A Sentry mediu 272,51 KB de upload no cenário de benchmark dela com o replay ligado, contra 3,84 KB só com o SDK de erros, enquanto o volume de download não se mexeu. Visitantes em conexões móveis com franquia pagam esse upload, e esse é o argumento mais forte para tirar o mousemove do fluxo por amostragem.

Um desenvolvedor revisa código em um monitor, ao lado da pergunta frequente sobre por que algumas páginas custam mais CPU que outras.

Por que o session replay custa mais CPU em algumas páginas do que em outras?

O trabalho de serialização é função do número de nós do DOM e da taxa de mutação, não de pageviews. Um dashboard que re-renderiza uma tabela grande a cada tecla digitada produz mais registros de mutação do que um artigo estático, e a issue #1547 do rrweb relata travadas de 1 a 3 segundos "on pages with lots of nodes". Widgets de terceiros somam também, que é o que a issue #1820 documenta para o Zendesk Web Widget.

O session replay prejudica o ranqueamento no SEO?

Só pelo mesmo caminho que qualquer script, movendo as Core Web Vitals. A documentação de busca do Google diz que os sistemas centrais de ranqueamento premiam uma boa experiência de página, e ao mesmo tempo alerta que as Core Web Vitals sozinhas não garantem posições (Google Search Central). Como a medição da Sentry moveu o Total Blocking Time e deixou Largest Contentful Paint e Cumulative Layout Shift estáveis, a métrica para acompanhar é a capacidade de resposta da thread principal.

Como eu meço o overhead do session replay no meu próprio site?

Carregue a sua página mais pesada com o gravador desligado, grave um perfil de performance no Chrome DevTools, depois repita com o gravador ligado e compare tempo de scripting, contagem de long tasks e bytes transferidos. Rode cada configuração várias vezes e compare medianas, porque execuções isoladas variam mais do que o efeito que você está medindo. Dados de campo de aparelhos reais resolvem o que um perfil de laboratório apenas sugere.

Desativar o rastreamento de mousemove economiza tempo de CPU ou só banda?

As duas coisas. A tabela de custos do artigo lista a amostragem entre os controles da CPU da thread principal e entre os do upload, porque cada evento de mousemove descartado é um registro de mutação menos para serializar e um evento menos para enviar. Desativar o mousemove com mousemove: false é a mesma alavanca que a receita de armazenamento do rrweb recomenda primeiro.

O que conta como uma 'long task' que o session replay precisa evitar?

O artigo do web.dev do Google define uma long task como qualquer trabalho que passe de 50 milissegundos na thread principal, com o tempo de bloqueio igual à duração da tarefa menos 50 ms. O benchmark de snapshot completo do rrweb mediu 34.55 ms em um documento de divs profundamente aninhadas, o que fica abaixo desse limite e não gera tempo de bloqueio. Snapshots em árvores DOM muito maiores são os que cruzam esse limite, como mostram os relatos do próprio rastreador de issues do rrweb sobre atrasos de vários segundos.

O requestIdleCallback consegue impedir que o session replay bloqueie a thread principal?

Só para o trabalho que pode esperar. Os gravadores podem empurrar compressão e upload para o requestIdleCallback, mas a especificação do W3C limita cada janela de inatividade a 50 ms, e o MDN avisa que, sem a opção timeout, um callback pode levar vários segundos para disparar. Isso torna o agendamento em tempo ocioso adequado para trabalho em segundo plano, não para o snapshot inicial do DOM, que precisa rodar assim que o gravador começa.

O session replay custa mais em uma CPU lenta ou em uma conexão de rede lenta?

Na execução publicada pela Sentry, a CPU carrega a maior parte do custo. O download ficou estável em 8.09 MB contra 8.07 MB com o replay ativado, enquanto o Total Blocking Time subiu de 2621.67 ms para 3036.80 ms, e a conclusão do artigo é que o custo recai sobre a thread principal, não sobre a rede. O upload, por sua vez, cresceu de 3.84 KB para 272.51 KB, então uma conexão com dados limitados também sente isso, só que menos que uma CPU lenta.

Este artigo foi útil?

Diga-nos o que pensa!

Veja-nos mais no Google

Um clique marca a Flowsery como fonte preferida e nossos artigos passam a aparecer mais acima nas suas Principais notícias, no modo IA e nas visões gerais com IA.

Antes de ir...

Flowsery

Flowsery

Analytics orientado para receitas para o seu site

Rastreie cada visitante, fonte e conversão em tempo real. Simples, poderoso e sem cookies.

Painel em tempo real

Rastreamento de metas

Rastreamento sem cookies

Termos relacionados do glossário

Como o Cumulative Layout Shift é realmente calculadoComo o Cumulative Layout Shift é realmente calculado
Glossário

Como o Cumulative Layout Shift é realmente calculado

Toda pontuação de Cumulative Layout Shift é impact fraction vezes distance fraction, e o Google reporta a maior rajada de deslocamentos, não a soma deles.

•8 min de leitura
Como o Interaction to Next Paint pontua o seu pior cliqueComo o Interaction to Next Paint pontua o seu pior clique
Glossário

Como o Interaction to Next Paint pontua o seu pior clique

O Chrome pontua o Interaction to Next Paint pela pior interação de uma página, cronometrando input delay, processing e presentation delay até o frame pintado.

•9 min de leitura
O que o monitoramento de usuários reais prova que o laboratório não consegueO que o monitoramento de usuários reais prova que o laboratório não consegue
Glossário

O que o monitoramento de usuários reais prova que o laboratório não consegue

Passivo por natureza, o monitoramento de usuários reais coleta desempenho e erros de visitas que aconteceram de verdade, e lê tudo no p75, não na média.

•9 min de leitura
Como funciona o session replay e o que ele não vêComo funciona o session replay e o que ele não vê
Glossário

Como funciona o session replay e o que ele não vê

O session replay reconstrói uma visita a partir de mutações do DOM e eventos de entrada, não de vídeo. Veja o que captura, o que o mascaramento esconde.

•9 min de leitura
O que uma ação por grampo via session replay precisa provar no tribunalO que uma ação por grampo via session replay precisa provar no tribunal
Glossário

O que uma ação por grampo via session replay precisa provar no tribunal

Toda ação por grampo via session replay se apoia na CIPA 631, na WESCA ou no Wiretap Act federal. O que os autores alegam e o que os tribunais decidiram.

•9 min de leitura
O que a análise de experiência digital cobre e o web analytics perdeO que a análise de experiência digital cobre e o web analytics perde
Glossário

O que a análise de experiência digital cobre e o web analytics perde

Em vez de contar eventos, a análise de experiência digital reconstrói a visita, usando session replay, heatmaps, detecção de atrito e análise de jornada.

•8 min de leitura

Artigos relacionados