PHP-FPM
Adaptez php-fpm à votre configuration
09/11/18 16:30 Classé dans: Techniques
Centreon 18.10 utilise PHP-FPM qui permet une communication entre le serveur Web et PHP, basé sur le protocole FastCGI. Ce mécanisme créé par Andrei Nigmatulin (source wikipédia) permet d'être plus robuste sur des sites subissant de fortes charges.
Lors de l'installation de Centreon avec les sources avec Debian, la configuration de php-fpm se fait avec les paramètres par défaut. Malheureusement, cette configuration s'avère vite insuffisante pour une utilisation intensive de Centreon.
Le fichier de log /var/log/php7.1-fpm.log nous indique assez rapidement, ce genre de message
Ce message indique que vous n'avez pas assez de processus pour php-fpm. Nous devrons donc augmenter cette valeur dans des proportions cohérentes par rapport à votre configuration.
Dans un premier temps, déterminez la mémoire vive utilisée par les différents processus (centengine, mysql, apache, etc) de votre serveur et estimez la valeur totale que vous pouvez allouer à php-rpm. Dans notre cas, nous prendrons comme valeur 1024 Mo de RAM.
Ensuite, déterminons la consommation par processus php-rpm avec cette commande (attention valable pour une distribution Debian pour le nom du processus) :
Les valeurs qui nous intéresse sont celles-qui correspondent à la colonne RSS. C'est la consommation en Ko de chaque processus. Pour obtenir la moyenne, vous pouvez lancer cette commande.
Nous pouvons calculer le nombre de processus maximum que vous pourrez allouer à votre service php-fpm :
La configuration par défaut est la suivante
Nous allons configurer les différentes valeurs :
pm.max_children : la valeur maximum sera celle trouvée précédemment soit 35
Pour les autres valeurs, il n'y a pas de règle bien définie, je n'en ai pas trouvé. Nous dirons que pm.max_spare_servers ne peut être inférieur à pm.start_servers et ni supérieur à pm.max_children. Voici donc une proposition :
Pour optimiser la durée des processus et les fuites de mémoires, on peut configurer les valeurs suivantes :
Et je n'ai pas parlé du CPU qui a une importance évidente pour le traitement des processus…
Lors de l'installation de Centreon avec les sources avec Debian, la configuration de php-fpm se fait avec les paramètres par défaut. Malheureusement, cette configuration s'avère vite insuffisante pour une utilisation intensive de Centreon.
Le fichier de log /var/log/php7.1-fpm.log nous indique assez rapidement, ce genre de message
[07-Nov-2018 14:56:02] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
Ce message indique que vous n'avez pas assez de processus pour php-fpm. Nous devrons donc augmenter cette valeur dans des proportions cohérentes par rapport à votre configuration.
Dans un premier temps, déterminez la mémoire vive utilisée par les différents processus (centengine, mysql, apache, etc) de votre serveur et estimez la valeur totale que vous pouvez allouer à php-rpm. Dans notre cas, nous prendrons comme valeur 1024 Mo de RAM.
Ensuite, déterminons la consommation par processus php-rpm avec cette commande (attention valable pour une distribution Debian pour le nom du processus) :
ps -ylC php-fpm7.1 --sort:rss
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 33 15825 15807 0 80 0 29556 109221 - ? 00:00:00 php-fpm7.1
S 33 15826 15807 0 80 0 30756 109281 - ? 00:00:00 php-fpm7.1
S 0 15807 1 0 80 0 47032 107672 - ? 00:00:00 php-fpm7.1
Les valeurs qui nous intéresse sont celles-qui correspondent à la colonne RSS. C'est la consommation en Ko de chaque processus. Pour obtenir la moyenne, vous pouvez lancer cette commande.
ps --no-headers -o "rss,cmd" -C php-fpm7.1 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
29M
Nous pouvons calculer le nombre de processus maximum que vous pourrez allouer à votre service php-fpm :
Mémoire allouée en ko / moyenne en ko d'un processus php-fpm
soit
1024/29=35,31 soit 35 processus maximum
Nous éditons le fichier de configuration php-fpm
vi /etc/php/7.1/fpm/pool.d/www.conf
La configuration par défaut est la suivante
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Nous allons configurer les différentes valeurs :
pm.max_children : la valeur maximum sera celle trouvée précédemment soit 35
Pour les autres valeurs, il n'y a pas de règle bien définie, je n'en ai pas trouvé. Nous dirons que pm.max_spare_servers ne peut être inférieur à pm.start_servers et ni supérieur à pm.max_children. Voici donc une proposition :
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
Pour optimiser la durée des processus et les fuites de mémoires, on peut configurer les valeurs suivantes :
pm.process_idle_timeout = 10s;
pm.max_requests = 500
Et je n'ai pas parlé du CPU qui a une importance évidente pour le traitement des processus…