Mysql show processlist列出了许多进程sleep和info = null?

时间:2010-10-29 16:10:25

标签: mysql mysql-management

我正在为连接到mysql服务器的web应用程序注入压力测试,我正在监视mysql的show processlist。

当负载很高(高交换i / o)时,我会得到很多这样的过程:

| 97535 | db| localhost | userA | Sleep   |  515 |         | NULL 
| 97536 | db| localhost | userA | Sleep   |  516 |         | NULL 
| 97786 | db| localhost | userA | Sleep   |  343 |         | NULL 
| 97889 | db| localhost | userA | Sleep   |  310 |         | NULL 

但是我不明白为什么他们还在那里而且没有被杀?这最终导致我的应用程序使用所有max_connections并停止处理传入的请求...

知道那些流程是什么以及他们在那里做了什么:)?

2 个答案:

答案 0 :(得分:14)

这些是客户端持有的空闲连接。您应该确保您正在使用的任何客户端库(JDBC,...)配置为不使未使用的连接保持打开这么长时间,或者您的#clients * max#of connections不是太大。

答案 1 :(得分:3)

我的猜测是你正在使用持久连接,例如php中的pconnect

  

[..]连接时,该函数首先尝试查找已使用相同主机,用户名和密码打开的(持久)链接。如果找到一个,将返回其标识符,而不是打开新连接

  

[..]当脚本执行结束时,不会关闭与SQL服务器的连接。相反,链接将保持打开以供将来使用

我有类似的情况,并且正在使用Codeigniter打开pco​​nnect。将其关闭(see how)后,每个连接在使用后都正常关闭,我的MySQL进程列表为空。

性能:以上内容并未就性能问题进行争论,而只是试图解释为什么在MySQL中可能会看到很多Sleep连接。在性能方面,使连接保持活动可能不是负面的。 更多信息:http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/