SHOW PROCESSLIST в команде MySQL: sleep

85

Когда я запускаю 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? Это замедляет работу базы данных, и когда я убиваю процесс, он работает нормально. Пожалуйста, помогите мне.

gthm
источник
он ничего не делает, он просто сидит и «ждет» соединения.
Руфинус
1
можем ли мы найти, какой запрос ожидает подключения? имеет ли моя очередь какой-то смысл? И почему это замедляет мою базу данных?
gthm
8
это не запрос, ожидающий подключения. это указатель соединения, ожидающий завершения тайм-аута. и это не влияет на производительность. Единственное, что он использует, - это несколько байтов, как и каждое соединение. В самом худшем случае - это использование одного соединения вашего пула, если вы подключитесь несколько раз через консольный клиент и просто закроете клиент, не закрывая соединение, вы можете использовать все свои соединения и дождаться тайм-аута, чтобы снова подключиться ... но это маловероятно :-)
Руфинус
2
@Rufinus, у меня такая же проблема. Почему вы говорите, но это маловероятно ? И какие параметры связаны с тайм-аутом спящих подключений в my.cnf?
Hamidreza

Ответы:

75

Это не запрос, ожидающий подключения; это указатель соединения, ожидающий окончания тайм-аута.

Это не влияет на производительность. Единственное, что он использует, - это несколько байтов, как и каждое соединение.

Наихудший случай: используется одно соединение вашего пула; Если вы подключитесь несколько раз через консольный клиент и просто закроете клиент, не закрывая соединение, вы можете использовать все свои подключения и дождаться тайм-аута, чтобы снова подключиться ... но это маловероятно :-)

Видите MySql Proccesslist, заполненный записями «Сон», ведущими к «Слишком много подключений»? и /dba/1558/how-long-is-too-long-for-mysql-connections-to-sleep для получения дополнительной информации.

Руфинус
источник
2
Проблема может быть в том, что у вас ограниченное количество подключений к базе данных. Поскольку даже эти подключения не влияют на производительность, они все равно считаются подключением.
опубликовано
26

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

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

Как упоминалось выше в комментариях, на самом деле нет причин беспокоиться об этих подключениях ... если, конечно, вы не знаете, откуда идет соединение.

(ПРЕДОСТЕРЕЖЕНИЕ: если у вас есть длинный список таких подключений, может возникнуть опасность исчерпания одновременных подключений.)

Нарисовал
источник
5

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

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

Это позволяет соединениям завершаться, если они остаются в состоянии сна в течение 3 минут (или в зависимости от вашего определения).

Антоний
источник
0

Сон означает, что поток ничего не делает. Время слишком велико из-за запроса потока, но не отключать сервер, по умолчанию wait_timeout = 28800; поэтому вы можете установить меньшие значения, например 10. также вы можете убить поток.

звон
источник