...

Porque é que os pedidos HTTP podem bloquear mesmo que existam recursos suficientes disponíveis

Os pedidos HTTP podem bloquear mesmo que a CPU, a RAM e a largura de banda pareçam estar abertas, porque os limites invisíveis, os filtros e as filas têm efeito ao longo de toda a cadeia. Eu explico onde Limites como funcionam e que definições defino para que os pedidos voltem a funcionar sem problemas.

Pontos centrais

Antes de entrar em pormenores, vou resumir as causas mais importantes e indicar o que procuro em primeiro lugar. Estes pontos abrangem os estrangulamentos típicos que levam ao congestionamento apesar dos recursos livres. Mantive a lista deliberadamente compacta para que possa verificar imediatamente os pontos de partida. O ponto principal é que cada camada tem suas próprias regras que se aplicam independentemente da CPU e da RAM. Se conhecer estas regras, pode resolver rapidamente muitos tempos de espera „inexplicáveis“.

  • Limites dos trabalhadoresDemasiados poucos processos/threads bloqueiam novas ligações apesar da CPU livre.
  • Camada de segurançaOs filtros WAF/web bloqueiam padrões, métodos ou clientes, muitas vezes sem uma carga elevada.
  • ConcorrênciaO PHP-FPM, a base de dados e os proxies limitam as sessões simultâneas.
  • Manter em espera/tempo limiteAs ligações longas ocupam as faixas horárias, os pedidos ficam em fila de espera.
  • Filtro de clienteAs extensões do navegador param os pedidos antes de chegarem ao servidor.

Estes pontos-chave são muitas vezes suficientes para verificar o comportamento de uma forma direcionada. De seguida, mostro-lhe como extraio medidas específicas destes pontos e Bloqueios de forma limpa.

Porque é que os pedidos HTTP bloqueiam apesar dos recursos livres

Um pedido passa por vários níveis: Cliente, rede, filtro, servidor Web, ambiente de execução e base de dados. Cada camada tem o seu próprio Limites que têm efeito independentemente da CPU, RAM ou largura de banda. Se os slots de trabalho estiverem ocupados ou as regras estiverem activas, o pedido aguarda numa fila ou é imediatamente cancelado. Este tempo de espera muitas vezes não aparece de todo nos diagramas de recursos clássicos. É precisamente isto que leva à ideia errada de que o servidor está „vazio“, mesmo que os pedidos não estejam a ser respondidos.

Camada de segurança: WAF, filtros e regras do fornecedor

Muitos bloqueios ocorrem antes mesmo de a aplicação estar a funcionar. As firewalls de aplicações Web, os IDS/IPS e os filtros do lado do fornecedor reconhecem padrões e tornam-nas mais lentas ou bloqueiam-nas [1][5][9]. Parâmetros suspeitos, protocolos antigos ou combinações de métodos são suficientes para causar um Bloqueio para acender. Do ponto de vista do operador, isto parece um erro do servidor, mas a decisão é tomada „a montante“. Por isso, verifico os registos do WAF e anoto o ID do pedido, o IP, a hora e o código de estado. Com estes dados, a regra pode ser identificada e ajustada de uma forma direcionada sem comprometer a segurança.

Do lado do cliente: extensões do browser e bloqueadores locais

Nem todos os pedidos chegam ao servidor. Os bloqueadores de anúncios, os gestores de palavras-passe e os bloqueadores de scripts já bloqueiam os URL no browser; as DevTools mostram então „Requests to the Server Have Been Blocked by an Extension“ [3][7]. Faço o teste numa janela privada, desativo as extensões e verifico se o Pedido foi enviado de todo. Também ajuda a controlar as prioridades no front end, por exemplo, com um Priorização de pedidos para activos críticos. Isto evita que as chamadas não críticas de terceiros atrasem os percursos importantes.

Método de compreensão e encaminhamento: 405, 403, 429

Um 405 „Method Not Allowed“ mostra claramente que o servidor reconhece o recurso mas não permite o método utilizado [5]. Da mesma forma, 403 indica filtros ou direitos e 429 limitação de taxa ativa. Nos registos, posso reconhecer rapidamente se uma regra global permite métodos como PUT ou DELETE ou se um ponto final nunca foi implementado. De seguida, ajusto o encaminhamento, o controlador ou a regra WAF. Desta forma, o suposto „bloqueio“ dissolve-se numa correção limpa de métodos e caminhos.

Arquitetura do servidor Web e limites do trabalhador

O Apache, o NGINX, o LiteSpeed e o OpenLiteSpeed tratam as ligações de forma diferente [4]. Os factores decisivos são o número de processos de trabalho, as threads e a forma como os sockets keep-alive ocupam as ranhuras. Se todos os workers estiverem ocupados por conexões longas, os novos pedidos são movidos para um Fila de espera, embora a CPU e a RAM pareçam livres. Por isso, analiso os estados das ligações e ajusto os trabalhadores, os atrasos e os tempos de permanência. O conhecimento prévio de filas de espera ajuda, por exemplo, com o tópico de Fila de espera do servidor e latência.

camada Limite relevante Sintoma típico Nota de diagnóstico
Servidor Web Contagem de trabalhadores/thread Filas de espera, 503 em carga Módulos de estado, verificar o estado das ligações
PHP-FPM/FastCGI max_children / pm Pedidos pendentes, tempo elevado até ao primeiro byte Registos FPM, registo lento, número de processos
Base de dados max_conexões Erro „Demasiadas ligações“ SHOW PROCESSLIST, picos de ligação
WAF/Filtro Assinaturas, métodos 403/405, mensagens de formulário quebradas Registos WAF, IDs de acerto de regras
Balanceador de carga Limite por backend-conexão Tempos de resposta inconsistentes LB-Stats, Backend-Health

Concorrência em PHP-FPM, base de dados e proxies

O processamento simultâneo geralmente explode primeiro no ambiente de tempo de execução. Se todos os workers do PHP FPM estiverem ocupados, não há espaço disponível para novos scripts; os pedidos esperam, embora o CPU dificilmente funciona. A situação é semelhante para bases de dados com max_connections ou para proxies com limites de ligação por backend. Primeiro, optimizo a duração dos pedidos individuais antes de aumentar os limites. Desta forma, encurto o tempo do documento por slot e reduzo a probabilidade de as filas crescerem.

Backends lentos e bloqueio de sessão PHP

Consultas longas a bases de dados, APIs externas ou E/S de ficheiros atrasam significativamente os trabalhadores. O bloqueio de sessão também pode tornar cadeias inteiras mais lentas, como logins no WordPress ou carrinhos de compras. Verifico se os pedidos paralelos para o mesmo ID de sessão são executados consecutivamente em vez de simultaneamente. Se for o caso, confio no desbloqueio direcionado, reduzo os acessos críticos de gravação e sigo instruções testadas e comprovadas na página Bloqueio de sessão PHP. Isto permite-me libertar mais rapidamente as faixas horárias e reduzir Tempos de espera percetível.

Timeouts, keep-alive e estratégias de ligação

Os tempos de permanência demasiado longos consomem recursos, enquanto os demasiado curtos geram handshakes e latência. Escolho valores que correspondem ao perfil de tráfego e defino limites para os tempos limite do cabeçalho, do corpo e do backend. É importante definir timeouts não apenas no Servidor Web mas normalizado ao longo da cadeia: proxy, aplicação, base de dados. Além disso, evito o bloqueio de inatividade através de definições HTTP/2/HTTP/3 mais precisas e da definição de prioridades. Isto mantém as faixas horárias disponíveis sem que os clientes tenham de se voltar a ligar constantemente.

Modelos de alojamento: Partilhado, VPS, Dedicado

O alojamento partilhado estabelece filtros iniciais e quotas rígidas para que a plataforma se mantenha justa [1]. Nos VPS, os fornecedores isolam a CPU e a RAM, mas mantêm limites para E/S, rede ou segurança; as diferenças de desempenho e monitorização são claras [10]. Nos servidores dedicados, sou totalmente responsável pela configuração do servidor Web, da base de dados e do WAF. As comparações mostram que as pilhas modernas com HTTP/3, NVMe e proteção DDoS oferecem vantagens claras [2][6][11][8]. Aqueles que precisam de alto paralelismo se beneficiam de uma documentação clara Limites e apoio, o que ajuda as unidades de regras.

Análise sistemática: passo a passo

