MySQL hohe CPU-Auslastung [geschlossen]

191

Vor kurzem war meine Server-CPU sehr hoch.

Die durchschnittliche CPU-Auslastung beträgt 13,91 (1 Minute) 11,72 (5 Minuten) 8,01 (15 Minuten), und auf meiner Website ist der Datenverkehr nur geringfügig gestiegen.

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

Vor kurzem habe ich Tabellen optimiert und auf dauerhafte Verbindungen umgestellt. Könnte dies dazu führen, dass MySQL viel CPU verbraucht?

Durcheinander
quelle
4
Dauerhafte Verbindungen sind fast immer nicht das Richtige.
Jason
Ich werde sie jetzt ausziehen und auf einen Unterschied achten, weil ich mich nie daran erinnere, dass die CPU vor einem Monat über 2 war!
Juddling
2
Server haben in der Regel mehr als einen Kern. Die prozentuale CPU-Auslastung wird relativ zu einem Kern berechnet. Mit anderen Worten, ein Prozess, der zwei Kerne vollständig verbraucht, 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, höchstwahrscheinlich hat er noch mindestens zwei freie CPUs.
xaav
Hohe CPU bedeutet fast immer ineffiziente Abfragen. Solche werden normalerweise durch eine bessere Indizierung (insbesondere "zusammengesetzt") und / oder eine Neuformulierung der Abfrage gelöst.
Rick James

Antworten:

265

Zuerst würde ich sagen, dass Sie wahrscheinlich dauerhafte Verbindungen deaktivieren möchten, da diese fast immer mehr schaden als nützen.

Zweitens würde ich sagen, dass Sie Ihre MySQL-Benutzer überprüfen möchten, um sicherzustellen, dass niemand von einem Remote-Server aus eine Verbindung herstellen kann. Dies ist auch eine wichtige Sicherheitsmaßnahme.

Drittens würde ich sagen, dass Sie das MySQL Slow Query Log aktivieren möchten, um alle Abfragen im Auge zu behalten, die lange dauern, und damit sicherstellen, dass keine Abfragen Schlüsseltabellen zu lange blockieren.

Einige andere Dinge, die Sie überprüfen können, sind, die folgende Abfrage auszuführen, während die CPU-Auslastung hoch ist:

SHOW PROCESSLIST;

Dies zeigt Ihnen alle Abfragen, die gerade ausgeführt werden oder sich in der auszuführenden Warteschlange befinden, was die Abfrage ist und was sie tut (dieser Befehl schneidet die Abfrage ab, wenn sie zu lang ist. Sie können SHOW FULL PROCESSLIST verwenden, um den vollständigen Abfragetext anzuzeigen.) .

Sie wollen auch ein Auge auf Dinge wie Ihre Puffergrößen, halten Tabellen - Cache , Abfrage - Cache und innodb_buffer_pool_size als alle diese Speicherzuordnungen (wenn Sie InnoDB - Tabellen verwenden) kann eine auf die Abfrageleistung auswirken , welche MySQL dazu führen können , CPU auffressen.

Sie sollten 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 so etwas ist eines, an dem ich gearbeitet habe PHP Profiler, aber es gibt viele da draußen. Wenn Sie eine Software wie Drupal, Joomla oder Wordpress verwenden, sollten Sie sich in der Community erkundigen, da wahrscheinlich Module für diese verfügbar sind, mit denen Sie diese Informationen abrufen können, ohne etwas manuell integrieren zu müssen.

