Utilizzo elevato della CPU MySQL [chiuso]


191

Recentemente la mia CPU del server ha funzionato molto.

Il carico della CPU è in media 13,91 (1 minuto) 11,72 (5 minuti) 8,01 (15 minuti) e il mio sito ha avuto solo un leggero aumento del traffico.

Dopo aver eseguito un comando top, ho visto che MySQL utilizzava il 160% di CPU!

Di recente ho ottimizzato le tabelle e sono passato a connessioni persistenti. Questo potrebbe causare MySQL a utilizzare elevate quantità di CPU?


4
Le connessioni persistenti non sono quasi sempre la cosa giusta da usare.
Jason,

li toglierò ora e guarderò la differenza perché non ricordo mai che la CPU è sopra i 2 un mese fa!
Sentenza del

2
I server tendono ad avere più di un core. L'utilizzo percentuale della CPU viene calcolato rispetto a un core, in altre parole un processo che utilizza completamente due core avrà un utilizzo della CPU del 200%. Qui, MySQL utilizza fino al 100% di un core e il 60% di un altro core. Ciò non significa che tutte le CPU siano esaurite, molto probabilmente ha ancora almeno due CPU libere.
xaav,

Una CPU elevata significa quasi sempre query inefficienti. Di solito vengono risolti tramite una migliore indicizzazione (in particolare "composito") e / o riformulando la query.
Rick James,

Risposte:


265

Innanzitutto direi che probabilmente vuoi disattivare le connessioni persistenti poiché fanno quasi sempre più male che bene.

In secondo luogo, direi che vuoi ricontrollare i tuoi utenti MySQL, solo per assicurarti che non sia possibile per nessuno connettersi da un server remoto. Anche questa è una cosa importante da verificare.

In terzo luogo direi che vuoi accendere il registro delle query lente di MySQL per tenere d'occhio tutte le query che richiedono molto tempo e utilizzarlo per assicurarti di non avere domande che bloccano le tabelle chiave per troppo tempo.

Alcune altre cose che è possibile verificare sarebbero eseguire la seguente query mentre il carico della CPU è elevato:

SHOW PROCESSLIST;

Questo ti mostrerà tutte le query che sono attualmente in esecuzione o in coda per essere eseguite, qual è la query e cosa sta facendo (questo comando troncerà la query se è troppo lunga, puoi usare SHOW FULL PROCESSLIST per vedere il testo completo della query) .

Ti consigliamo inoltre di tenere d'occhio elementi come dimensioni del buffer, cache della tabella , cache delle query e innodb_buffer_pool_size (se si sta utilizzando InnoDB tabelle) come tutte queste allocazioni di memoria può avere un effetto sulle prestazioni delle query che può causare a MySQL mangiare CPU.

Probabilmente vorrai anche dare una lettura di quanto segue in quanto contengono alcune buone informazioni.

È anche un'ottima idea usare un profiler. Qualcosa che puoi attivare quando vuoi che ti mostrerà quali query è in esecuzione nella tua applicazione, se ci sono query duplicate, quanto tempo impiegano, ecc. Ecc. Un esempio di qualcosa come questo è quello su cui sto lavorando PHP Profiler ma ce ne sono molti là fuori. Se stai utilizzando un software come Drupal, Joomla o Wordpress, ti consigliamo di fare un giro all'interno della community in quanto probabilmente ci sono moduli disponibili per loro che ti consentono di ottenere queste informazioni senza dover integrare manualmente nulla.


12
grazie mille per questo, ho rimosso le connessioni persistenti e quindi ho impostato il registro delle query lente. ho letto il registro e la maggior parte delle query proveniva da due tabelle e le tabelle non erano state indicizzate correttamente! sono passati solo circa 10 minuti, ma ecco il risultato: il carico della CPU è in media 0,48 (1 minuto) 0,95 (5 minuti) 2,42 (15 minuti) grazie mille
giudicare il

stesso problema, risolto indicizzando le tabelle che rallentano il processo, grazie Steven e Juddling
gabrielem,

@Juddling Potresti approfondire su come indicizzare un tavolo per favore? Forse qualche link? So che è passato un po 'di tempo, ma sono davvero nuovo a questa cosa. Scusami per la domanda
noobish

