2 votes

Les connexions TCP de PHP-FPM ne se terminent pas à temps

Je sers les pages Wordpress via nginx/PHP5-FPM en utilisant la mise en cache APC (via le plugin W3 Total Cache). Nginx communique avec PHP-FPM via des sockets TCP sur le port 9000. J'ai ajusté le nombre de connexions max via sysctl à 1024. J'ai fixé le max_execution_time (dans php.ini) et le request_terminate_timeout (dans le fichier conf de FPM) à 30 secondes.

De temps en temps (disons toutes les 8-10 heures, et pas de façon linéaire), le nombre de connexions TCP ouvertes sur le port 9000 atteint près de 1000 (en état CLOSE_WAIT la plupart du temps, quelques FIN_WAIT, FIN_WAIT_2), dépassant parfois 1000, et mon serveur web commence à renvoyer des erreurs 504. Une fois que j'ai supprimé toutes les connexions TCP sur ce port et que j'ai redémarré FPM, il recommence à fonctionner correctement.

J'ai activé le slow log pour voir ce qui se passe, et si j'ai bien compris, il est bloqué sur les appels apc_store().

S'agit-il d'une mauvaise configuration d'APC ou dois-je modifier les paramètres de FPM ? Et y a-t-il un moyen de forcer ces connexions TCP à se terminer même si le script n'envoie pas le signal de terminaison final ?

Exemple de trace provenant du journal lent de 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

1voto

TheCompWiz Points 7329

Il semble que vous ayez beaucoup de TCP les connexions qui ne se terminent pas correctement. En principe, les CLOSE_WAIT signifie que le serveur a reçu un paquet FIN et qu'il attend maintenant soit la durée de vie maximale du segment, soit que le serveur demande à la pile réseau de fermer la socket. La durée de vie maximale d'un segment FIN_WAIT sont dus au fait que le "serveur" a envoyé un FIN au client, mais le client n'a pas encore envoyé (ou plutôt, le serveur n'a pas reçu) un FIN-ACK pour confirmer la fermeture de la connexion.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X