Começo pela fonte: o DevTools está realmente a enviar o pedido, ou é uma extensão [3][7] que o está a bloquear? Depois olho para os códigos de estado: 403/405/429/503 dão fortes indicações de filtros, métodos ou capacidade [5]. Ao mesmo tempo, verifico os registos do servidor Web, da aplicação e do WAF para encontrar padrões e assinaturas recorrentes [1][9]. Em seguida, verifico o número de trabalhadores, os parâmetros FPM, as ligações keep-alive e à base de dados e aumento os limites numa base de teste com pontos de medição antes e depois. Por fim, simulo a carga, observo os estrangulamentos em tempo real e verifico se o Filas de espera psiquiatra.

Melhores práticas contra bloqueios

Formulo objectivos de simultaneidade por camada e estabeleço limites para que os picos de carga sejam amortecidos. O servidor Web deve corresponder ao padrão de tráfego; os parâmetros de referência ajudam na seleção e configuração [4]. Em primeiro lugar, optimizo os backends do ponto de vista lógico: consultas mais rápidas, transacções mais curtas, menos secções em série. Mantenho as regras de segurança suficientemente rigorosas contra os ataques, mas com excepções para os ataques legítimos Amostra. A monitorização não se limita à CPU/RAM: analiso as ligações, as filas de espera, os tempos de resposta e os códigos de erro para que os estrangulamentos permaneçam visíveis [6][11].

Notas práticas: alojamento de bloqueio de pedidos

Em ambientes partilhados, os bloqueios acabam muitas vezes antes do espaço Web real; o suporte precisa então de dados de pedidos específicos para ajustar as regras [1]. No VPS, faço a escalada gradualmente: mais trabalhadores, valores de keep-alive mais adequados e monitorização mais próxima da base de dados [10]. No meu próprio hardware, decido o balanceamento de carga, as regras WAF e os limites por backend. Os projectos com acesso altamente paralelo beneficiam de uma configuração HTTP/2/HTTP/3 limpa e de reservas claras para Dicas. Se prevê um crescimento, planeie a mudança para tarifas mais potentes desde o início e poupe muito esforço de afinação mais tarde [2][6][10][11].

Limites da rede e do kernel: atraso, portas e descritores

Para além do servidor Web e da aplicação, o kernel limita o número de ligações que podem chegar, ser estabelecidas e geridas ao mesmo tempo. Primeiro verifico o Lista de pendênciasMesmo que o servidor web tenha muitos trabalhadores, a fila de aceitação pode ser curta. A interação entre a aplicação (listen backlog), o kernel (somaxconn) e o SYN backlog (tcp_max_syn_backlog) determina se as ligações permanecem na fila ou são descartadas. Os sintomas são o aumento dos tempos de conexão e retransmissões - com baixa utilização da CPU. Eu comparo os valores e meço a utilização real das filas para evitar quedas.

Outro clássico é o mesa de apoio para configurações NAT/firewall. Se estiver cheio, as ligações desaparecem „sem deixar rasto“; a aplicação nunca vê um pedido. Reconheço este facto através de mensagens no registo do sistema e de timeouts súbitos durante picos de carga. As contramedidas são: tamanho adequado da tabela, tempos de inatividade realistas para protocolos, menos caminhos NAT desnecessários e keep-alives eficientes que reutilizam conexões de forma sensata.

Também verifico o número de Descritores de ficheiros (ulimit -n). Se muitos sockets e ficheiros simultâneos atingirem os limites restritivos, o Accept falha („demasiados ficheiros abertos“) e novos pedidos acumulam-se à sua frente. A solução é normalmente trivial: definir os limites de nofile para o servidor web, proxy e base de dados para um nível saudável - e torná-los persistentes, não apenas interactivos.

Em configurações fortemente paralelas, observo a Gama de portas efémeras e TIME_WAIT-estados. Especialmente atrás de gateways NAT, as portas de origem disponíveis são esgotadas quando conexões curtas são estabelecidas em massa. Portanto, eu confio na reutilização de conexões (keep-alive, HTTP/2/3), reduzo conexões desnecessárias de curta duração e ajusto o tratamento de TIME_WAIT cuidadosamente sem arriscar a estabilidade. O resultado: menos exaustão de portas e tempos de conexão mais estáveis sob carga.

Na placa de rede, verifico os comprimentos das filas, as configurações de descarregamento e a distribuição de IRQ. Interrupções distribuídas de forma desigual ou filas sobrecarregadas geram picos de latência que não são perceptíveis nos registos da aplicação. Com um balanceamento equilibrado de IRQ e configurações sensatas de Qdisc (palavra-chave Bufferbloat), reduzo a latência sem restringir a largura de banda.