La registrazione delle query lente mi ha aiutato a trovare il mio particolare problema di utilizzo elevato della CPU. Nel mio caso, era un plugin di Wordpress (ultimate-tag-cloud-widget) che stava facendo una query mostruosa ad ogni colpo solo per mostrare i tag popolari. È un ottimo plugin, ma deve essere migliorato con la memorizzazione nella cache di qualche tipo (ho finito per personalizzarlo per risolvere il mio problema).
jkincali,

Un'altra cosa che ha aiutato un diverso problema è stata la modifica del parametro innodb_buffer_pool_size sopra menzionato. Mentre provo a trovare la causa dell'elevato utilizzo della CPU, ho letto da qualche parte che innodb_buffer_pool_size dovrebbe essere almeno la dimensione del file ibdata1, che si trova in / var / lib / mysql. Sembra che InnoDB funzioni in modo molto più efficiente quando può essere residente in memoria. Questo può essere difficile da fare in alcune situazioni perché ibdata1 può essere enorme! È stato anche suggerito da qualche parte di assicurarsi che innodb_log_buffer_size sia il 25% delle dimensioni di innodb_buffer_pool_size.
jkincali,

167

Poiché questo è il primo post se si utilizza Google per l'utilizzo elevato della CPU MySQL o si carica, aggiungerò una risposta aggiuntiva:

Il 1 ° luglio 2012 è stato aggiunto un secondo di salto all'attuale ora UTC per compensare il rallentamento della rotazione terrestre dovuto alle maree. Durante l'esecuzione di ntp (o ntpd) questo secondo è stato aggiunto all'orologio del tuo computer / server. MySQLd non sembra apprezzare questo secondo in più su alcuni sistemi operativi e produce un elevato carico della CPU. La soluzione rapida è (come root):

$ /etc/init.d/ntpd stop
$ date -s "`date`"
$ /etc/init.d/ntpd start

22
Poiché il post originale era di circa 3 anni fa, dubito che sia la causa del problema del poster originale. Ma era la causa del mio problema e mi ha salvato proprio ora - quindi grazie! Maggiori informazioni: blog.mozilla.org/it/2012/06/30/…
Russell G

5
Stesso problema e soluzione per me su Ubuntu 12.04. Passaggi per risolvere leggermente diversi: service ntp stop && date -s " date" && service ntp start L'utilizzo della CPU MySQL è sceso istantaneamente dal 50-100% fino allo 0-1%
David Laing

2
Questo può essere eseguito solo per essere sicuro? Voglio dire, è sicuro eseguirlo anche se non è la ragione?
Muhammad Gelbana,

2
1 luglio 2015 - Ho appena riscontrato questo secondo errore molto saltato su un attuale server AWS EC2 con Amazon Linux. Utilizzare sudo service ntpd stopsu questa configurazione.
Matt van Andel,

1
+1 per questa soluzione. Il mio MySQL funzionava al 50-60% per mesi senza motivo, dopo aver applicato questa soluzione è sceso a tutto lo 0,0-0,3%, come doveva essere. Molte grazie.
Zeeshan,

32

Se questo server è visibile al mondo esterno, vale la pena verificare se ci sono molte richieste di connessione dal mondo esterno (ovvero persone che cercano di entrare)


1
Non sono sicuro del motivo per cui ciò ha attratto un downvote anonimo, dato che in alcuni sistemi questo è stato una causa in passato.
Rowland Shaw,

2
Penso che il voto negativo sia dovuto al fatto che avere MySQL visibile al mondo esterno non è una buona idea.
MikeKulls,

9
@MikeKulls No, non è una buona idea, in quanto fungerà da obiettivo per molte persone che cercano di ottenere l'accesso, il che darà un carico di CPU elevato, quindi la mia risposta come una possibile ragione.
Rowland Shaw,

16
Lo odio quando qualcuno vota e va!
Muhammad Gelbana,

1
+1 perché questo è assolutamente un motivo legittimo perché MySQL abbia un elevato utilizzo della CPU e chiunque abbia questa risposta ha davvero bisogno di queste informazioni!
Chris Browne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.