mysql show sleep_mysq解决sleep进程过多的办法

问题分析

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值