Corrigir um servidor sobrecarregado

Como determinar o gargalo de um servidor, corrigir esse problema rapidamente, melhorar o desempenho e evitar regressões.

Katie Hempenius
Katie Hempenius

Visão geral

Este guia mostra como corrigir um servidor sobrecarregado em quatro etapas:

  1. Avaliar: determine o gargalo do servidor.
  2. Estabilizar: implementar correções rápidas para mitigar o impacto.
  3. Melhorar: aumentar e otimizar os recursos do servidor.
  4. Monitorar: use ferramentas automatizadas para evitar problemas futuros.

Avaliar

Quando o tráfego sobrecarrega um servidor, um ou mais dos seguintes itens podem se tornar um gargalo: CPU, rede, memória ou E/S de disco. Identificar qual deles é o gargalo permite concentrar os esforços nas mitigações mais impactantes.

  • CPU: o uso da CPU que está consistentemente acima de 80% precisa ser investigado e corrigido. O desempenho do servidor geralmente diminui quando o uso da CPU atinge cerca de 80% a 90% e se torna mais acentuado à medida que o uso se aproxima de 100%. O uso da CPU para atender a uma única solicitação é insignificante, mas fazer isso na escala encontrada durante picos de tráfego pode, às vezes, sobrecarregar um servidor. Transferir a veiculação para outra infraestrutura, reduzir operações caras e limitar a quantidade de solicitações vai reduzir o uso da CPU.
  • Rede: durante períodos de tráfego intenso, a capacidade de rede necessária para atender às solicitações dos usuários pode exceder a capacidade. Alguns sites, dependendo do provedor de hospedagem, também podem atingir limites de transferência cumulativa de dados. Reduzir o tamanho e a quantidade de dados transferidos de e para o servidor vai remover esse gargalo.
  • Memória: quando um sistema não tem memória suficiente, os dados precisam ser transferidos para o disco para armazenamento. O acesso ao disco é consideravelmente mais lento do que à memória, o que pode deixar um aplicativo inteiro mais lento. Se a memória ficar completamente esgotada, isso pode resultar em erros de memória insuficiente (OOM). Ajustar a alocação de memória, corrigir vazamentos de memória e fazer upgrade da memória pode remover esse gargalo.
  • E/S de disco: a taxa em que os dados podem ser lidos ou gravados no disco é limitada pelo próprio disco. Se a E/S do disco for um gargalo, aumentar a quantidade de dados armazenados em cache na memória pode aliviar esse problema (ao custo de um maior uso da memória). Se isso não funcionar, talvez seja necessário fazer upgrade dos discos.

As técnicas deste guia se concentram em resolver gargalos de CPU e de rede. Para a maioria dos sites, a CPU e a rede serão os gargalos mais relevantes durante um pico de tráfego.

Executar top no servidor afetado é um bom ponto de partida para investigar gargalos. Se disponível, complemente isso com dados históricos do seu provedor de hospedagem ou ferramenta de monitoramento.

Estabilizar

Um servidor sobrecarregado pode levar rapidamente a falhas em cascata em outras partes do sistema. Por isso, é importante estabilizar o servidor antes de tentar fazer mudanças mais significativas.

Limitação de taxa

A limitação de taxa protege a infraestrutura ao limitar o número de solicitações recebidas. Isso é cada vez mais importante à medida que o desempenho do servidor diminui: quando os tempos de resposta aumentam, os usuários tendem a atualizar a página de forma agressiva, o que aumenta ainda mais a carga do servidor.

Correção

Embora rejeitar uma solicitação seja relativamente barato, a melhor maneira de proteger seu servidor é lidar com a limitação de taxa em algum lugar upstream dele, por exemplo, usando um balanceador de carga, um proxy reverso ou uma CDN.

Instruções:

Para saber mais:

Armazenamento em cache HTTP

Procure maneiras de armazenar conteúdo em cache de forma mais agressiva. Se um recurso puder ser veiculado de um cache HTTP (seja o cache do navegador ou uma CDN), ele não precisará ser solicitado do servidor de origem, o que reduz a carga do servidor.

Cabeçalhos HTTP como Cache-Control, Expires e ETag indicam como um recurso precisa ser armazenado em um cache HTTP. Auditar e corrigir esses cabeçalhos vai melhorar o armazenamento em cache.

