Contexto
O PR #554 relatou uma possível regressão de desempenho no provider padrão do FPC após a ativação de conexões persistentes no fphttpserver: aproximadamente 40–44 ms adicionais por requisição sequencial em uma mesma conexão.
A observação merece investigação, mas a causa ainda não foi demonstrada de forma conclusiva. A implementação proposta no PR removia o keep-alive, introduzia TCP_NODELAY e aceitava o fechamento silencioso de conexões HTTP/1.1, criando riscos de ECONNRESET para clientes com pool.
Objetivo
Determinar de forma reproduzível:
- se existe regressão de latência com
KeepConnections=True;
- em quais versões do FPC e sistemas operacionais ela ocorre;
- se o atraso está no
Socket.CanRead(KeepConnectionTimeout), no padrão de escrita da resposta, em Nagle/delayed ACK ou em outra parte do fphttpserver;
- se a correção deve ser feita no Horse ou enviada ao FPC upstream.
Reprodutor necessário
O teste deve:
- usar um cliente TCP bruto ou outro cliente cuja reutilização possa ser comprovada;
- enviar várias requisições HTTP/1.1 sequenciais pelo mesmo socket;
- registrar no servidor um identificador da conexão para confirmar que não houve reconexão;
- comparar keep-alive ligado e desligado na mesma execução;
- medir distribuição/mediana da latência, sem reprovar por um limite absoluto de milissegundos;
- executar também um cenário com requisições já disponíveis no socket;
- validar os headers
Connection e o comportamento após o fechamento;
- testar um cliente com pool para detectar reutilização de socket obsoleto e
ECONNRESET.
Diagnóstico recomendado
- Capturar as syscalls com
strace para medir a duração real de select/poll/leitura/escrita.
- Capturar o tráfego com Wireshark ou
tcpdump para verificar delayed ACK e segmentação.
- Testar
TCP_NODELAY isoladamente, sem alterar simultaneamente o keep-alive.
- Comparar FPC 3.2.2, 3.3.1/trunk e a versão estável mais recente disponível.
- Repetir em loopback e em uma conexão não-loopback/container.
Critérios para uma correção no Horse
Uma eventual correção não deve:
- desabilitar keep-alive silenciosamente para todas as aplicações;
- fechar uma resposta HTTP/1.1 sem comunicar
Connection: close;
- substituir callbacks existentes como
OnAllowConnect;
- depender de limites absolutos de tempo em testes;
- misturar
TCP_NODELAY sem evidência de que ele faz parte da causa.
Se o atraso for confirmado dentro do fphttpserver, devemos abrir um relatório mínimo no projeto FPC e acompanhar a correção upstream.
Contexto
O PR #554 relatou uma possível regressão de desempenho no provider padrão do FPC após a ativação de conexões persistentes no
fphttpserver: aproximadamente 40–44 ms adicionais por requisição sequencial em uma mesma conexão.A observação merece investigação, mas a causa ainda não foi demonstrada de forma conclusiva. A implementação proposta no PR removia o keep-alive, introduzia
TCP_NODELAYe aceitava o fechamento silencioso de conexões HTTP/1.1, criando riscos deECONNRESETpara clientes com pool.Objetivo
Determinar de forma reproduzível:
KeepConnections=True;Socket.CanRead(KeepConnectionTimeout), no padrão de escrita da resposta, em Nagle/delayed ACK ou em outra parte dofphttpserver;Reprodutor necessário
O teste deve:
Connectione o comportamento após o fechamento;ECONNRESET.Diagnóstico recomendado
stracepara medir a duração real deselect/poll/leitura/escrita.tcpdumppara verificar delayed ACK e segmentação.TCP_NODELAYisoladamente, sem alterar simultaneamente o keep-alive.Critérios para uma correção no Horse
Uma eventual correção não deve:
Connection: close;OnAllowConnect;TCP_NODELAYsem evidência de que ele faz parte da causa.Se o atraso for confirmado dentro do
fphttpserver, devemos abrir um relatório mínimo no projeto FPC e acompanhar a correção upstream.