Conexões TCP PHP-FPM que não terminam no tempo

1

Estou servindo páginas do Wordpress via nginx / PHP5-FPM usando cache APC (através do plugin W3 Total Cache). O Nginx se comunica com o PHP-FPM através de sockets TCP na porta 9000. Ajustei o número de conexões máximas via sysctl para 1024. Configurei max_execution_time (no php.ini) e request_terminate_timeout (no arquivo conf do FPM) para 30 segundos.

De vez em quando (digamos a cada 8-10 horas, e não linearmente) o número de conexões TCP abertas na porta 9000 aumenta para quase 1.000 (no status CLOSE_WAIT principalmente, algumas FIN_WAIT, FIN_WAIT_2), superando 1000 vezes, e meu o servidor da web começa a retornar erros 504. Uma vez que eu mato todas as conexões TCP naquela porta e reinicio o FPM, ele começa a funcionar bem novamente.

Eu ativei o log lento para ver o que está acontecendo e, se estou lendo corretamente, ele está pendurado em chamadas apc_store ().

Este é um erro de configuração do APC ou eu preciso ajustar com as configurações do FPM? E existe uma maneira de forçar essas conexões TCP a serem encerradas, mesmo se o script não enviar o sinal de finalização final?

Rastreio de exemplo do log lento do FPM:

[22-Jan-2015 09:42:49]  [pool www] pid 20327
script_filename = /var/www/index.php
[0x00007fdc527ec908] apc_store() /var/www/wp-content/plugins/w3-total-cache/lib/W3/Cache/Apc.php:55
[0x00007fdc527ec768] set() /var/www/wp-content/plugins/w3-total-cache/lib/W3/ObjectCache.php:254
[0x00007fdc527ec5e0] set() /var/www/wp-content/plugins/w3-total-cache/lib/W3/ObjectCache.php:300
[0x00007fdc527ec488] add() /var/www/wp-content/plugins/w3-total-cache/lib/W3/ObjectCacheBridge.php:73
[0x00007fdc527ec330] add() /var/www/wp-content/object-cache.php:94
[0x00007fdc527ec200] wp_cache_add() /var/www/wp-includes/option.php:176
[0x00007fdc527ec078] wp_load_alloptions() /var/www/wp-includes/functions.php:1272
[0x00007fdc527ebf40] is_blog_installed() /var/www/wp-includes/load.php:474
[0x00007fdc527ebdb0] wp_not_installed() /var/www/wp-settings.php:109
[0x00007fdc527ebc88] +++ dump failed
    
por Ansari 22.01.2015 / 18:48

1 resposta

0

Parece que você tem muitas TCP conexões que não estão finalizando corretamente. Basicamente, as conexões CLOSE_WAIT significam que o servidor recebeu um pacote FIN e está aguardando a vida útil máxima do segmento ou o servidor para informar a pilha da rede para fechar o soquete. As mensagens FIN_WAIT se devem ao fato de que o "servidor" enviou um FIN para o cliente, mas o cliente ainda não enviou (ou melhor, o servidor não recebeu) um FIN-ACK para confirmar a conexão está fechada.

    
por 22.01.2015 / 19:09