ПОКАЗАТИ ПРОЦЕСЛІСТ в команді 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.