数据库连接数居高不下,导致系统越来越慢

前段时间,公司系统突然异常缓慢,通过阿里云监控看到连接数突然陡增,并且不释放,以下是我们的处理步骤:

1、通过阿里云提供的监控日志查询是CPU过高,还是连接数过高导致的。

2、CPU过高可能与读写操作过高有关,我们是连接数过高导致的。

3、是否有程序发送大量的情况,频繁请求数据库导致连接数过高?不是

4、检查慢SQL是否过多,导致很多链接时间过长,导致链接不释放。这里可以通过show PROCESSLIST;或者阿里云提供的慢SQL工具来查找。

5、在show PROCESSLIST;中意外发现有大量的SLEEP的链接,并且每个达到上万秒,通过手动kill {id}的方式,把这些链接kill掉解决了这个难题(最笨的方法,应以尽快恢复服务为主,下面是正统的解决办法)。



那么造成sleep的原因,有三个,下面是mysql手册给出的解释:

1.客户端程序在退出之前没有调用mysql_close().
2.客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器. 
3.客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了. 
原文请见下面: 
1 The client program did not call mysql_close() before exiting. 
2 The client had been sleeping more than wait_timeout or interactive_timeout seconds without issuing any requests to the server. 
3 The client program ended abruptly in the middle of a data transfer 

其中1和3并不好排查,框架有时候就帮我们优化处理了很多。

关于2建议手动设置一下超时时间,我们公司竟然超时时长为1天,肯定是不行的,通过下面语句可进行调整:

mysql> set global wait_timeout=10;  
mysql> show global variables like '%timeout';  
另,wait_timeout默认情况下wait_timeout的值是8小时的时间,你可以改成1个小时,或半个小时。这样mysql会更快的杀死死连接。防止连接的数量越多,对你服务器的压力越大。实际上那些连接都是冗余的,把它们尽快杀死才是上策。


你可能感兴趣的:(Mysql)