Embora os service workers também possam ser usados para armazenamento em cache, eles utilizam um cache separado e são um complemento, não um substituto, para o armazenamento em cache HTTP adequado. Por isso, ao lidar com um servidor sobrecarregado, os esforços devem se concentrar na otimização do armazenamento em cache HTTP.

Diagnóstico

Execute o Lighthouse e consulte a auditoria Veicular recursos estáticos com uma política de cache eficiente para ver uma lista de recursos com um time to live (TTL) de curto a médio prazo. Para cada recurso listado, considere se o TTL deve ser aumentado. Como orientação geral:

  • Os recursos estáticos precisam ser armazenados em cache com um TTL longo (1 ano).
  • Os recursos dinâmicos precisam ser armazenados em cache com um TTL curto (3 horas).

Correção

Defina a diretiva max-age do cabeçalho Cache-Control como o número apropriado de segundos.

Instruções:

degradação suave

A degradação gradual é a estratégia de reduzir temporariamente a funcionalidade para eliminar o excesso de carga de um sistema. Esse conceito pode ser aplicado de várias maneiras: por exemplo, veicular uma página de texto estática em vez de um aplicativo completo, desativar a pesquisa ou retornar menos resultados da pesquisa ou desativar determinados recursos caros ou não essenciais. É preciso priorizar a remoção de funcionalidades que podem ser removidas com segurança e facilidade, com o mínimo de impacto nos negócios.

Melhorar

Usar uma rede de fornecimento de conteúdo (CDN)

A veiculação de recursos estáticos pode ser transferida do seu servidor para uma rede de fornecimento de conteúdo (CDN), reduzindo a carga.

A principal função de uma CDN é fornecer conteúdo aos usuários rapidamente, oferecendo uma grande rede de servidores localizados perto deles. No entanto, a maioria das CDNs também oferece outros recursos relacionados ao desempenho, como compactação, balanceamento de carga e otimização de mídia.

Configurar uma CDN

As CDNs se beneficiam da escala, então raramente faz sentido operar sua própria CDN. Uma configuração básica de CDN é bastante rápida de configurar (~30 minutos) e consiste em atualizar os registros DNS para apontar para a CDN.

Otimizar o uso da CDN

Diagnóstico

Identifique os recursos que não estão sendo disponibilizados por uma CDN (mas deveriam estar) executando o WebPageTest. Na página de resultados, clique no quadrado acima de "Uso eficaz da CDN" para ver a lista de recursos que devem ser disponibilizados por uma CDN.

Seta apontando para o botão "Uso eficaz da CDN"
Resultados do WebPageTest

Correção

Se um recurso não estiver sendo armazenado em cache pela CDN, verifique se as seguintes condições foram atendidas:

Escalonar recursos de computação

A decisão de escalonar os recursos de computação precisa ser tomada com cuidado. Embora muitas vezes seja necessário escalonar os recursos de computação, fazer isso de forma prematura pode gerar complexidade arquitetônica e custos financeiros desnecessários.

Diagnóstico

Um Time to First Byte (TTFB) alto pode ser um sinal de que um servidor está se aproximando da capacidade máxima. Essas informações estão disponíveis na auditoria Reduzir os tempos de resposta do servidor (TTFB) do Lighthouse.

Para investigar mais, use uma ferramenta de monitoramento para avaliar o uso da CPU. Se o uso atual ou previsto da CPU exceder 80%, considere aumentar os servidores.

Correção

Adicionar um balanceador de carga permite distribuir o tráfego entre vários servidores. Um balanceador de carga fica na frente de um pool de servidores e encaminha o tráfego para o servidor apropriado. Os provedores de nuvem oferecem os próprios balanceadores de carga (GCP, AWS, Azure) ou você pode configurar o seu usando o HAProxy ou o NGINX. Depois que um balanceador de carga é implementado, é possível adicionar outros servidores.

