Tuto : monitorer le nb de processus mysql en cours

Bonjour à tous,

Je suis confronté depuis quelques temps à des blocages temporaires de mon jeedom, liés à un nb de porcess au niveua de la BD trop important (150). au bout de 30 min, la situation se normalise.
A ce jour, je n’arrive pas à analyser le pb lorsqu’il se produit. Soit je ne suis pas devant un PC, soit on me met la pression pour que ca redemarre rapidement (J’ai un WAF Pressé !)

Bref, je vous partage un bloc code très simple à intégrer à un scenario qui, je l’espère, me permettra la prochaine fois d’avoir le temps d’analyser le pb.

Prérequis : créer une commande virtuel info numérique historisée qui va loguer le nb de process. pour l’historisation, pas de calcul, archivage 7 jours, répéter les valeurs identiques à Oui

Scenario : à lancer toutes les minutes :

$version = '23/03/2024 12:00' ;
$scenario->setLog('┌──────────── Logs bloc code - version du '.$version);
$scenario->setLog('| ');

$seuilProcess = 140 ;      // Seuil d'alerte pour le nb de process msql 
$cmdProcess = cmd::byString('#[Aucun][MySQL Process][Nb Process]#') ;

// ANALYSE DES PROCESS :

$sql_nb_process = "SHOW PROCESSLIST" ;
$results_process = DB::Prepare($sql_nb_process, NULL, DB::FETCH_TYPE_ALL);
$nb_process = count($results_process) ;
$scenario->setLog('| Nb total de process : '.$nb_process );
$cmdProcess->event($nb_process) ;

if ( $nb_process >= $seuilProcess ) {
  $scenario->setLog('| /!\ Nb de process supérieur à '.$seuilProcess) ;
  $scenario->setLog('| /!\ Analyse de tous les process') ;  
  $scenario->setLog('| ');
  $scenario->setLog('| '.str_pad(substr('ID',0,6),6,' ',STR_PAD_RIGHT).' '.str_pad(substr('User',0,6),6,' ',STR_PAD_RIGHT).' '.str_pad(substr('Host',0,10),10,' ',STR_PAD_RIGHT).' '.str_pad(substr('Cmd',0,5),5,' ',STR_PAD_RIGHT).' '.str_pad(substr('Temps',0,5),5,' ',STR_PAD_RIGHT).' '.str_pad(substr('Etat',0,8),8,' ',STR_PAD_RIGHT).' '.str_pad(substr('Prog',0,5),5,' ',STR_PAD_RIGHT).' '.str_pad(substr('Infos',0,30),30,' ',STR_PAD_RIGHT));

  foreach ($results_process as $process) {
    $id = $process['Id'];
    $user = $process['User'];
    $host = $process['Host'];
    $command = $process['Command'];
    $time = $process['Time'];
    $state = $process['State'];
    $info = $process['Info'];
    $progress = $process['Progress'];
    $scenario->setLog('| '.str_pad(substr($id,0,6),6,' ',STR_PAD_RIGHT).' '.str_pad(substr($user,0,6),6,' ',STR_PAD_RIGHT).' '.str_pad(substr($host,0,10),10,' ',STR_PAD_RIGHT).' '.str_pad(substr($command,0,5),5,' ',STR_PAD_RIGHT).' '.str_pad(substr($time,0,5),5,' ',STR_PAD_RIGHT).' '.str_pad(substr($state,0,8),8,' ',STR_PAD_RIGHT).' '.str_pad(substr($progress,0,5),5,' ',STR_PAD_RIGHT).' '.str_pad(substr($info,0,30),30,' ',STR_PAD_RIGHT));
  }
}

$scenario->setLog('└───────────────────────────');

Le scenario loguera le nb de process en cours dans une commande info et si ce nb est superieur à un seuil inscrira dans les logs du scenario la liste des process pour analyse ulterieure

