我有一个MySQL 5.6.27-0ubuntu0.14.04.1,它运行在带有4个CPU的Google Compute实例上。
我注意到如果我连接睡眠很长时间,那么服务器的CPU将以线性方式增加。我不明白为什么?如果我终止Sleep连接,那么CPU只能恢复到正确的使用状态。
总结一下,我有以下几点:
我注意到我的实例的CPU正在增加:
然后我检查服务器上的进程列表
mysql> show processlist
-> ;
+-------+--------+-------------------+----------------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+--------+-------------------+----------------+---------+------+-------+------------------+
| 85949 | nafora | paper-eee-2:58461 | state_recorder | Sleep | 1300 | | NULL |
| 85956 | nafora | paper-eee-2:58568 | state_recorder | Sleep | 64 | | NULL |
| 85959 | root | localhost | NULL | Query | 0 | init | show processlist |
+-------+--------+-------------------+----------------+---------+------+-------+------------------+
你可以看到我只有2个连接睡眠,一个连接在这里1300秒(因为我有一个连接打开的进程)
有人可以解释为什么正在睡觉的单个连接会像这样影响我的数据库。
感谢。
答案 0 :(得分:2)
某些非关闭连接或长时间运行的慢查询可能会导致此行为。您可以通过将全局变量wait_timeout配置为合理值来限制非闭合连接,并根据最佳实践设置另一个相关变量interactive_timeout。
使用连接池(Java,.NET等)的有状态应用程序需要调整wait_timeout以匹配其连接池设置。默认的8小时(wait_timeout = 28800)适用于正确配置的连接池。
将 wait_timeout 配置为略长于应用程序连接池的预期连接生存期。这是一个很好的安全检查。同时对查询进行概要分析以观察MySQL实例的性能可以帮助您避免I/O bottlenecks。