Una rapida occhiata con htop ha mostrato che la macchina era in picco con il processore tra 85% e 100% e con tutti i processi principali occupati da Mysql
Htop |
Una volta capito il responsabile c'era da capire il motivo. Il primo sospetto, visto il tempo di esecuzione di ogni processo, era che le query fossero talmente lunghe e frequenti da sovrapporsi nel tempo da creare un effetto a cascata che rendeva dopo un po' il tempo il server non utilizzabile
Per definire il problema ho usato il comando
mysqladmin -u root -p -i 1 processlist
in questo modo si ottiene una lista dei processi in corso sul server MySql evidenziando anche la query ed il tempo di esecuzione di ciascuna query.
In questo modo si ottiene una lista dei processi in corso sul server Mysql evidenziando anche la query in corso ed il tempo di esecuzione. Impostando il parametro i ad 1 si ottiene i dati relativi ad 1 secondo di tempo. Nel parziale listato si e' visto che in un secondo venivano eseguite oltre 120 query complesse con il tempo in secondo impiegato da ciascun thread
------------------------------------------------------------------------
+-------+----------------------+--------------------------+--------+---------+------+----------------------+------------------------------------------------------------------------------------------------------+----------+| Id | User | Host | db | Command | Time | State | Info | Progress |
+-------+----------------------+--------------------------+--------+---------+------+----------------------+------------------------------------------------------------------------------------------------------+----------+
| 12296 | utente | localhost | db | Query | 2 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.f
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 12299 | utente | localhost | db | Query | 16 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.f
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 12303 | utente | localhost | db | Query | 4 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.f
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 12308 | utente | localhost | db | Query | 33 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.f
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 13392 | utente | localhost | db | Query | 35 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.E
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 13396 | utente | localhost | db | Query | 11 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.E
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 13399 | utente | localhost | db | Query | 5 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.E
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 13403 | utente | localhost | db | Query | 26 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.E
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 13411 | utente | localhost | db | Query | 40 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.E
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 14407 | utente | localhost | db | Query | 45 | Sending data | SELECT AVG(VAL) AS VAL
FROM db.E
WHERE NET = (SELECT NET.NET_ID
| 0.000 |
| 14411 | utente | localhost | db | Query | 54 | Sending data | SELECT AVG(VAL) AS VAL
------------------------------------------------------------------------
ovviamente un traffico che ha messo in ginocchio il server.
Un metodo alternativo e' quello di installare mytop (un clone del comando top specifico per MySql)
Il comando si puo' lanciare passando i parametri da file di configurazione oppure tramite switch sulla linea di comando. Ho usato la seconda strada
mytop -u root -d databasename --prompt
(e' necessario inserire il nome del database, non accetta il monitoraggio di tutti i db)
Mytop del server quando sono state interrotte le query lunghe |