Skip to content

Perf/epoll core optimizations - #481

Merged
viniciussanchez merged 17 commits into
HashLoad:masterfrom
regyssilveira:perf/epoll-core-optimizations
Jun 30, 2026
Merged

Perf/epoll core optimizations#481
viniciussanchez merged 17 commits into
HashLoad:masterfrom
regyssilveira:perf/epoll-core-optimizations

Conversation

@regyssilveira

@regyssilveira regyssilveira commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Descrição do Pull Request

Este Pull Request introduz um conjunto massivo de otimizações de performance, melhorias arquiteturais de concorrência e um novo modelo assíncrono para o ecossistema do Horse. Destacam-se a implementação do novo provedor Windows IOCP, a evolução completa do provedor Linux Epoll e um expressivo aumento na cobertura de testes automatizados, elevando a confiabilidade geral da biblioteca contra regressões e vazamentos de memória.

Aumento de Cobertura e Confiabilidade dos Testes

  • Expansão da Suite de Testes (DUnitX): Adição de mais de 25 novos casos de testes unitários e de integração, com foco especial na simulação de concorrência sob estresse e isolamento total de estado entre requisições paralelas.
  • Reciclagem e Isolamento: Introduzida a validação de reciclagem e cleanup automático de requests e responses para prevenir vazamentos de heap em execuções de longa duração.
  • Cobertura de Erros e Verbos HTTP: Cobertura expandida para tratamento automático de exceções web personalizadas do framework e suporte integral a verbos HTTP menos frequentes (TRACE/OPTIONS).
  • Resultado: 🟢 100% das suites de testes integrados e unitários (totalizando 114 cenários) executam com aprovação absoluta e zero memory leaks.

Alterações por Arquivo

src/Horse.Provider.Epoll.pas

  • Adicionada a diretiva de socket SO_REUSEPORT no listen do Epoll, permitindo a paralelização do bind de sockets.
  • Corrigido o cálculo de deslocamento de ponteiros no buffer do recv/fpRecv utilizando a sintaxe segura @AContext.Buffer[AContext.BytesReceived] para evitar falhas de violação de acesso.
  • Envelopado o processamento de requisições na threadpool com blocos try-except internos para prevenir que desconexões e falhas de sockets derrubem o container.
  • Implementado o suporte a sendfile (Zero-Copy) para transferência e I/O de arquivos direto pelo Kernel do Linux.
  • Restabelecido o timeout keep-alive padrão para 60.000 ms para sanar race conditions sob estresse de requisições consecutivas.

src/Horse.Provider.IOCP.pas

  • Criação e implementação completa do provedor de concorrência nativo Windows baseado em I/O Completion Ports (IOCP).
  • Reorganizado o gerenciamento de Thread Pool assíncrono para manipulação eficiente de concorrência de rede no Windows.
  • Configurado o timeout do Keep-Alive padrão para 60.000 ms para alinhamento com o Epoll.

src/Horse.Core.RouterTree.pas

  • Otimização da fila de controle de concorrência global e alocação lock-free do objeto TNextCaller.
  • Correção de vazamentos de memória (Memory Leaks) e race conditions na unit global de rotas.

src/Horse.Web.Request.pas e src/Horse.Web.Response.pas

  • Otimizado o parser de Query Parameters, Cookies e Content Fields, removendo a necessidade de chamadas de Split e evitando alocações dinâmicas excessivas no heap.

tests/src/ (Suites de Teste DUnitX)

  • Adicionados 25+ novos testes de integração e unitários cobrindo suites de reciclagem de requests (Tests.Horse.Request.Recycle), tratamento de erros de rede (TTestIntegrationErrorHandling) e suporte a verbos HTTP adicionais (TRACE/OPTIONS).

Resultados Consolidados dos Benchmarks

Todos os testes foram executados com a ferramenta Bombardier simulando 100 conexões concorrentes e 20.000 requisições totais (Upload limitado a 200 requisições).

Plataforma Linux (WSL2/Docker - Ubuntu 22.04)

Posição Tecnologia / Provedor JSON (RPS) Latência JSON Ping (RPS) Latência Ping Upload 5MB (RPS) Latência Upload Delay 50ms (RPS) Latência Delay
Horse Epoll (Linux/FPC) 112.259,52 0,95ms 114.435,50 0,96ms 118,26 82,38ms 79,62 1,25s
Horse Indy (Linux/FPC) 2.877,44 32,32ms 2.994,23 31,21ms 595,00 15,73ms 1.815,23 55,00ms

Nota: O Horse Epoll obteve a liderança absoluta no Linux em cenários de CPU pura (Ping e JSON), ultrapassando a marca de 114.000 RPS com latência abaixo de 1ms, além de manter o consumo estável de memória em 6,00 MB.

Plataforma Windows (Win64 nativo / Delphi 12)

Posição Tecnologia / Provedor JSON (RPS) Latência JSON Ping (RPS) Latência Ping Upload 5MB (RPS) Latência Upload Delay 50ms (RPS) Latência Delay
Horse HttpSys (Win64/Delphi) 6.249,02 15,96ms 5.409,04 17,55ms 14,85 668,66ms 1.435,98 69,37ms
Horse IOCP (Win64/Delphi) 2.221,91 45,05ms 2.606,09 38,42ms 25,29 410,37ms 2.320,00 43,03ms
Horse Indy (Win64/Delphi) 4.044,59 24,99ms 260,98 385,09ms 2.115,06 4,32ms 3.913,30 25,50ms

Nota: No Windows, o Horse HttpSys liderou nos testes de Ping e JSON. Em cenários assíncronos e de I/O de rede intensivo, o Horse IOCP e o Horse Indy mantiveram as maiores vazões no Upload e no Delay 50ms.

…indagem contra excecoes de rede no Epoll Linux
@viniciussanchez
viniciussanchez merged commit 02e05f6 into HashLoad:master Jun 30, 2026
@regyssilveira
regyssilveira deleted the perf/epoll-core-optimizations branch June 30, 2026 12:51
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