Comment gérer l’état de finition de PHP-FPM?

J’ai un site Web utilisant NGINX et PHP-FPM. Comme vous le savez peut-être, PHP-FPM dispose d’une page d’état pour ses pools avec des informations détaillées sur ses processus. Mon problème est que, au fur et à mesure que le temps passe, de nombreux processus deviennent “finissant” et ne changeront pas leur état de “finition” tant que je ne rechargerai pas PHP-FPM.

La mauvaise chose est que les processus de “finition” sont considérés comme des processus actifs et lorsque le nombre de processus actifs dépasse pm.max_children, de mauvaises choses se produisent sur mon site.

Je connais certains parameters du pool php-fpm pour tuer les processus inactifs, mais je ne peux pas trouver de parameters pour tuer les processus de finition après un certain temps.

Comment gérer l’état de finition de PHP-FPM? Existe-t-il un paramètre de configuration permettant de supprimer ces processus de «finition» après un certain temps? Cela pourrait-il être une mauvaise configuration entre NGINX et PHP-FPM? Quelles sont les raisons de “finir” les états?

Voici une image du statut de php-fpm. Les rouges sont des états finis, ce que j’essaie de réparer. Demander URI sont les différentes pages de mon site.

entrer la description de l'image ici

Merci pour vos connaissances.

PD1: En ce moment, je recharge PHP-FPM toutes les 15 minutes et cela “corrige” plus ou moins les états de finition … mais je pense que cela pourrait être un problème de performance important avec plus de trafic.

PD2: Jusqu’à présent, la seule solution possible était de lire la page d’état de php-fpm, d’obtenir tous les états finaux et de tuer les processus par pid qui dépassent une durée de requête arbitraire.

Eu le même problème. Voici ce que j’ai utilisé comme solution temporaire:

Créez un fichier PHP avec le contenu:

 

éditez le php.ini:

 auto_append_file = /path/to/your/file.php 

J’ai eu un problème comme ça et c’était ma solution:

Il s’avère que nous utilisions des clés Memcached invalides dans certaines situations. Cela causait la mort de Memcached sans erreur et le processus PHP restait en vie.

https://serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes

Aucun commentaire n’a résolu ou expliqué la cause profonde du problème. Exemple de code pour effectuer l’approche PD2 lors de la destruction de ces processus devrait être quelque chose comme ceci:

  60) { passthru("kill -9 " . $pid); echo " KILLED\n"; } else { echo "\n"; } } } echo count($data['processes']); echo "\n"; sleep(30); } 

Lors de l’exécution de ce code, j’ai découvert que de telles erreurs se produiraient dans le fichier error.log:

2017/08/06 13:46:42 [erreur] 20 # 20: * 9161 recv () a échoué (104: connexion réinitialisée par l’homologue) lors de la lecture de l’en-tête de réponse en amont, client: 77.88.5.19, serveur: nomhôte1, requête: “GET /? P = 9247 HTTP / 1.1”, en amont: “fastcgi: // uni x: /run/php/php7.0-fpm.sock:”, hôte: “hostname2”

L’incompatibilité évidente était que la requête était gérée par le bloc “hostname1”, et qu’un bloc pour “hostname2” n’existait plus (plus). Je ne peux pas dire avec certitude que c’était la raison. Il y avait des requêtes de “finition” même après avoir déclaré un server_name _; bloquer, mais ils étaient moins fréquents que tout ce qui se passait avant.

Mon serveur avait le paramètre enablereuse = on dans la configuration du proxy apache. La suppression de ce problème a résolu le problème “Finition”.

Aussi répertorié dans la question: https://serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes