ПОКАЗАТИ ПРОЦЕСЛІСТ в команді MySQL: спати


83

Коли я запускаю SHOW PROCESSLIST у базі даних MySQL, я отримую такий результат:

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 | 
+--------+------+-----------+-------+---------+-------+-------+------------------------+

Я хотів би знати процес "Сон", який знаходиться під командою. Що це означає? Чому він працює давно і показує NULL? Це робить базу даних повільною, і коли я вбиваю процес, вона працює нормально. Будь ласка, допоможи мені.


він нічого не робить, просто там сидить і "чекає" зв’язку.
Руфін

1
ми можемо знайти, який запит чекає на підключення? чи має мій сенс якийсь сенс? І чому це уповільнює мою базу даних?
gthm

8
це не запит, який чекає з’єднання. це покажчик з'єднання, який очікує закінчення часу очікування. і це не впливає на продуктивність. Єдине, що його використання - це кілька байтів, як це робить кожне з’єднання. Насправді найгірший випадок - використання одного підключення до вашого пулу, якщо ви підключаєтеся кілька разів за допомогою консольного клієнта і просто закриваєте клієнта, не перериваючи з’єднання, ви можете використати всі свої з’єднання, і вам доведеться чекати часу очікування, щоб мати можливість знову підключитися ... але це малоймовірно :-)
Руфін

2
@Rufinus, у мене така сама проблема. Чому ви говорите, але це дуже малоймовірно ? І які параметри пов’язані з конфігурацією тайм-ауту сплячих з'єднань у my.cnf?
Хамідреза

Відповіді:


75

Це не запит, який чекає з’єднання; це покажчик з'єднання, який очікує закінчення часу очікування.

Це не впливає на продуктивність. Єдине, що він використовує - це кілька байтів, як це робить кожне з’єднання.

Насправді найгірший випадок: це використання одного підключення вашого басейну; Якщо ви підключитеся кілька разів через консольний клієнт і просто закриєте клієнта, не перериваючи з’єднання, ви можете використати всі свої з’єднання і вам доведеться чекати часу очікування, щоб знову можна було підключитися ... але це малоймовірно :-)

Дивіться MySql Proccesslist, заповнений записами "Sleep", що ведуть до "Забагато з'єднань"? та /dba/1558/how-long-is-too-long-for-mysql-connections-to-sleep для отримання додаткової інформації.


2
Проблема може полягати в тому, що у вас обмежені підключення до бази даних. Оскільки навіть ці зв’язки не впливають на продуктивність, вони все одно вважаються зв’язком.
сказано

25

Зв'язки стану "сплячого режиму" найчастіше створюються кодом, який підтримує постійні з'єднання з базою даних.

Це може включати або пули підключень, створені фреймворками програм, або засоби адміністрування баз даних на стороні клієнта.

Як зазначалося вище в коментарях, насправді немає причин турбуватися про ці зв’язки ... якщо, звичайно, ви не уявляєте, звідки зв’язок.

(CAVEAT: Якщо у вас довгий список подібних типів з'єднань, може існувати небезпека закінчення одночасних з'єднань.)


5

Я знайшов цю відповідь тут: /dba/1558 . Коротше кажучи, використання наведеного нижче (або в межах my.cnf) видалить проблему з тайм-аутом.

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

Це дозволяє з’єднанням припинятися, якщо вони залишаються у сплячому стані протягом 3 хвилин (або що б ви не визначили).


0

Сон означає, що нитка нічого не робить. Час занадто великий, оскільки запит антору в потоці, але не відключення сервера, за замовчуванням wait_timeout = 28800, тому ви можете встановити значення меншими, наприклад 10. Також ви можете вбити потік.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.