Steven Surowiec
quelle
12
Vielen Dank dafür, ich habe dauerhafte Verbindungen entfernt und dann das langsame Abfrageprotokoll eingerichtet. Ich habe das Protokoll gelesen und die meisten Abfragen kamen aus zwei Tabellen und die Tabellen waren nicht richtig indiziert! Es sind nur ungefähr 10 Minuten
vergangen,
gleiches Problem gelöst , indem die Tabellen indizieren , dass verlangsamen den Prozess, danke Steven und Juddling
gabrielem
@Juddling Könnten Sie bitte erläutern, wie Sie eine Tabelle indizieren? Vielleicht ein Link? Ich weiß, dass es eine Weile her ist, aber ich bin wirklich neu in dieser Sache. Entschuldigung für die noobische Frage
JayVDiyk
Das Protokollieren der langsamen Abfragen hat mir geholfen, mein spezielles Problem der hohen CPU-Auslastung zu finden. In meinem Fall war es ein Wordpress-Plugin (Ultimate-Tag-Cloud-Widget), das bei jedem Treffer eine monströse Abfrage durchführte, um nur die beliebten Tags anzuzeigen. Es ist ein großartiges Plugin, muss aber durch Caching erweitert werden (am Ende habe ich es angepasst, um mein Problem zu lösen).
Jkincali
Eine andere Sache, die einem anderen Problem geholfen hat, war das Ändern des oben erwähnten Parameters innodb_buffer_pool_size. Beim Versuch, die Ursache für die hohe CPU-Auslastung zu finden, habe ich irgendwo gelesen, dass innodb_buffer_pool_size mindestens die Größe der Datei ibdata1 haben sollte, die sich in / var / lib / mysql befindet. Es scheint, dass InnoDB viel effizienter arbeitet, wenn es im Speicher gespeichert werden kann. Dies kann in manchen Situationen schwierig sein, da ibdata1 sehr groß sein kann! Es wurde auch irgendwo vorgeschlagen, sicherzustellen, dass innodb_log_buffer_size 25% der Größe von innodb_buffer_pool_size beträgt.
Jkincali
167

Da dies der Top-Beitrag ist, wenn Sie nach einer hohen CPU-Auslastung oder -Last von MySQL suchen, füge ich eine zusätzliche Antwort hinzu:

Am 1. Juli 2012 wurde der aktuellen UTC-Zeit eine Schaltsekunde hinzugefügt, um die verlangsamte Erdrotation aufgrund der Gezeiten auszugleichen. Beim Ausführen von ntp (oder ntpd) wurde diese Sekunde zur Uhr Ihres Computers / Servers hinzugefügt. MySQLd scheint diese zusätzliche Sekunde auf einigen Betriebssystemen nicht zu mögen und führt zu einer hohen CPU-Auslastung. Die schnelle Lösung ist (als root):

$ /etc/init.d/ntpd stop
$ date -s "`date`"
$ /etc/init.d/ntpd start
RedPixel
quelle
22
Da der ursprüngliche Beitrag vor ungefähr 3 Jahren war, bezweifle ich, dass dies die Ursache für das Problem des ursprünglichen Posters ist. Aber es war die Ursache meines Problems und hat mich gerade gerettet - also danke! Weitere Informationen: blog.mozilla.org/it/2012/06/30/…
Russell G
5
Gleiches Problem & Lösung für mich unter Ubuntu 12.04. Schritte, um etwas anders zu lösen: Service ntp stop && date -s " date" && service ntp start Die MySQL-CPU-Auslastung ging sofort von 50 - 100% auf 0 - 1% zurück
David Laing
2
Kann dies nur ausgeführt werden, um sicherzugehen? Ich meine, ist es sicher, es auszuführen, auch wenn es nicht der Grund ist?
Muhammad Gelbana
2
1. Juli 2015 - Ich habe gerade diesen Schaltsekundenfehler auf einem aktuellen AWS EC2-Server mit Amazon Linux erlebt. Verwenden Sie sudo service ntpd stopdiese Konfiguration.
Matt van Andel
1
+1 für diese Lösung. Mein MySQL lief monatelang ohne Grund mit 50-60%, nachdem ich diese Lösung angewendet hatte, ging es jetzt auf 0,0-0,3% zurück, wie es sein sollte. Vielen Dank.
Zeeshan
32

Wenn dieser Server für die Außenwelt sichtbar ist, sollten Sie überprüfen, ob er viele Anfragen zur Verbindung von der Außenwelt hat (dh Leute, die versuchen, in ihn einzudringen).

Rowland Shaw
quelle
1
Ich bin mir nicht sicher, warum dies zu einer anonymen Ablehnung geführt hat, da dies in der Vergangenheit für einige Systeme eine Ursache war.
Rowland Shaw
2
Ich denke, die Abwahl ist, weil es keine gute Idee ist, MySQL für die Außenwelt sichtbar zu machen.
MikeKulls
9
@MikeKulls Nein, es ist keine gute Idee, da es als Ziel für viele Menschen dienen wird, um Zugang zu erhalten, was eine hohe CPU-Auslastung zur Folge hat - daher meine Antwort als ein möglicher Grund.
Rowland Shaw
16
Ich hasse es, wenn jemand nur abstimmt und geht!
Muhammad Gelbana
1
+1, weil dies ein absolut legitimer Grund für MySQL ist, eine hohe CPU-Auslastung zu haben, und jeder, für den dies die Antwort ist, braucht diese Informationen wirklich wirklich!
Chris Browne