random CONNECTION_RESET no apache2.4 debian 9

4

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.

    
por Manuel Otto 24.01.2018 / 16:46

1 resposta

1

Eu verificaria o tamanho dos pacotes TCP entre o servidor e o cliente. Se eles estão se aproximando de 1500 em tamanho, existe a possibilidade de serem descartados por inúmeras possibilidades:

  1. Se o bit DNF estiver definido no pacote e o pacote estiver sendo fragmentado em algum lugar, isso pode ser um problema que faz com que o pacote seja descartado

  2. Se a MTU estiver configurada para 1500 e os pacotes estiverem passando por túneis, criptografia, etc, que fazem com que cabeçalhos adicionais sejam adicionados ao pacote, isso também causaria a queda de seus pacotes. Tente definir o mtu em ambas as extremidades nas interfaces que você está usando para algo menor que 1500, possivelmente 1420 ou até menor.

por 02.02.2018 / 21:13