[FRsAG] MariaDB : connexions établies en attente sans utilisation des ressources matérielles

Guillaume LUCAS guillaume.lucas at univ-avignon.fr
Dim 28 Fév 17:56:47 CET 2021


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.


Plus d'informations sur la liste de diffusion FRsAG