问题分析
sleep进程过多
造成睡眠连接过多的原因?
1. 使用了太多持久连接
2. 程序中,没有及时关闭mysql连接
3. 数据库查询不够优化,过度耗时。
使用如下命令查看mysql所有进程
mysql> show full processlist;
这里主要看以下几点!
Host 表示都有哪些地址和端口连接了数据库
Command 表示连接状态 sleep表示等待状态
Time 表示时间
info 具体执行的操作
通过命令查看得知sleep很多,而且time时间也不一样,有的甚至几千秒。大家都知道每一个进程都会占用相应的系统资源。如果sleep进程较多必定影响mysql使用。
如果某天你发现你的网站突然之后有些动态资源无法加载页面无法显示,很有可能是mysql进程太多导致客户端连接mysql的时候无资源可用 这是网站可能显示504 timeout
很多人有疑问为什么会有这么多sleep进程?
答:mysql默认wait_timeout=28800 也就是8小时,wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能。不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQL server has gone away”之类的问题。
这里引申出mysql的两种连接方式 长连接 and 短连接
长连接:长连接是相对于短连接来说的。长连接指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。MySQL的长连接如果长期闲置,mysql会8小时后(默认时间)主动断开该连接。
客户端连接--创建socket认证连接--维护连接--数据传输--维护连接--数据传输.....-关闭连接
短连接:是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。
客户端连接--创建socket认证连接--维护连接--数据传输--关闭连接
如何选择mysql连接方式?请根据具体情况而定
用户少,使用长连接,减少web端与数据库的逻辑连接数,可以让连接保持久一点,不用频繁建立连接。
用户多,使用短链接,这样用于使用完后就释放连接了。但是消耗系统资源多一点。
这里提供两种解决办法:
使用kill id 杀掉sleep进程 可以用脚本方式批量查杀
设置wait_timeout = 100
使用脚本批量查杀有可能造成数据崩溃,脚本请看这里
cat mysql_sleep.sh
#!/bin/sh
user=root
passwd=12345678
host=192.168.1.100
while :
do
n=`mysqladmin processlist -u$user -p$passwd -h$host | grep -i sleep | wc -l`
date=`date +%Y%m%d[%H:%M:%S]`
echo $n
if [ "$n" -gt 20 ]
then
for i in `mysqladmin processlist -u$user -p$passwd -h$host | grep -i sleep | awk ‘{print $2}‘`
do
mysqladmin -u$user -p$passwd -h$host kill $i
done
echo "sleep is too many I killed it " >> /tmp/sleep.log
echo "$date : $n" >> /tmp/sleep.log
fi
sleep 1
done
本文出自 “蜗牛的嘲讽” 博客,转载请与作者联系!
原文地址:http://imork.blog.51cto.com/11642843/1876522