2015-11-27 22 views
6

Ho un MySQL 5.6.27-0ubuntu0.14.04.1 eseguito su un'istanza Google Compute con 4 CPU.La CPU MySQL aumenta quando la connessione Sleeping rimane aperta

Ho notato che se ho una connessione che si interrompe per un lungo periodo di tempo, la CPU del server aumenterà in modo lineare. Non capisco perché? Se si interrompe la connessione Sleep, la CPU ripristina il corretto utilizzo.

Quindi, per sintesi ho il seguente: Ho notato la CPU del mio esempio è in aumento: enter image description here

Poi controllo il processlist sul mio server

mysql> show processlist 
-> ; 
+-------+--------+-------------------+----------------+---------+------+-------+------------------+ 
| Id | User | Host    | db    | Command | Time | State | Info    | 
+-------+--------+-------------------+----------------+---------+------+-------+------------------+ 
| 85949 | nafora | paper-eee-2:58461 | state_recorder | Sleep | 1300 |  | NULL    | 
| 85956 | nafora | paper-eee-2:58568 | state_recorder | Sleep | 64 |  | NULL    | 
| 85959 | root | localhost   | NULL   | Query | 0 | init | show processlist | 
+-------+--------+-------------------+----------------+---------+------+-------+------------------+ 

Si può vedere che ho appena 2 connessione che Sleep e uno è qui da 1300 secondi (perché ho un processo che è bloccato con la connessione aperta)

Così ho ucciso la connessione 85949, e la CPU solo fa giù. enter image description here

Qualcuno può spiegarmi perché una singola connessione che sta dormendo può avere un impatto sul mio database in questo modo.

Grazie.

+0

Strano problema. Potresti aggiungere qualche informazione in più sul sistema? Versione di MySQL? InnoDB o MyISAM forse? In caso di output InnoDB di 'SHOW ENGINE INNODB STATUS'? Anche l'attivazione del monitoraggio potrebbe essere utile: http://dev.mysql.com/doc/refman/5.0/en/innodb-monitors.html. Qualche sfondo sulle connessioni? Hanno letto/scritto molto prima di diventare pigri. Sono autoimitati? ecc. –

+1

Dovresti provare a scoprire cosa sta facendo quel processo. Forse questo articolo aiuta: https://www.percona.com/blog/2007/02/08/debugging-sleeping-connections-with-mysql/ – fancyPants

risposta

2

Alcune connessioni non chiuse o lunghe query lente possono causare questo comportamento. È possibile limitare le connessioni non chiuse configurando la variabile globale wait_timeout come valore ragionevole e impostare anche un'altra variabile correlata interactive_timeout all'altezza delle migliori pratiche.

Le applicazioni di stato che utilizzano un pool di connessione (Java, .NET, ecc.) Dovranno regolare il wait_timeout in modo che corrisponda alle impostazioni del pool di connessione. L'impostazione predefinita di 8 ore (wait_timeout = 28800) funziona bene con i pool di connessione correttamente configurati.

Configurare wait_timeout leggermente più lungo della durata prevista della connessione del pool di connessione dell'applicazione. Questo è un buon controllo di sicurezza. Anche profilo le query di conseguenza per osservare le prestazioni dell'istanza MySQL può aiutare a evitare I/O bottlenecks.