Должен ли я беспокоиться о состоянии сна MySQL в списке процессов

Ответы:

17

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

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

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

Янне Пиккарайнен
источник
5

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

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

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

wolfgangsz
источник
3

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

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

  • Чтобы показать значение wait_timeout:
ПОКАЗАТЬ СЕССИИ ПЕРЕМЕННЫЕ, КАК 'wait_timeout';

+ --------------- + ------- +
| Переменное_имя | Значение |
+ --------------- + ------- +
| wait_timeout | 28800 |
+ --------------- + ------- +

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

  • Чтобы изменить значение переменной «wait_timeout»:
SET session wait_timeout = 600;
Запрос в порядке, затронуто 0 строк (0,00 с)

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

S.Bao
источник