Skip to content

Feature/optimize delphi epoll#477

Merged
viniciussanchez merged 8 commits into
HashLoad:masterfrom
regyssilveira:feature/optimize-delphi-epoll
Jun 26, 2026
Merged

Feature/optimize delphi epoll#477
viniciussanchez merged 8 commits into
HashLoad:masterfrom
regyssilveira:feature/optimize-delphi-epoll

Conversation

@regyssilveira

Copy link
Copy Markdown
Contributor

🚀 perf(epoll): Otimizações Avançadas de E/S Vetorizada e Pooling Lock-Free (Phase 2)

Esta Pull Request introduz a Phase 2 de otimizações de nível de sistema e gerenciamento de memória para o provedor Epoll no Linux, eliminando contenções de contexto e permitindo que o Horse escale de forma linear sob cargas massivas de conexões simultâneas.


🛠️ O que foi feito?

  1. Thread-Local Buffer Pool (threadvar):
    • Substituição do gerenciamento de buffers global (que sofria de disputa extrema por travas/locks de seção crítica) por pools de buffers estáticos circulares locais a nível de thread worker.
    • Alocação e reuso de memória sem disputa de trancamentos (lock-free), permitindo escalabilidade linear com múltiplos núcleos de processamento.
  2. Zero-Allocation Headers Parser (CompareBytesCI):
    • Implementação de varredura direta via offsets de bytes (KeyStart, KeyLen, etc.) para catalogar os cabeçalhos diretamente no buffer cru do socket de leitura.
    • Evita alocação de objetos complexos e strings de cabeçalho na heap a cada ciclo de requisição.
  3. Escrita Vetorizada (writev) e Zero-Copy (sendfile):
    • Agrupamento de cabeçalhos e payload em uma única chamada de sistema usando a API writev do Linux.
    • Suporte a envio de arquivos direto do page-cache do kernel para a rede via sendfile (overhead de cópia de memória reduzido a zero).
  4. Desacoplamento do Reactor e Tuning do ThreadPool:
    • Execução de rotas despachada de forma assíncrona concorrente via TTask.Run no Delphi.
    • Configuração preventiva do Thread Pool padrão do Delphi (MaxWorkerThreads := 2048 e MinWorkerThreads := ProcessorCount * 8) para aniquilar o starvation de threads sob rajadas repentinas de novas conexões.

📊 Resultados do Benchmark de Carga Extrema

Os testes compararam o provedor padrão (Normal - Indy) contra o provedor assíncrono (Epoll) compilados nativamente com o compilador Delphi Linux64 (dcclinux64) no Ubuntu Linux 22.04 LTS (via Docker):

  • Total de Requisições: 20.000
  • Carga Concorrente: 1.000 conexões simultâneas consecutivas
  • Protocolo de Rede: HTTP/1.1 com Keep-Alive ativo
Critério de Comparação Provedor Indy (Normal) Provedor Epoll (Otimizado) Diferença / Ganho
Vazão (Throughput) Crashed (~245 req/s antes) 29.209,19 req/s Incomparável (Indy derrubada)
Latência Média Geral Crashed ( timeouts severos ) 34,23 ms Incomparável
Pior Latência (100%) Crashed 154 ms Incomparável
Erros de Conexão Falha Fatal / Queda do Servidor 0 falhas (100% sucesso) Epoll imune a picos concorrentes
Status da Execução Abortou na requisição 19.356 Finalizou com sucesso Robusto no laço de eventos

📈 Gráfico de Throughput (Requisições / Segundo - Mais é melhor)

Epoll Delphi (Otimizado)[██████████████████████████████████████████████████] 29.209 req/s
Normal Delphi (Indy)    [                                                  ]   Derrubado (Crashed)

@viniciussanchez viniciussanchez merged commit 4cbf96b into HashLoad:master Jun 26, 2026
@regyssilveira regyssilveira deleted the feature/optimize-delphi-epoll branch June 26, 2026 11:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants