Feature/linux epoll provider#142
Merged
cesarliws merged 41 commits intoJun 26, 2026
Merged
Conversation
… Linux epoll provider
…lation, and response buffering in Epoll
…nt epoll network buffering
…eset on Linux Epoll
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🚀 PR: Provedor Linux Epoll de Ultra-Performance para o Dext
📝 Descrição
Este PR introduz o novo provedor de servidor nativo para Linux baseado na API de sinalização de eventos Epoll do kernel Linux. A implementação foi focada em obter vazão máxima com latência ultra-baixa, adotando conceitos de Zero-Object e Zero-Allocation na camada crítica de parsing HTTP e despacho vetorizado de IO.
🛠️ Principais Mudanças e Arquitetura
1. Zero-Object & Zero-Allocation Parser (Dext.Server.Epoll.pas)
THeaderSegmentpara indexar a posição e limites (Start,Length) de cada chave e valor de cabeçalho diretamente sobre o buffer bruto de bytes da requisição.TDictionary) no loop do parser por um array dinâmico nativo de registros (TArray<THeaderSegment>). O parser agora não aloca nenhuma instância de classe a cada request.CompareBytesCI). A decodificação de cabeçalhos de controle (comoContent-Length) foi reescrita para fazer a conversão numérica caractere por caractere diretamente dos bytes, sem alocar strings intermediárias.2. Escrita Vetorizada com Chamada de Sistema
writevTDextEpollResponse) para acumular os buffers de cabeçalho e corpo da resposta.writevdo Linux utilizando uma estruturaiovec, reduzindo o número de chamadas de sistema na rede de duas para uma por requisição.3. Reactor Desacoplado Concorrente
epoll_wait) para threads trabalhadoras viaTTask.Run.ProcessRequestAsync) para garantir que dados de conexão concorrentes não sofram race conditions e que os recursos do socket sejam limpos de forma thread-safe.📊 Resultados do Benchmark Real (Linux Ubuntu / Docker)
O ambiente foi validado por meio de testes de carga simulando concorrência intensa de 200 conexões paralelas utilizando a ferramenta
wrk(4 threads por 15 segundos):Conclusão dos Testes
🧪 Como Testar Localmente
Para testes manuais:
Linux64../SeuApp --server -httpsys(no Linux, a engine nativa redireciona automaticamente para o provedorEpoll).wrkouautocannonpara validar a vazão e a estabilidade.