Bonjour tout le monde,
J'ai trois questions MariaDB / PHP-FPM :
* Quelqu'un a-t-il déjà vu MariaDB (10.1.48, paquet Debian Stretch)
rien faire (d'après htop, un seul processus MariaDB occupe 200 % du CPU
alors que la machine a 12 cœurs + mysqlamin montre que le nombre de «
questions » augmente de 15-20 r/s alors qu'en pleine journée ce serveur
mange 500-1000 r/s) alors que d'après ss, il y a 3866 connexions
établies (je dis bien établies, pas tcp-hanshake ni fin-wait) sur le
port 3306 de la machine et que chacune est associée à un thread que
mysqladmin étiquette « running » ? Nombre habituel de visiteurs web
(d'après les access.log apache httpd). Pas d'IOwait d'après top. Limites
"systemd" (nombre de fichiers, nombre de processus) pas atteintes.
Lancer un mysql (client cli) TCP : après plusieurs minutes, pas de shell
mysql, pas d'erreur non plus.
* Inversement, quelqu'un a-t-il déjà vu PHP-FPM (7.2.35) "oublier" de
fermer des connexions à MariaDB (les fameuses 3866 connexions
mentionnées au point précédent) et à memcached ? (Au point d'occuper
parfois toute la RAM (8G) et le swap (2G).) Pendant ce temps-là, le mod
proxy_fcgi d'Apache httpd journalise « Failed to make connection to
backend 127.0.0.1:9072 » / « The timeout specified has expired ».
Plusieurs telnet sur le port de php-fpm (9072) fonctionnent (connexion
établie)…
* Une idée d'outils pour diagnostiquer les interactions PHP<>MariaDB
sus-citées ? J'en suis à mysqladmin (pour remonter le nombre de threads
(total et running), max de connexions simultanées, requêtes/s, requêtes
lentes) + journaux apache http et journaux access de php-fpm. J'ai
l'impression de manquer d'infos : quelles requêtes SQL sont traitées à
l'instant T (mais si j'active la journalisation, je plombe le serveur) ?
Quelles requêtes web traitent php-fpm ? Quel est l'état des requêtes PHP
et SQL (en cours, pause, IO wait, en attente du SGBD, etc.) ?
Plus de détails :
* Infra classique : N frontaux apache httpd / mod proxy_fcgi + N php-fpm
(locaux ou déportés) + 1 MariaDB. Tout dans des VM KVM ;
* À répétition, nos sites web timeout. L'error.log d'apache httpd
consigne : « Failed to make connection to backend 127.0.0.1:9072 » / «
The timeout specified has expired » ;
* Dans les graphes, on passe de quelques centaines de connexions
établies à MariaDB et à memcached à plusieurs milliers en moins de 10
minutes. Ça ne descend pas, ça s'accumule ;
** Ce qui m'étonne, c'est qu'il n'y a pas de juste milieu entre les deux
("peu" de connexions / 3 k). On doit bien avoir un niveau de trafic web
entre ces deux extrêmes, quand même ;
* Soit MariaDB travaille d'une manière qui ne me paraît pas être
anormale (50 % des 12 cœurs), soit il fait rien (un seul processus à 200
%) ;
** Un nombre de requêtes/s loin du max qu'on encaisse voire de la
routine (d'après mysqladmin), genre < 20 r/s quand 3866 connexions sont
établies… ; pas de requêtes lentes (même source) ;
** mysqladmin voit les threads comme « running », donc pas comme des
connexions établies en attente d'instructions du client ;
** Pas d'IOWait, pas de limites "systemd" (nombre de fichiers, nombre de
processus) atteintes ;
** Rien dans le journal de MariaDB ;
* Soit ce pic peut correspondre à du "vrai" trafic web… soit non (genre
un samedi à 4 h du mat', les access log des apache httpd montrent un
trafic égale voire moindre aux jours sans incidents et, évidemment, pas
de CRON pour expliquer ça, pas même dans les applis web) ;
* Parfois (!), PHP accumule des processus fils donc il mange toute la
RAM et le CPU ;
* Redémarrer MariaDB (+ PHP parfois, + par impatience que par efficacité
prouvée) remet tout dans l'ordre (y compris le nombre de connexions
simultanées au memcached) ;
Si quelqu'un a une piste, je suis preneur, parce que moi, là… :D
Bonne fin de semaine.