我正在为连接到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并停止处理传入的请求...
知道那些流程是什么以及他们在那里做了什么:)?
答案 0 :(得分:14)
这些是客户端持有的空闲连接。您应该确保您正在使用的任何客户端库(JDBC,...)配置为不使未使用的连接保持打开这么长时间,或者您的#clients * max#of connections不是太大。
答案 1 :(得分:3)
我的猜测是你正在使用持久连接,例如php中的pconnect:
[..]连接时,该函数首先尝试查找已使用相同主机,用户名和密码打开的(持久)链接。如果找到一个,将返回其标识符,而不是打开新连接
和
[..]当脚本执行结束时,不会关闭与SQL服务器的连接。相反,链接将保持打开以供将来使用
我有类似的情况,并且正在使用Codeigniter打开pconnect。将其关闭(see how)后,每个连接在使用后都正常关闭,我的MySQL进程列表为空。
性能:以上内容并未就性能问题进行争论,而只是试图解释为什么在MySQL中可能会看到很多Sleep连接。在性能方面,使连接保持活动可能不是负面的。 更多信息:http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/