减少MySQL的Sleep进程有效方法及杀死mysql sleep进程的脚本

经常遇到很多朋友问到,他的MySQL中有很多Sleep进程,严重占用MySQL的资源,现在分析一下出现这种现象的原因和解决办法:

1,通常来说,MySQL出现大量Sleep进程是因为采用的PHP的MySQL长链接数据库方式,即使用了mysql_pconnect来打开链接数据库,解决办法就是使用“短”链接,即mysql_connect函数。
2,在使用mysql_connect短链接方式打开数据库,每个页面在打开数据库后,执行SQL完成,当页面脚本结束的时候,这个MySQL连接会自动关闭并且释放内存。但仍然出现大量Sleep进程,可以看看网站是否存在以下几个方面的问题。
A,硬盘上存在大量的静态文件,或者WEB服务器负荷太重,在处理HTTP请求响应变得太慢,这样也有可能导致出现大量Sleep进程,解决方法适当调整WEB服务参数和文件,一味的静态或者缓存化网页内容并不是灵丹妙药。
B,在网页脚本中,有些计算和应用可能非常耗时,比如在0秒的时候打开数据库执行完一段SQL代码后,网页脚本随即花了20秒钟进行一段复杂的运算,或者 是require了一个庞大的PHP文件(比如含有几千个违规关键字的过滤函数),哪么这个时候在MySQL后台看到的进程中,这个20秒的过程 MySQL并没有做任何事情了,一直处于Sleep状态,直到这个页面执行完毕或者达到wait_timeout值(被强行关闭),优化网页脚本,尽量让 程序快速运行,或者在执行这段耗时的运行过程中,执行mysql_close把当前MySQL链接强行关闭。
C,在采集站中,MySQL中大量的Sleep进程这类现象尤其明显(比如很多网友问道DeDeCMS的MySQL中出现大量Sleep),因为大部的采 集器页面在运行过程中,事先打开了一个MySQL链接(可能是为了验证用户权限等),然后开始使用file_get_contents之类的操作去获取一 个远程的网页内容,如果这个远程的站点访问速度太慢,比如花了10秒时间才把网页取回,哪么当前采集脚本程序就一直阻塞在这里,并且MySQL啥事也没 干,一直处于Sleep状态。解决方法同上,在发出file_get_contents采集远程网页的时候,使用mysql_close强行关闭 MySQL的连接,等采集完成在适当需要的时候再重新mysql_connect即可。
3,客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了。

总的说来,MySQL是一个非常高效快速的数据库,要让他发挥到最大的性能,同时也不要过量的去掘取他的优势所在,适当的分表(超过10G的表,在打开和关闭以前更新的时候效率明显下降很多),尽可能的优化SQL都可以做到事半功倍的。

解决办法:
1.修改配置文件my.cnf,在[mysqld]中添加
interactive_timeout和wait_timeout这两个值
interactive_timeout = 60
wait_timeout = 60

默认是8小时,改小它,改为60秒。
查看wait_timeout设置的值:
mysql> show variables like 'wait_timeout';
| wait_timeout | 28800 |

2.关闭pconnect()的链接方式用短连接。
3.及时调用mysql_close()关闭MySQL连接。至于何时该去调用mysql_close(),最正确的做法是如果下面不再执行mysql的操作了,在你上一次执行完mysql操作后,立刻就调用mysql_close()。这才是最正确的做法,并不是总要把mysql_close()写在页面最后一行就可以了。
4.用脚本定时杀掉sleep进程

#!/bin/bash

passwd='YourPassword';
echo "`date` killing sleep process..." >> /tmp/crontab.log 
for id in `mysql -u root -p$passwd -e "show processlist"|grep -i -E 'sleep|locked'  | awk '{if($6>100){print $1}}'` 
do 
	echo "killing pid $id" >> /tmp/crontab.log 
	echo `mysql -u root -p$passwd -e "kill $id"` 
done

参考资料:
杀掉进程 mysql sleep进程:http://hi.baidu.com/woaidelphi/item/5f4dc44477e5a112886d106c
mysql linux定时杀掉sleep进程:http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7840.html
MySQL为什么会有一大堆在Sleep的进程?:http://blog.csdn.net/tg2003/article/details/4752689

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据