Zu viele MySQL-Prozesse

12

Ich versuche einem Freund mit seinem Server zu helfen, nachdem er mir erzählt hat, dass sein MySQL zu viel Speicher belegt hat ... Es stellt sich heraus, dass nicht nur viel Speicher belegt ist, sondern auch viel zu viele MySQL-Prozesse ausgeführt werden!

Hier ist das Ergebnis von ps auxww|grep mysql: http://pastebin.com/kYrHLXVW

Grundsätzlich gibt es also 13 MySQL-Prozesse und laut mysqladmin ist nur 1 Client verbunden ...

Nach einer Weile verbraucht jeder dieser Prozesse bis zu 50 MB Speicher, sodass am Ende VIEL Speicher verbraucht wird ...

Ich verwende die Konfigurationsvorlage my-medium.cnf direkt aus / usr / share / mysql ... Ich habe den mysql-Server neu gestartet, aber sobald er startet, sind die 13 Prozesse wieder da ... Ich habe keine Ahnung, was die problem könnte sein ... über ideen / vorschläge würde ich mich sehr freuen!

user24994
quelle

Antworten:

16
mysql     9804  0.0  0.6 58556 22960 pts/0   S    12:43   0:00  \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9807  0.0  0.6 58556 22960 pts/0   S    12:43   0:00      \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9808  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9809  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9810  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
[ ... repeated output truncated ... ]

Sie benutzen nicht 13 * 50mb RAM - sie benutzen wahrscheinlich etwas wie 70mb total . Denken Sie daran, dass Linux unveränderte Speicherseiten zwischen Prozessen gemeinsam nutzt. Wenn Ihr Server also neu gestartet wird, wird der größte Teil dieses Speichers gemeinsam genutzt. Tatsächlich wird, da mysql ein Thread ist, wahrscheinlich nur noch weniger Speicher pro Thread zugewiesen. Wenn Sie sich Gedanken über die Speichernutzung der einzelnen MySQL-Prozesse machen, schauen Sie /etc/mysql/my.cnfsich die Variablen im Abschnitt mysqld an:

  • key_buffers
  • thread_stack
  • thread_cache_size
  • max_connections
  • query_cache_limit
  • query_cache_size

Seien Sie jedoch gewarnt, dass diese Variablen sehr leistungsfähig sind, und Sie können Ihre MySQL-Leistung leicht beeinträchtigen, indem Sie sie zu niedrig einstellen oder Speicher verschwenden, der an anderer Stelle verwendet werden könnte, indem Sie sie zu hoch einstellen.

Ein einfacher Ausgangspunkt, um herauszufinden, wie Sie Ihre mysql-Instanz am besten optimieren können , ist, eine Weile Ihre App auszuführen und dann von hier aus das mysqltune-Skript auszuführen , das Ihre Leistungsindikatoren analysiert und dann eine Empfehlung ausgibt , was Sie ändern sollten Ihre Serverkonfiguration.

Jason
quelle
1
Ich wusste es nicht mysqltune, sehr nützlich, danke. Außerdem können Sie htopdamit unsere Threads einfärben und den tatsächlich pro Prozess verwendeten Speicher anzeigen.
mveroone
3

Linux zeigt Threads als separate Prozesse an. MySQL startet einen Thread pro Verbindung. Laufen psmit f. Beispielsweise ps auxfwwird angezeigt, wie die Threads zusammenhängen.

Wie viele Verbindungen gibt es zu MySQL? Führen Sie show full processlist;im MySQL-Client. Nach dem, was Sie zeigen, bin ich nicht einmal zuversichtlich, dass etwas nicht stimmt.

Warner
quelle
Hier ist das Ergebnis: pastebin.com/raw.php?i=XNCsG6KS Der Server wurde gerade gestartet. Ich bin mir nicht sicher, ob es hilft. Mit Init-Skripten meinen Sie den Inhalt von /etc/init.d/mysql?
user24994
Das sieht für mich ganz normal aus.
Warner
Laut show full processlistgibt es 2 Verbindungen zur Datenbank. Einer von ihnen ist localhost executing show full processlist, der andere bin auch ich, via phpmyadmin. Es sollte keine Verbindung mehr geben, da die Seite noch nicht
online
Die Anzahl der Verbindungen hängt von der Leistung Ihrer Anwendung ab und hängt nicht unbedingt direkt von der Anzahl der Benutzer ab. MySQL verwendet Speicher basierend auf der CNF-Einstellung. Was lässt Sie denken, dass es etwas falsch macht?
Warner
Tut mir leid, ich denke, es war in meiner Frage nicht wirklich klar, haha, es ist absolut möglich, dass nichts falsch läuft! Mir ist gerade aufgefallen, dass MySQL sehr viel Speicher belegt (ca. 13 * 50 MB, also 650 MB RAM) und noch kein Datenverkehr auf der Site vorhanden ist. Also war meine Frage wohl eher "Stimmt etwas nicht?" anstelle von "Was ist los" :)
user24994
1

Vielleicht möchten Sie MySQLTuner ausprobieren, was ich sehr hilfreich fand. Es wird Ihnen vorschlagen, welche der Konfigurationsvariablen Sie anpassen sollten.

icc97
quelle
Für neue Leser ist das MySQLTuner-Skript hier platziert: mysqltuner.pl
Jesper Grann Laursen