Apache sem resposta / paralisação ocasional

1

Estou executando o servidor http Apache 2.4 com o PHP 7.0 e o MySQL 5.5 no Debian GNU / Linux 8 (jessie). Ocasionalmente, o Apache fica completamente sem resposta por vários segundos - cerca de 30 segundos ou mais. Neste momento, as solicitações parecem entrar em fila - e quando o Apache finalmente começa a funcionar corretamente novamente, muitas solicitações que se acumularam precisam ser processadas de uma só vez, o que obviamente não é tão bom assim.

O motivo para o Apache deixar de responder não é claro, porque:

  • a carga da CPU cai completamente; nem o Apache, nem o MySQL ou qualquer outra coisa usa a CPU notavelmente
  • Não há erro no Apache error_log
  • Não há consulta de bloqueio no MySQL - nada é mostrado quando eu digito "SHOW PROCESSLIST"
  • Uma vez por segundo, uma "conexão simulada interna" é visível em access_log
  • A carga geral no servidor não deve ser alta para que isso ocorra; mesmo que a carga esteja abaixo da média, com poucos usuários conectados ao nosso sistema, isso pode acontecer
  • Até mesmo um script PHP contendo apenas echo "Hello World!"; não é executado
  • No PHP, nenhum erro do MySQL é lançado e eu posso executar instruções do MySQL facilmente a partir do console do MySQL
  • A RAM parece estar ok - a partição swap não é muito usada. Isto é o que diz top durante a tenda:

    KiB Mem:   6129344 total,  5975748 used,   153596 free,       24 buffers
    KiB Swap:  1952764 total,   199428 used,  1753336 free.  4397256 cached Mem
    

Eu tentei analisar o problema usando strace - para ser preciso, quando observo que o servidor não responde, eu entro no shell:

ps auxw | grep apache | awk '{print" -p " $2}' | xargs sudo strace

O que eu observei é que durante esse tempo linhas como as seguintes são visíveis na saída da strace com bastante frequência, o que elas não fazem nos momentos em que o problema não está presente:

[pid 13521] fcntl(57, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = -1 EAGAIN (Resource temporarily unavailable)

Normalmente, quando não há problema, consigo ver linhas como as seguintes:

[pid  3414] fcntl(55, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0

Alguém sabe que isso significa? Parece-me que existe um conflito de bloqueio de algum tipo ...

Apenas para completar, aqui está minha configuração do Apache:

 LogFormat "%h PID %P %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" %V" common
ServerTokens ProductOnly
ServerSignature Off
TraceEnable off

<IfModule mod_ssl.c>
    SSLHonorCipherOrder On
    SSLProtocol ALL -SSLv2 -SSLv3
    SSLCipherSuite EECDH+AES:AES256-SHA:AES128-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH:!EXP:!SRP:!DSS:!LOW;
    SSLVerifyClient none
    SSLVerifyDepth 1
    SSLInsecureRenegotiation Off
</IfModule>

ScriptAlias /cgi-bin52/ /usr/share/phpcgi/php52/
ScriptAlias /cgi-bin53/ /usr/share/phpcgi/php53/
ScriptAlias /cgi-bin54/ /usr/share/phpcgi/php54/
ScriptAlias /cgi-bin55/ /usr/share/phpcgi/php55/
ScriptAlias /cgi-bin56/ /usr/share/phpcgi/php56/
ScriptAlias /cgi-bin70/ /usr/share/phpcgi/php70/

Mutex flock

LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so
LoadModule status_module /usr/lib/apache2/modules/mod_status.so

AcceptFilter http none
AcceptFilter https none

ExtendedStatus on
TimeOut 60
KeepAlive Off
MaxKeepAliveRequests 50
KeepAliveTimeout 2
Options Indexes MultiViews FollowSymLinks
MaxRequestWorkers 256
MaxRequestsPerChild 300

Você vê, já existe uma entrada relacionada ao comportamento de bloqueio: Mutex flock ... foi pré-configurado pelo meu Webhoster por razões de estabilidade, como ele diz. Além disso, no link , essa parece ser uma das poucas opções que não tem quaisquer problemas.

Adicionei as entradas AcceptFilter ao tentar encontrar uma solução, mas sem sucesso.

Alguém pode explicar o que a linha que registrei usando strace contendo fcntl ... significa, ou sugerir outro método para análise do problema?

    
por toastbrot888 12.05.2017 / 12:38

2 respostas

1

Você pode ver em strace qual número de arquivo está bloqueando. Quando você fizer um ls -l /proc/$pid/fd , verá todos os arquivos abertos para esse processo. O link simbólico com o número do arquivo apontará para o arquivo em questão.

Eu tenho visto esses problemas, geralmente é o arquivo de sessão que tem esse problema. Se for o arquivo de sessão, faça seus desenvolvedores entenderem o que o session_write_close() no PHP faz e o que omitir o session_write_close() fará com o seu desempenho sob carga.

    
por 12.05.2017 / 16:56
0

fcntl é o Kernel que tenta definir descritores de arquivos. Uma coisa que você não tem focado é o tempo de espera de entrada / saída do disco e, portanto, execute o iostat ou o mpstat para ver se há algum problema de desempenho do disco ao encontrar os problemas.

    
por 12.05.2017 / 14:47