[2024-03-23 12:42:02][SCENARIO] | Nb total de process : 24
[2024-03-23 12:42:02][SCENARIO] | /!\ Nb de porcess superieur à 10
[2024-03-23 12:42:02][SCENARIO] | /!\ Analyse de tous les process
[2024-03-23 12:42:02][SCENARIO] |
[2024-03-23 12:42:02][SCENARIO] | ID     User   Host       Cmd   Temps Etat     Prog  Infos
[2024-03-23 12:42:02][SCENARIO] | 60700  jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 60701  jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 60703  jeedom localhost  Sleep 1              0.000
[2024-03-23 12:42:02][SCENARIO] | 60704  jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 151281 jeedom localhost  Sleep 10             0.000
[2024-03-23 12:42:02][SCENARIO] | 158134 jeedom localhost  Sleep 3              0.000
[2024-03-23 12:42:02][SCENARIO] | 158135 jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 158136 jeedom localhost  Sleep 2              0.000
[2024-03-23 12:42:02][SCENARIO] | 159341 jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 159343 jeedom localhost  Sleep 2              0.000
[2024-03-23 12:42:02][SCENARIO] | 167519 jeedom localhost  Sleep 1              0.000
[2024-03-23 12:42:02][SCENARIO] | 171217 jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 171319 jeedom localhost  Sleep 28             0.000
[2024-03-23 12:42:02][SCENARIO] | 171320 jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 171508 jeedom localhost  Sleep 2              0.000
[2024-03-23 12:42:02][SCENARIO] | 171853 jeedom localhost  Sleep 1              0.000
[2024-03-23 12:42:02][SCENARIO] | 171996 jeedom localhost  Sleep 1              0.000
[2024-03-23 12:42:02][SCENARIO] | 172286 jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 172663 jeedom localhost  Sleep 2              0.000
[2024-03-23 12:42:02][SCENARIO] | 173622 jeedom localhost  Sleep 1              0.000
[2024-03-23 12:42:02][SCENARIO] | 173626 jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 173627 jeedom localhost  Sleep 0              0.000
[2024-03-23 12:42:02][SCENARIO] | 173628 jeedom localhost  Query 0     starting 0.000 SHOW PROCESSLIST
[2024-03-23 12:42:02][SCENARIO] | 173629 jeedom localhost  Sleep 0              0.000

Voilà, esperant que ca puisse me servir pour analyser le schmilblink

Norbert

1 « J'aime »

Salut @ngrataloup,

J’ai eu ce même problème de nombre de connexions simultanées à la DB qui explosait et bloquait Jeedom sur une machine de dev récemment. J’ai fini par refaire le conteneur LXC et restaurer la sauvegarde Jeedom et depuis plus aucun souci à ce niveau. Du coup ce serait peut être aussi simple pour résoudre ton problème surtout si tu as un WAF important :wink:

Oui, c’est ce que je ferai si je ne trouve rien. Ça m’embête toujours de ne pas savoir. Je me laisse encore 15 jours !
Ce qui m’embête, c’est que le PB est transitoire ( hier soir entre 22:30 et 22:45 :triumph:)

Norbert

Peut être activer des logs plus détaillés coté daemon mysql si ton stockage le permet ? (pas sur une carte SD quoi).
A minima les slowquery

Merci @ngrataloup pour le partage de ton script. Je rencontre un problème similaire depuis 2 mois environ, qui semble se déclencher de façon aléatoire et rarement plus d’une fois par semaine à des jours et horaires variables. J’ai constaté le problème, car mon historique d’utilisation de la mémoire explose à chaque fois à ce moment-là (typiquement je passe d’une utilisation de 20% de mémoire à presque 50% avec 8Go de RAM en VM), et la mémoire ne se libère pas sans redémarrer Jeedom après l’incident. Jusqu’à présent, les seuls signes que je voyais c’était des erreurs dans les scénarios qui n’arrivait pas à se lancer où Jeedom connect qui est injoingniable (en WS ou https) pendant le phénomène. Aujourd’hui j’étais pas loin de mon ordi, et j’ai constaté que le fait de désactiver Jeedom Connect et de le relancer à stopper le phénomène et à même libéré la mémoire pour qu’elle revienne à un niveau similaire à celui d’avant le phénomène. J’ai donc mis en place ton script, histoire de voir si j’arrive à mieux cerner le problème avec lui.
Bonne journée,

Salut,

J’avais aussi ce soucis et d’après ce que j’ai compris c’est peut être dû au fait des processus qui ne libèrent pas la connexion à la BD.
Par défaut Jeedom est configuré pour des connexions persistantes à la BD … pour une histoire de performance apparemment.
Quand on dépasse les 150 connexions par défaut, hop tout bloque.
Du coup, on peut soit augmenter le nombre de connexions simultanées à la BD ou mettre ce paramètre de connexions persistantes à 0.
J’ai choisis d’essayer la seconde option et je ne vois aucun ralentissement ou autre comportement suspect de mon Jeedom.
Il n’y plus eut de problème depuis ce changement.
Par contre je dois appliquer ce changement à chaque mise à jour de Jeedom étant donné que ce paramètre est dans le core du système.
Je me suis fait un petit script pour changer ce paramètre facilement depuis un clic sur un bouton dans un virtuel :

Il faut redémarrer Jeedom après la changement.

Sébastien

1 « J'aime »