2009-08-15 4 views
157

Kürzlich ist meine Server-CPU sehr hoch gegangen.MySQL hohe CPU-Auslastung

CPU-Auslastung im Durchschnitt 13,91 (1 Minute) 11,72 (5 Minuten) 8.01 (15 Minuten) und meine Website hat nur einen leichten Anstieg des Verkehrsaufkommens.

Nachdem ich einen Top-Befehl ausgeführt hatte, sah ich, dass MySQL 160% CPU verwendete!

Kürzlich habe ich Tabellen optimiert und ich habe zu dauerhaften Verbindungen gewechselt. Könnte dies dazu führen, dass MySQL hohe CPU-Mengen verwendet?

+4

Persistente Verbindungen sind _amost_ immer nicht das richtige zu verwenden. – jason

+0

Ich werde sie jetzt ausziehen und auf einen Unterschied achten, weil ich mich nie daran erinnern kann, dass die CPU vor einem Monat über 2 war! – Juddling

+2

Server haben tendenziell mehr als einen Kern. Die prozentuale CPU-Auslastung wird relativ zu einem Kern berechnet. Ein Prozess, der zwei Kerne vollständig nutzt, hat eine CPU-Auslastung von 200%. Hier verbraucht MySQL 100% eines Kerns und 60% eines anderen Kerns. Das bedeutet nicht, dass alle CPUs aufgebraucht sind, wahrscheinlich hat er immer noch mindestens zwei freie CPUs. – xaav

Antwort

211

Zuerst habe ich Sie wahrscheinlich sagen würde wollen dauerhafte Verbindungen zu deaktivieren, da sie fast immer mehr Schaden anrichten als Nutzen bringen.

Zweitens würde ich sagen, Sie möchten Ihre MySQL-Benutzer überprüfen, nur um sicherzustellen, dass niemand von einem Remote-Server verbinden kann. Dies ist auch eine wichtige Sicherheitsfrage.

Drittens würde ich sagen, dass Sie das Protokoll MySQL Slow Query aktivieren möchten, um alle Anfragen, die lange dauern, im Auge zu behalten und sicherzustellen, dass Sie keine Abfragen haben, die Schlüsseltabellen für Sie sperren lange.

Einige andere Dinge, die Sie überprüfen wäre, die folgende Abfrage auszuführen, während die CPU-Auslastung hoch ist: Dies zeigt Ihnen alle Fragen

SHOW PROCESSLIST; 

, die derzeit ausgeführt werden oder in der Warteschlange zu laufen, was die Abfrage ist und was es tut (dieser Befehl wird die Abfrage abschneiden, wenn sie zu lang ist, Sie können SHOW FULL PROCESSLIST verwenden, um den vollständigen Abfragetext zu sehen).

Sie werden auch ein Auge auf Dinge wie Ihre Puffergrößen halten wollen, table cache, query cache und innodb_buffer_pool_size (wenn Sie InnoDB-Tabellen verwenden) als alle diese Speicherzuordnungen kann eine, die auf die Abfrageleistung auswirken kann dazu führen, MySQL, um CPU zu verbrauchen.

Sie werden wahrscheinlich auch die folgenden Informationen lesen, da sie einige gute Informationen enthalten.

Es ist auch eine sehr gute Idee, einen Profiler zu verwenden. Etwas, das Sie aktivieren können, wenn Sie möchten, zeigt Ihnen, welche Abfragen Ihre Anwendung ausführt, ob es doppelte Abfragen gibt, wie lange sie dauern usw. usw. Ein Beispiel für etwas wie dieses ist eines, an dem ich gerade gearbeitet habe PHP Profiler aber es gibt viele da draußen. Wenn Sie eine Software wie Drupal, Joomla oder Wordpress verwenden, sollten Sie sich innerhalb der Community erkundigen, da es wahrscheinlich Module gibt, mit denen Sie diese Informationen erhalten, ohne manuell etwas integrieren zu müssen.

+10

vielen Dank dafür, entfernte ich persistente Verbindungen und richtete dann das langsame Abfrageprotokoll ein. Ich las das Protokoll und die meisten Abfragen kamen aus zwei Tabellen und die Tabellen wurden nicht richtig indiziert! es ca. 10 Minuten nur hier gewesen ist, aber das Ergebnis: CPU Belastung im Durchschnitt 0,48 (1 min) 0,95 (5 Minuten) 2,42 (15 Minuten) Dank sehr viel – Juddling

+0

gleiches Problem, durch Indizierung der Tabellen gelöst, die langsam nach unten der Prozess, danke Steven und Juddling – gabrielem

+0

@Juddling Könnten Sie bitte erläutern, wie Sie eine Tabelle indexieren? Vielleicht ein Link? Ich weiß, es ist eine Weile her, aber ich bin wirklich neu in diesem Ding. Entschuldigung für die noobish Frage – JayVDiyk

21

Wenn dieser Server nach außen hin sichtbar ist, es ist die Überprüfung wert, wenn es viele Anfragen, die von der Außenwelt verbinden (dh Menschen, die versuchen, in sie zu brechen)

+0

Nicht sicher, warum dies einen anonymen Downvote angezogen hat, da dies in der Vergangenheit für einige Systeme eine Ursache war. –

+0

Ich denke, die Abstimmung ist da, weil MySQL für die Außenwelt sichtbar ist, keine gute Idee. – MikeKulls

+6

@MikeKulls Nein, es ist keine gute Idee, da es als Ziel für viele Leute dienen wird, um Zugang zu versuchen, was eine hohe CPU-Last ergibt - daher meine Antwort als ein möglicher Grund. –

157

Da dies die Top-Post ist, wenn Sie Google für MySQL hohe CPU-Auslastung oder Belastung, ich werde eine zusätzliche Antwort hinzu:

Am 1. Juli 2012 eine Schaltsekunde wurde auf die aktuelle UTC- hinzugefügt Zeit, um die durch die Gezeiten verlangsamte Erdumdrehung auszugleichen.Wenn Sie ntp (oder ntpd) ausführen, wurde diese Sekunde zur Uhr Ihres Computers/Servers hinzugefügt. MySQLd scheint diese zusätzliche Sekunde auf einigen Betriebssystemen nicht zu mögen und bringt eine hohe CPU-Belastung mit sich. Die schnelle Lösung ist (als root):

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

Da der ursprüngliche Post vor ungefähr 3 Jahren war, bezweifle ich, dass es das Problem des ursprünglichen Posters ist. Aber es war die Ursache für mein Problem und rettete mich gerade jetzt - also danke! Weitere Informationen: http://blog.mozilla.org/it/2012/06/30/mysql-and-the-leap-second-high-cpu-and-the-fix/ –

+5

Das gleiche Problem und die Lösung für mich auf Ubuntu 12.04. Schritte, um etwas anders zu lösen: service ntp stop && date -s "datum" && service ntp start MySQL CPU-Auslastung fiel sofort von 50 - 100% auf 0 - 1% –

+0

yup, die es auf Amazon EC2 Linux AMI tat Tauschen Sie einfach 'service ntpd stop/start' für die init.d-Dateien. –