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