Der MySQL-Prozess macht über 100% der CPU-Auslastung aus

10

Ich habe einige Probleme mit meinem LAMP-Server. In letzter Zeit wurde alles sehr langsam, obwohl sich die Besucherzahl auf meinen Websites nicht allzu sehr geändert hat. Wenn ich einen topBefehl ausführe , heißt es, dass der MySQL-Prozess 150-200% der CPU übernommen hat. Wie ist das möglich, ich dachte immer, dass 100% ein Maximum ist?

Ich verwende Ubuntu 9.04 Server Edition mit 1,5 GB RAM.

my.cnf die Einstellungen:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

Hier ist die Ausgabe von MySQLTuner :

MySQLTuner-Ausgabe

Der topBefehl:

Top-Ausgabe

Was könnte die Ursache für dieses Problem sein? Kann ich Änderungen an meinem my.cnfServer vornehmen, um zu verhindern, dass der Server hängt?

Temnovit
quelle

Antworten:

15
  1. Erhöhen Sie den Schlüsselpuffer (Ihr ist derzeit 64 MB groß, aber die Gesamtindizes sind 116 MB, also mindestens 128 MB). Sollte sofort helfen.
  2. Führen Sie mysqloptimize und mysqlrepair für Ihre Tabellen aus
  3. Erhöhen Sie den Tabellencache / verringern Sie die Gesamtzahl der Tabellen, um die Trefferquote des Tabellencaches zu erhöhen. Vielleicht haben Sie einige unbenutzte oder alte Tabellen, die gelöscht werden könnten.

Andere empfohlene Konfigurationsoptionen:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • Protokollabfragen, die keine Indizes verwenden

Überprüfen Sie die Protokolldatei nach einiger Zeit.

Shakalandy
quelle
Vielen Dank für die Empfehlungen, ich werde sie ausprobieren und Sie wissen lassen, ob es geholfen hat.
Temnovit
Sagen Sie mir bitte, wie haben Sie berechnet, dass die Gesamtindizes 116 Millionen betragen?
Temnovit
habe es mir selbst :)
Temnovit
5

Sie haben einen Prozessor mit mehr als einem Kern oder mehrere Prozessoren. Wenn Sie zwei Kerne haben und ein Prozess 100% beider Kerne verwendet, wird oben 200% angezeigt.

Ebenso funktioniert dies wahrscheinlich wie beabsichtigt - nichts ist falsch an Ihrer Konfiguration. Wenn Sie aufgrund der von Ihnen veröffentlichten Informationen häufig hängen bleiben, sollten Sie Ihre Tabellen mit geeigneten Indizes versehen (oder Ihre Abfragen optimieren).

Kyle Brantley
quelle
5

Führen Sie top -Hdiese Option aus , um alle laufenden Threads und nicht nur den gesamten Prozess anzuzeigen. Wenn Sie oben die 1Taste drücken, wird die CPU-Auslastung für die einzelnen CPUs / Kerne angezeigt.

Niall Donegan
quelle
Danke, das hat mir wirklich geholfen - ich benutze Top seit Jahren und wusste nicht, dass es diese Fähigkeit hat. Ich fand heraus, dass es einen "ewigen" MySQL-Thread gibt, der ständig 60% Benutzer-CPU verbraucht, während die Abfragethreads darüber hinaus kommen und gehen. Nun, um herauszufinden, was dieser Thread tatsächlich tut ...
Scipilot
1

In MySQL arbeiten mehrere Prozesse (Threads) unabhängig voneinander. Einer ist beispielsweise für das Schreiben von Daten aus dem Speicher auf die Festplatte verantwortlich. Bei mehreren Kernen in der CPU (und / oder mehreren CPUs) funktioniert mehr als ein Thread, sodass mehr als 100% eines einzelnen Kerns ausgeführt werden können. Auf einer vereinfachenden Ebene werden möglicherweise 75% jedes der beiden Kerne ausgeführt was 150% ergibt.

Alister Bulman
quelle
1

Ich habe ein Problem festgestellt, das nicht mit der CPU zusammenhängt. Wenn Sie Apache und MySQL auf demselben Server verwenden, können Sie schlechte Bedingungen ( RAM ) erreichen, wenn Ihre Apache-Aktivität zunimmt.

MySQLTunner teilt Ihnen mit, dass Sie mit den 200 verfügbaren Verbindungen (Ihrer maximalen Verbindungseinstellung) den RAM füllen. Angenommen, Sie haben Apache auf 150 Prozesse beschränkt. Sie werden sicherlich nicht genug RAM haben, wenn MySQL und Apache versuchen, 150 Verbindungen zu verwenden (da auch Apache ein guter RAM-Esser ist).

Hier geht es also um RAM und Sie sind vielleicht noch nicht getroffen :-) Die obersten Befehle zeigen nur 15 Apache-Prozesse an (aber Sie sind im Lastdurchschnitt 3/6/16, was bedeutet, dass der Sturm vor 15 Minuten war und jetzt in ist Verlassen).

Über das CPU-Problem, um die gute Antwort von Shakalandy zu ergänzen , kann dies an einer einzigen Abfrage liegen. Es kann sich in einer großen Tabelle befinden oder viele Aufgaben erneut indizieren oder viele temporäre Dateien verwenden, ein Index fehlt (entfernt?) Usw. Die einzige Möglichkeit, dies zu erkennen, besteht darin, das langsame Abfrageprotokoll zu aktivieren (möglicherweise) mit einem hohen Thresold, wie 8s). Dann nutzen Sie die mysqlsla Tool , um diese Log für langsame Abfragen zu analysieren, und führen Sie einige auf den identifizierten Abfragen erklären.

Regilero
quelle
Vielen Dank, in der Tat, MySQL ist nicht der einzige Prozess rund um :)
Temnovit