当 show full processlist; 返回大量时间列为 0 的“睡眠”状态查询时,这可能是什么原因造成的?MySQL 实际上如何决定连接是否需要睡眠?与 mysql 通信的应用程序未使用持久连接。
答案1
睡眠状态仅表示连接处于空闲状态。即客户端已连接但未执行任何查询。
我建议您检查应用程序是否在完成所有未使用的 MySQL 线程后将其关闭,即使您没有使用持久连接。
可以使用变量在服务器端“控制”空闲连接wait_timeout
。但您最好找到问题的根本原因。
答案2
当你
mysql> show global variables like "wait%";
尝试通过编辑 my.cnf 来减少它,或者使用以下代码(以 root 身份)
mysql> SET GLOBAL wait_timeout=28801;
MySQL Performance Blog 上有一篇很好的文章,专门讨论睡眠查询http://www.mysqlperformanceblog.com/2007/02/08/debugging-sleeping-connections-with-mysql/
这也值得一看http://rackerhacker.com/2007/05/20/mysql-connections-in-sleep-state/
另一个想法是重读 Dan 的评论:不过,sleep(0) 时间很奇怪。在我看来,这似乎表明存在一些持久连接,它们实际上并没有处于休眠状态,而是至少每秒都会执行一些操作来重置计时器。如果您知道 Web 应用程序未使用持久连接,那么也许它会在循环或计时器函数中的某个地方直接调用 sleep()?
此外,如果您使用的是 PHP,您可以进入 php.ini 并进行设置mysql.allow_persistent = Off
,看看会发生什么。
PS 你运行的是哪个版本的 MySQL?4.1 中曾报告过类似的严重错误,但那是在 2005 年...