HTTP/2 e HTTP/3: Utilizar a multiplexagem corretamente

A multiplexagem resolve muitos problemas, mas traz novos limites: Número máximo de fluxos, A janela de controlo do fluxo e os tempos de inatividade aplicam-se por ligação. Se o valor dos fluxos simultâneos for demasiado baixo, os novos pedidos ficam „suspensos“, apesar de a ligação TCP ou QUIC estar estabelecida. Por isso, verifico quantos recursos críticos precisam de ser carregados em paralelo e ajusto cuidadosamente os limites dos fluxos. Simultaneamente, presto atenção a Controlo do fluxo-para que as respostas de grande dimensão não sejam limitadas.

O multiplexador HTTP/2 sobre TCP pode sofrer bloqueio de cabeça de linha em caso de perda de pacotes; o HTTP/3 sobre QUIC evita isso, mas requer configurações TLS/ALPN limpas e regras estáveis de manuseio de caminho. Eu testo ambos os caminhos e selecciono os protocolos que correspondem ao perfil de tráfego. Importante: não confie cegamente na priorização - os navegadores e os servidores interpretam-na de forma diferente. Concentro-me nas rotas críticas e verifico se as prioridades estão realmente a funcionar e se os slots não estão a ser ocupados por fluxos secundários de longa duração.

CORS, pré-voo e limites de cabeçalho/corpo

Nem todos os erros 4xx provêm do servidor. Infracções CORS ocorrem no navegador e aparecem na consola, não no registo de acesso. Verifico se os pedidos de preflight (OPTIONS) são respondidos corretamente e se os WAF/proxies permitem este método. Se faltarem cabeçalhos como Access-Control-Allow-Methods/-Headers, o browser „bloqueia“ a resposta - sem qualquer carga no servidor.

Outro estrangulamento: Tamanhos de cabeçalhos e de cookies. Cookies muito grandes, muitos cabeçalhos Vary ou grandes linhas de referência levam a erros 431 ou quedas silenciosas devido a limites de buffer. Limito o lastro de cookies, consolido cabeçalhos e defino tamanhos de buffer de forma consistente ao longo da cadeia. Para uploads, presto atenção aos limites do corpo, manuseio 100-continue e consistente Codificação fragmentada-Suporte para todos os proxies. Se o corpo e os limites de carregamento não corresponderem, os clientes esperam por uma libertação que nunca chega - os pedidos parecem „pendurar“.

DNS e TLS: Handshakes como latência oculta

A resolução de DNS e a negociação de TLS são pontos cegos frequentes. Várias cadeias CNAME, resolvedores lentos ou incompatibilidade IPv6/IPv4 prolongam o tempo de início sem usar a CPU. Reduzo os saltos DNS desnecessários, defino TTLs sensatos e asseguro caminhos de resolução rápidos. No lado do TLS, verifico as cadeias de certificados, os conjuntos de cifras activados, o agrafamento OCSP e o reinício da sessão. Um aperto de mão ALPN limpo evita downgrades para HTTP/1.1, que colocam uma maior pressão nas ranhuras keep-alive. Resultado: menor tempo até ao primeiro byte e paralelismo mais estável, especialmente em redes móveis.

CDN/Edge: Caching, limites de taxa e reputação de IP

Entre o cliente e a origem, as CDN, os proxies inversos e os sistemas de proteção contra DDoS decidem sobre Bueiro e acelerador. Verifico se as rotas críticas são armazenadas em cache corretamente (stale-while-revalidate, stale-if-error) e se as caches negativas retêm os erros mais tempo do que o necessário. Os limites de taxa, a gestão de bots e a reputação de IP podem reduzir o tráfego legítimo, especialmente com redes partilhadas ou acesso intenso à API. Segmento o tráfego (por exemplo, API vs. ativos), defino chaves de cache claras e desarmo regras seletivamente para clientes confiáveis. Isso alivia a carga no Origin e evita que as filas de CDN cresçam enquanto o servidor parece „subutilizado“.

Contentores e orquestração: cgroups, Ingress e conntrack

Nos contentores, aplicar limites do cgroup para CPU, RAM, pids e arquivos. Uma quota de CPU muito apertada leva à limitação: os processos esperam pelo tempo de CPU mesmo que o host esteja livre. Eu verifico as cotas e me certifico de que os pods ingress/proxy tenham descritores de arquivos e buffers suficientes. No Kubernetes, verifico os tempos limite de entrada, as sondas de prontidão/vivacidade e as implementações de serviço (IPVS), porque sondas ou tempos limite defeituosos geram latência em ziguezague e reinicializações desnecessárias.

Um estrangulamento frequentemente ignorado é o Capacidade NAT/contra-caminho por nó. Muitas conexões de curta duração (por exemplo, saída para APIs externas) preenchem a tabela conntrack e, em seguida, as solicitações „desaparecem“ na rede. Eu dimensiono a tabela, defino timeouts realistas e agrupo chamadas externas para que menos conexões novas sejam criadas. Planeio PodDisruptionBudgets, actualizações contínuas e escalonamento HPA de forma a que nenhuma capacidade seja deduzida do agendador em alturas de pico - caso contrário, formam-se filas, mesmo que a aplicação teoricamente teria trabalhadores suficientes.

Observabilidade: correlação, rastreio e métricas significativas

Para encontrar rapidamente os bloqueios, preciso de Correlação contínua. Atribuo IDs de pedido (por exemplo, traceparent) ao edge, ao servidor Web, à aplicação e à base de dados e escrevo-os nos registos. Isto permite-me ver se um pedido falha no WAF, se está à espera no servidor Web, se está preso na fila do FPM ou se está bloqueado na base de dados. Eu trabalho com Histogramas em vez de valores médios puros e monitorizo a latência P95/P99, as ligações abertas, a fila de aceitação, o comprimento da fila FPM, as sessões de BD activas e os códigos de erro do backend. Também utilizo verificações sintéticas para separar claramente os efeitos do lado do cliente dos efeitos do lado do servidor.

Para as anomalias, utilizo um Pesquisa-O procedimento: primeiro os registos edge/WAF, depois o balanceador de carga, depois o acesso/erro do servidor Web, depois os registos da aplicação e do FPM e, por fim, os registos da BD e do sistema. Este caminho mostra-me exatamente onde o tempo é perdido e em que limite o pedido pára. Com métricas direcionadas por camada, evito intuições e reduzo drasticamente o tempo até à causa principal.

Manual e lista de verificação do Tuning

Na prática, tenho um manual compacto que adapto ao ambiente:

  • Reprodutibilidade: Determinar o cenário (rota, método, tamanho, cliente), registo de data e hora e IDs.
  • Verificar camada por camadaBrowser/Extensões, CORS/Preflight, WAF-Hits, LB-Stats, Webserver-Status, FPM-Queue, DB-Active/Locks.
  • Tornar as filas visíveisRegisto de aceitação/SYN, fila de escuta FPM, registo de proxy, pool de ligações DB.
  • Sincronizar limitesWorker/threads, somaxconn, nofile, max_connections, limites de stream para H2/H3, limites de body/header, timeouts.
  • Reduzir o tempo de ocupaçãoAcelere as consultas, evite bloqueios de sessão, reduza a E/S, comprima as respostas e coloque-as em cache de forma sensata.
  • Harmonizar as estratégiasDuração do Keep-Alive, parametrização do HTTP/2/3, atribuição de prioridade a rotas críticas.
  • Ajustar a segurançaExclusão direcionada de regras WAF em vez de enfraquecimento global; registo com IDs de sucesso.
  • EscalonamentoDefinir a simultaneidade por turno, efetuar testes de carga, medir as reservas, aumentar os limites apenas após a otimização.
  • RecuosDisjuntor para backends lentos, política de repetição com jitter, „stale-if-error“ para activos críticos.

Brevemente resumido

Os pedidos bloqueados com CPU e RAM livres são normalmente causados por limites, filtros e estratégias de ligação - e não por falta de desempenho. Em primeiro lugar, verifico onde pára o pedido: navegador, WAF, servidor Web, tempo de execução ou base de dados. Em seguida, minimizo os tempos de ocupação por slot, removo os Fechaduras e defino tempos limite realistas. Mantenho a segurança elevada, ajusto as regras contra falsos alarmes e recolho provas nos registos. Com esta abordagem, os pedidos HTTP permanecem acessíveis de forma fiável, mesmo quando o tráfego aumenta e cada segundo conta.

Artigos actuais