今天收到运维同事短信,说有个线上业务"可能是数据库DB堵塞了,导致mysql链接过多,让我看一下"。
回家后赶紧用家里vpn登录数据库服务器,show processlist
看了以下,发现我的那个业务的DB确实有很多sleep链接没有关闭。
以前也曾遇到过类似的问题,导致此问题的原因从网上查了,大体有几下几种原因:
造成睡眠连接过多的原因?
1. 使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)
2. 程序中,没有及时关闭mysql连接
3. 数据库查询不够优化,过度耗时。
当然,更根本的方法,还是从以上三点排查之:
1. 程序中,不使用持久链接,即使用mysql_connect而不是pconnect。
2. 程序执行完毕,应该显式调用mysql_close
3. 只能逐步分析系统的SQL查询,找到查询过慢的SQL,优化之p
我是用排除法去定位问题,对于此原因,1和3通过分析,发现根本不满足
此处先排除是mysql 配置的问题,sleep的关闭时间是8个小时,默认值(show variables like
'wait_timeout';),并且服务器配置都是运维人员维护,我们的运维还是很出色的
排除1:
我的业务,php链接mysql并没有使用持久链接 mysql_pconn