Назад | Перейти на главную страницу

Стоит ли беспокоиться о процессе состояния сна mysql в списке процессов

Во время работы веб-сайта в списке процессов mysql я вижу несколько процессов, в столбце «команда» которых указано «SLEEP».

Я должен волноваться? Как это остановить?

Даже самым могущественным из нас иногда нужно спать. Без сна человек становится беспокойным, а бессонница может привести к всевозможным серьезным симптомам.

Более серьезно: состояние сна означает, что процесс MySQL выполнил свой запрос, но клиентская часть еще не завершилась. Многие веб-приложения впоследствии не очищают свои соединения, что приводит к спящему процессу MySQL. Не волнуйтесь, если их всего несколько; MySQL очистит их после настраиваемого периода ожидания (wait_timeout).

Или, если ваше веб-приложение использует постоянные соединения и пулы соединений, то совершенно нормально иметь даже много спящих процессов: в этом случае ваше приложение просто открывает, например, 100 соединений SQL и сохраняет их открытыми. Это снижает накладные расходы на открытие / закрытие соединения. Если ваше приложение не очень загружено, это нормально, что не почти каждому процессу SQL есть чем заняться, поэтому они спят.

Нет, не беспокойтесь о них, если у вас их не тысячи. Обычно они указывают на соединение с базой данных, которое в данный момент ничего не делает, но в остальном все еще живо.

Многие веб-сайты построены таким образом, что в начале обработки страницы открывается соединение с базой данных, затем используется на протяжении всего процесса создания страницы и, наконец, удаляется в конце. Если отбрасывание выполнено правильно, соединение с базой данных закрывается, а затем сервер убивает соответствующий поток, что означает, что это соединение исчезает из списка процессов.

Если соединение не закрыто, оно может оставаться в состоянии «SLEEP» до истечения времени ожидания. В этом случае у вас может быть много спящих процессов. но если вы не столкнетесь с проблемами памяти на сервере db, это тоже не большая проблема.

Перед увеличением переменной max_connections вы должны проверить, сколько у вас неинтерактивных подключений, выполнив команду show processlist.

Если у вас много спящих подключений, вам нужно уменьшить значение переменной «wait_timeout», чтобы закрыть неинтерактивное подключение после ожидания несколько раз.

  • Чтобы показать значение wait_timeout:
SHOW SESSION VARIABLES LIKE 'wait_timeout';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+

значение указано в секундах, это означает, что неинтерактивное соединение все еще до 8 часов.

  • Чтобы изменить значение переменной wait_timeout:
SET session wait_timeout=600;
Query OK, 0 rows affected (0.00 sec)

Через 10 минут, если спящее соединение все еще спит, mysql или MariaDB разорвут это соединение.