在MySQL命令中显示PROCESSLIST:sleep


83

当我在MySQL数据库中运行SHOW PROCESSLIST时,得到以下输出:

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

我想知道Command下的“睡眠”过程。这是什么意思?为什么它已经运行很长时间并且显示NULL?这使数据库变慢,当我终止进程时,它便可以正常工作。请帮我。


它什么也没做,只是坐在那里并“等待”连接。
Rufinus 2012年

1
我们可以找到哪个查询正在等待连接吗?我的que是否有意义?为何它会减慢数据库速度?
gthm 2012年

8
它不是等待连接的查询。它的连接指针等待超时终止。并且对性能没有影响。唯一的用途是每个连接都需要几个字节。最糟糕的情况是使用池中的一个连接,如果您要通过控制台客户端多次连接,而只是在不关闭连接的情况下关闭客户端,则可能会耗尽所有连接,并且必须等待超时才能再次连接...但是这极不可能:-)
Rufinus 2012年

2
@Rufinus,我有同样的问题。为什么这么说,但这极不可能?哪些参数与my.cnf中的配置超时休眠连接有关?
Hamidreza

Answers:


75

这不是等待连接的查询。它是等待超时终止的连接指针。

它对性能没有影响。唯一的用途是每个连接都需要几个字节。

最糟糕的情况是:它使用池中的一个连接;如果您要通过控制台客户端多次连接,而只是在不关闭连接的情况下关闭客户端,则您可能会用尽所有连接,并且必须等待超时才能再次连接...但是这种可能性很小:-)

看到MySql Proccesslist中充满了导致“连接过多”的“睡眠”条目吗?/dba/1558/how-long-is-too-long-for-mysql-connections-to-sleep以获取更多信息。


2
问题可能在于您与数据库的连接有限。因为即使这些连接都不会影响性能,所以它们仍算作连接。
mrd

25

“睡眠”状态连接通常由维护与数据库的持久连接的代码创建。

这可以包括由应用程序框架创建的连接池,也可以包括客户端数据库管理工具。

如上面的评论中所述,实际上没有理由担心这些连接...除非您当然不知道连接来自何处。

(注意:如果您有一长串这类连接,则可能存在同时连接用尽的危险。)


5

我在这里找到了这个答案:https : //dba.stackexchange.com/questions/1558。简而言之,使用以下命令(或在my.cnf中)将消除超时问题。

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

如果连接保持睡眠状态3分钟(或您定义的任何状态),这将使连接终止。


0

睡眠意味着线程无能为力。时间过长,因为没有线程查询,但没有断开服务器连接,默认值为wait_timeout = 28800;因此您可以设置较小的值,例如10。也可以杀死线程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.