Czy powinienem się martwić procesem stanu uśpienia mysql na liście procesów

11

Podczas działania strony internetowej na liście procesów mysql widzę kilka procesów z kolumną „komenda” oznaczoną jako „SLEEP”.

Powinienem się martwić? Jak to zatrzymać?

Hao
źródło

Odpowiedzi:

17

Nawet najpotężniejsi z nas czasami muszą spać. Bez snu niepokoi się, a bezsenność może prowadzić do różnego rodzaju poważnych objawów.

Mówiąc poważniej: stan uśpienia oznacza, że ​​proces MySQL wykonał swoje zapytanie, ale po stronie klienta jeszcze się nie zakończyło. Wiele aplikacji internetowych nie czyści później swoich połączeń, co prowadzi do uśpienia procesów MySQL. Nie martw się, jeśli jest ich tylko kilka; MySQL wyczyści je po upływie określonego czasu (wait_timeout).

Lub jeśli twoja aplikacja internetowa używa trwałych połączeń i puli połączeń, to jest zupełnie normalne, że masz nawet wiele procesów uśpienia: w takim przypadku twoja aplikacja otwiera na przykład 100 połączeń SQL i utrzymuje je otwarte. To zmniejsza obciążenie związane z otwieraniem / zamykaniem połączenia. O ile twoja aplikacja nie jest bardzo zajęta, to normalne, że nie prawie każdy proces SQL ma coś do zrobienia, więc śpią.

Janne Pikkarainen
źródło
5

Nie, nie przejmuj się nimi, chyba że masz ich tysiące. Zazwyczaj wskazują połączenie z bazą danych, które obecnie nic nie robi, ale poza tym nadal żyje.

Wiele stron internetowych jest zbudowanych w taki sposób, że na początku przetwarzania strony otwiera się połączenie z bazą danych, a następnie wykorzystuje się je podczas generowania strony, a na końcu odrzuca na końcu. Jeśli odrzucenie zostanie wykonane poprawnie, połączenie z bazą danych zostanie zamknięte, a serwer zabije odpowiedni wątek, co oznacza, że ​​połączenie to znika z listy procesów.

Jeśli połączenie nie zostanie zamknięte, może pozostać w stanie „SLEEP” do momentu przekroczenia limitu czasu. W takim przypadku możesz skończyć z wieloma procesami spania. ale chyba że wystąpią problemy z pamięcią na serwerze db, nie jest to również duży problem.

wolfgangsz
źródło
3

Przed zwiększeniem zmiennej max_connections musisz sprawdzić, ile masz nieinteraktywnych połączeń, uruchamiając polecenie show processlist.

Jeśli masz wiele połączeń w trybie uśpienia, musisz zmniejszyć wartość zmiennej „wait_timeout”, aby zamknąć nieinteraktywne połączenie po pewnym czasie oczekiwania.

  • Aby wyświetlić wartość wait_timeout:
POKAŻ ZMIENNE SESJI JAK „wait_timeout”;

+ --------------- + ------- +
| Zmienna nazwa | Wartość |
+ --------------- + ------- +
| wait_timeout | 28800 |
+ --------------- + ------- +

wartość jest na sekundę, co oznacza, że ​​nieinteraktywne połączenie nadal trwa do 8 godzin.

  • Aby zmienić wartość zmiennej „wait_timeout”:
Sesja SET wait_timeout = 600;
Zapytanie OK, dotyczy 0 wierszy (0,00 s)

Po 10 minutach, jeśli połączenie uśpienia nadal śpi w mysql lub MariaDB, porzuć to połączenie.

S.Bao
źródło