POKAŻ LISTĘ PROCESÓW w poleceniu MySQL: uśpienie

85

Kiedy uruchamiam SHOW PROCESSLIST w bazie danych MySQL, otrzymuję następujący wynik:

mysql> show full processlist;

+--------+------+-----------+--------+---------+-------+-------+-----------------------+
| Id     | User | Host      | db     | Command | Time  | State | Info                  |
+--------+------+-----------+-------+---------+-------+-------+-----------------------+
| 411665 | root | localhost | somedb | Sleep   | 11388 |       | NULL                  | 
| 412109 | root | localhost | somedb | Query   |     0 | NULL  | show full processlist | 
+--------+------+-----------+-------+---------+-------+-------+------------------------+

Chciałbym poznać proces „uśpienia” będący pod dowództwem. Co to znaczy? Dlaczego działa od dłuższego czasu i pokazuje NULL? Powoduje to spowolnienie bazy danych, a kiedy zabijam proces, działa normalnie. Proszę pomóż mi.

gthm
źródło
nic nie robi, po prostu siedzi i „czeka” na połączenie.
Rufinus
1
czy możemy znaleźć zapytanie, które czeka na połączenie? czy moja que ma jakiś sens? I dlaczego spowalnia moją bazę danych?
gthm
8
to nie jest zapytanie oczekujące na połączenie. jest to wskaźnik połączenia czekający na zakończenie limitu czasu. i nie ma to wpływu na wydajność. Jedyne, czego używa, to kilka bajtów, jak to robi każde połączenie. Naprawdę najgorszy przypadek to użycie jednego połączenia z twojej puli, jeśli połączysz się wiele razy przez klienta konsoli i po prostu zamkniesz klienta bez zamykania połączenia, możesz wykorzystać wszystkie połączenia i musisz czekać na limit czasu, aby móc ponownie połączyć ... ale jest to mało prawdopodobne :-)
Rufinus
2
@Rufinus, mam ten sam problem. Dlaczego mówisz, ale jest to wysoce nieprawdopodobne ? A jakie parametry są powiązane z konfiguracją połączeń uśpionych w pliku my.cnf?
Hamidreza

Odpowiedzi:

75

To nie jest zapytanie oczekujące na połączenie; jest to wskaźnik połączenia czekający na zakończenie limitu czasu.

Nie ma to wpływu na wydajność. Jedyne, czego używa, to kilka bajtów, tak jak w przypadku każdego połączenia.

Naprawdę najgorszy przypadek: używa jednego połączenia z puli; Jeśli łączysz się wiele razy za pośrednictwem klienta konsoli i po prostu zamkniesz klienta bez zamykania połączenia, możesz wykorzystać wszystkie połączenia i musisz poczekać na przekroczenie limitu czasu, aby móc połączyć się ponownie ... ale jest to bardzo mało prawdopodobne :-)

Widzisz listę procesów MySql wypełnioną wpisami „uśpienia” prowadzącymi do „zbyt wielu połączeń”? i /dba/1558/how-long-is-too-long-for-mysql-connections-to-sleep, aby uzyskać więcej informacji.

Rufinus
źródło
2
Problem może wystąpić, jeśli masz ograniczone połączenia z bazą danych. Ponieważ nawet te połączenia nie mają wpływu na wydajność, nadal liczą się jako połączenie.
dnia
26

Połączenia w stanie „uśpienia” są najczęściej tworzone przez kod, który utrzymuje trwałe połączenia z bazą danych.

Może to obejmować pule połączeń utworzone przez struktury aplikacji lub narzędzia administracyjne bazy danych po stronie klienta.

Jak wspomniano powyżej w komentarzach, naprawdę nie ma powodu, aby martwić się o te połączenia ... chyba, że ​​nie masz pojęcia, skąd pochodzi połączenie.

(OSTRZEŻENIE: Jeśli masz długą listę tego rodzaju połączeń, może wystąpić niebezpieczeństwo, że zabraknie jednoczesnych połączeń).

Rysował
źródło
5

Znalazłem tę odpowiedź tutaj: /dba/1558 . Krótko mówiąc, użycie poniższego (lub w my.cnf) usunie problem z limitem czasu.

SET GLOBAL interactive_timeout = 180; SET GLOBAL wait_timeout = 180;

Dzięki temu połączenia kończą się, jeśli pozostają w stanie uśpienia przez 3 minuty (lub cokolwiek zdefiniujesz).

Antony
źródło
0

Sen oznacza, że ​​nić nic nie robi. Czas jest zbyt długi, ponieważ zapytaj o wątek anthor, ale nie rozłącz serwera, domyślnie wait_timeout = 28800, więc możesz ustawić wartości mniejsze, np. 10. możesz również zabić wątek.

ding
źródło