Além do balanceamento de carga, a maioria dos provedores de nuvem oferece escalonamento automático (GCP, AWS, Azure). O escalonamento automático funciona em conjunto com o balanceamento de carga, aumentando e diminuindo automaticamente os recursos de computação de acordo com a demanda em um determinado momento. Dito isso, o escalonamento automático não é mágico: leva tempo para que novas instâncias fiquem on-line e ele requer uma configuração significativa. Devido à complexidade adicional que o escalonamento automático envolve, uma configuração mais simples baseada em balanceador de carga deve ser considerada primeiro.

Ativar compactação

Os recursos baseados em texto precisam ser compactados usando gzip ou brotli. O Gzip pode reduzir o tamanho da transferência desses recursos em cerca de 70%.

Diagnóstico

Use a auditoria Ativar compactação de texto do Lighthouse para identificar os recursos que precisam ser compactados.

Correção

Ative a compactação atualizando a configuração do servidor. Instruções:

Otimizar imagens e mídia

As imagens representam a maior parte do tamanho do arquivo da maioria dos sites. Otimizar as imagens pode reduzir o tamanho de um site de forma rápida e significativa.

Diagnóstico

O Lighthouse tem várias auditorias que sinalizam possíveis otimizações de imagem. Outra estratégia é usar o DevTools para identificar os maiores arquivos de imagem, que provavelmente serão bons candidatos para otimização.

Auditorias relevantes do Lighthouse:

Fluxo de trabalho do Chrome DevTools:

Correção

Se você tiver pouco tempo…

Concentre seu tempo em identificar imagens grandes e carregadas com frequência e otimizá-las manualmente com uma ferramenta como o Squoosh. As imagens principais costumam ser boas candidatas para otimização.

Alguns lembretes:

  • Tamanho: as imagens não podem ser maiores do que o necessário.
  • Compactação: em geral, um nível de qualidade de 80 a 85 terá um efeito mínimo na qualidade da imagem, mas reduzirá o tamanho do arquivo em 30% a 40%.
  • Formato: use JPEGs para fotos em vez de PNGs e MP4 para conteúdo animado em vez de GIFs.

Se você tiver mais tempo…

Configure uma CDN de imagem se as imagens representarem uma parte significativa do seu site. As CDNs de imagem são projetadas para veicular e otimizar imagens, além de descarregar a veiculação de imagens do servidor de origem. Configurar uma CDN de imagem é simples, mas exige a atualização dos URLs de imagem atuais para que apontem para a CDN de imagem.

Para saber mais:

Minificar JS e CSS

A minificação remove caracteres desnecessários do JavaScript e do CSS.

Diagnóstico

Use as auditorias Minificar CSS e Minificar JavaScript do Lighthouse para identificar recursos que precisam de minificação.

Correção

Se você tiver pouco tempo, concentre-se em minificar o JavaScript. A maioria dos sites tem mais JavaScript do que CSS, então isso terá um impacto maior.

Monitoramento

As ferramentas de monitoramento de servidores oferecem coleta de dados, painéis e alertas sobre o desempenho do servidor. O uso deles pode ajudar a evitar e mitigar problemas futuros de desempenho do servidor.

Uma configuração de monitoramento precisa ser o mais simples possível. A coleta de dados e os alertas excessivos têm custos: quanto maior o escopo ou a frequência da coleta de dados, mais caro é coletar e armazenar. Além disso, o excesso de alertas inevitavelmente leva a páginas ignoradas.

Os alertas precisam usar métricas que detectem problemas de forma consistente e precisa. O tempo de resposta do servidor (latência) é uma métrica que funciona muito bem para isso: ele detecta uma grande variedade de problemas e se correlaciona diretamente com a experiência do usuário. Os alertas baseados em métricas de nível inferior, como o uso da CPU, podem ser um complemento útil, mas vão detectar um subconjunto menor de problemas. Além disso, os alertas precisam ser baseados no desempenho observado na cauda (em outras palavras, os percentis 95 ou 99), e não em médias. Caso contrário, as médias podem facilmente ocultar problemas que não afetam todos os usuários.

Correção

Todos os principais provedores de nuvem oferecem as próprias ferramentas de monitoramento (GCP, AWS, Azure). Além disso, o Netdata é uma excelente alternativa sem custo financeiro e de código aberto. Independentemente da ferramenta escolhida, você precisará instalar o agente de monitoramento dela em cada servidor que quiser monitorar. Depois de concluir, configure os alertas.

Instruções: