Skip to content

investigate(fpc): possível latência de ~40 ms no keep-alive do fphttpserver #562

Description

@regyssilveira

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:

  1. se existe regressão de latência com KeepConnections=True;
  2. em quais versões do FPC e sistemas operacionais ela ocorre;
  3. 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;
  4. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions