12

我正在向连接到 mysql 服务器的 Web 应用程序注入压力测试,并且正在监视 mysql 的显示进程列表。

当负载很高(高交换 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 并停止处理传入请求......

知道这些过程是什么,它们在那里做什么:)?

4

2 回答 2

15

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

于 2010-10-29T16:36:37.993 回答
3

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

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

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

我有类似的情况,并且正在使用打开 pconnect 的 Codeigniter。将其关闭后(看看如何),每个连接在使用后都被正确关闭,我的 MySQL 进程列表为空。

性能:上面没有争论性能,只是试图解释为什么你可能会在 MySQL 中看到很多休眠连接。就性能而言,让连接保持活跃可能不是负面的。更多信息请访问:http ://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

于 2013-04-03T06:45:56.467 回答