Sollte ich mir Gedanken über den Prozess des MySQL-Schlafstatus in der Prozessliste machen?

11

Während des Website-Betriebs werden in der MySQL-Prozessliste einige Prozesse angezeigt, deren Spalte "Befehl" als "SCHLAF" gekennzeichnet ist.

Sollte ich mir Sorgen machen? Wie kann man das aufhalten?

Hao
quelle

Antworten:

17

Selbst die Mächtigsten von uns müssen manchmal schlafen. Ohne Schlaf wird man ängstlich und Schlaflosigkeit kann zu allen möglichen schwerwiegenden Symptomen führen.

Ernsthafter: Der Ruhezustand bedeutet, dass der MySQL-Prozess seine Abfrage abgeschlossen hat, die Clientseite jedoch noch nicht beendet wurde. Viele Webanwendungen bereinigen ihre Verbindungen danach nicht mehr, was dazu führt, dass MySQL-Prozesse nicht mehr funktionieren. Mach dir keine Sorgen, wenn es nur eine Handvoll von ihnen gibt; MySQL bereinigt diese nach einer konfigurierbaren Zeitüberschreitung (wait_timeout).

Wenn Ihre Webanwendung dauerhafte Verbindungen und Verbindungspools verwendet, ist es völlig normal, dass sogar viele Ruheprozesse ausgeführt werden. In diesem Fall öffnet Ihre Anwendung beispielsweise nur 100 SQL-Verbindungen und hält sie offen. Dies reduziert den Aufwand für das Öffnen / Schließen der Verbindung. Wenn Ihre Anwendung nicht sehr beschäftigt ist, ist es normal, dass nicht fast jeder SQL-Prozess etwas zu tun hat, sodass sie schlafen.

Janne Pikkarainen
quelle
5

Nein, mach dir keine Sorgen um sie, es sei denn, du hast Tausende von ihnen. Normalerweise weisen sie auf eine Datenbankverbindung hin, die derzeit nichts tut, aber ansonsten noch aktiv ist.

Viele Websites sind so aufgebaut, dass zu Beginn der Verarbeitung einer Seite eine Datenbankverbindung geöffnet, dann während der gesamten Generierung der Seite verwendet und am Ende endgültig verworfen wird. Wenn das Verwerfen ordnungsgemäß durchgeführt wird, wird die Datenbankverbindung geschlossen und der Server beendet dann den entsprechenden Thread. Dies bedeutet, dass diese Verbindung aus der Prozessliste verschwindet.

Wenn die Verbindung nicht geschlossen wird, bleibt sie möglicherweise im Status "SLEEP", bis das Zeitlimit überschritten wird. In diesem Fall kann es zu vielen Schlafprozessen kommen. Aber wenn Sie nicht auf Speicherprobleme auf dem Datenbankserver stoßen, ist dies auch kein großes Problem.

wolfgangsz
quelle
3

Bevor Sie die Variable max_connections erhöhen, müssen Sie überprüfen, wie viele nicht interaktive Verbindungen Sie haben, indem Sie den Befehl show processlist ausführen.

Wenn Sie viele Schlafverbindungen haben, müssen Sie den Wert der Variablen "wait_timeout" verringern, um die nicht interaktive Verbindung nach einigen Wartezeiten zu schließen.

  • So zeigen Sie den Wert wait_timeout an:
SHOW SESSION VARIABLES LIKE 'wait_timeout';

+ --------------- + ------- +
| Variablenname | Wert |
+ --------------- + ------- +
| wait_timeout | 28800 |
+ --------------- + ------- +

Der Wert ist in Sekunden. Dies bedeutet, dass die nicht interaktive Verbindung immer noch bis zu 8 Stunden dauert.

  • So ändern Sie den Wert der Variablen "wait_timeout":
SET session wait_timeout = 600;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Nach 10 Minuten, wenn die Schlafverbindung noch schläft, trennen MySQL oder MariaDB diese Verbindung.

S.Bao
quelle