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.
mysql
processlist
gthm
źródło
źródło
Odpowiedzi:
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.
źródło
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ń).
źródło
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).
źródło
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.
źródło