Meu servidor tem um comportamento estranho e eu simplesmente não consigo encontrar a causa. Eu tenho procurado em todo lugar.
Eu pagarei 200 $ de bitcoin para qualquer um que possa descobrir isso.
O problema:
Ao solicitar qualquer recurso do apache (página, imagem, css, js), às vezes, leva muito tempo para responder. Cerca de metade do tempo, a conexão é redefinida. (no Chrome: net :: ERR_CONNECTION_RESET)
Isso acontece raramente, aleatoriamente e é absolutamente imprevisível.
Mais confusamente, enquanto a única solicitação parece travar, posso fazer solicitações adicionais que funcionem perfeitamente.
Sobre o servidor:
Estou executando o apache2.4 mpm-prefork com o php7.0 no debian 9. O módulo do apache usa mod_rewrite e um certificado ssl do certbot. Em algumas ocasiões, o php invoca o inkscape para renderizar svgs para png.
O carregamento do servidor é muito baixo (0,02) e nada além do apache é executado nele.
Coisas marcadas:
- verificou todos os registros do servidor. (log syslog, apache) - nada
- aumentou os limites do apache mpm-prefork - nope
- verificado para possíveis problemas de DNS - nada
- Eu até mudei para um servidor raiz completamente novo (em um provedor diferente) - ainda o mesmo
Eu fui e analisei o tráfego de TCP com o Wireshark, e há um comportamento suspeito. Quando a conexão está congelando, há alguns pacotes de segmento não visto TCP, Retransmission e ACKed, mas não tenho o conhecimento necessário de baixo nível para saber o que está acontecendo.
Quaisquer sugestões seriam muito avaliadas!
EDITAR:
Esta é a configuração do mpm_prefork:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 50
MaxRequestWorkers 300
MaxConnectionsPerChild 0
</IfModule>
EDITAR EDIT:
Eu tive sorte e consegui um sniffer tcp rodando no servidor e no cliente quando isso aconteceu novamente.
Aqui estão os arquivos pcap, recortados nos últimos 30 segundos.
serverside.pcap
clientside.pcap
Se alguém com o conhecimento puder dar uma rápida olhada nele e me contar o que está acontecendo, eu ficarei muito feliz.
EDIT EDIT EDIT:
Consegui tornar o erro reproduzível , pelo menos com o KeepAlive ativado.
Quando uma solicitação é finalizada e o conteúdo é exibido, a conexão tcp é fechada com um FIN-ACK após 5 segundos. Ao fazer outra solicitação na janela de tempo de 5 a 12 segundos após o FIN-ACK, a conexão congela.
Com o KeepAlive desligado, no entanto, isso não acontece mais, embora o erro ocorra com mais frequência ao carregar vários recursos ao mesmo tempo. Mas então não é mais reproduzível.