mysq解决sleep进程过多的办法

问题分析

sleep进程过多

造成睡眠连接过多的原因?

1. 使用了太多持久连接

2. 程序中,没有及时关闭mysql连接

3. 数据库查询不够优化,过度耗时。

使用如下命令查看mysql所有进程

mysql> show full processlist;

这里主要看以下几点!

  1. Host 表示都有哪些地址和端口连接了数据库
  2. Command 表示连接状态 sleep表示等待状态
  3. Time 表示时间
  4. 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端与数据库的逻辑连接数,可以让连接保持久一点,不用频繁建立连接。
用户多,使用短链接,这样用于使用完后就释放连接了。但是消耗系统资源多一点。

这里提供两种解决办法:

  1. 使用kill id   杀掉sleep进程  可以用脚本方式批量查杀
  2. 设置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

时间: 2024-08-28 14:00:05

mysq解决sleep进程过多的办法的相关文章

解决openoffice进程异常退出的办法:

实现以守护进程,定时检测openoffice是否退出,如果进程不存在,通过脚本将openoffice起起来即可. 具体操作步骤: 第一步: 将openoffice.sh脚本放置在root目录下面,(也可自行决定),如图所示: 脚本内容: [java] view plain copy #!/bin/sh #set -x OPENOFFICEPID=`ps -ef|grep "/opt/openoffice4/program/soffice"|grep -v grep|grep -v gr

Hadoop集群datanode死掉或者secondarynamenode进程消失处理办法

当Hadoop集群的某单个节点出现问题时,一般不必重启整个系统,只须重启这个节点,它会自动连入整个集群. 在坏死的节点上输入如下命令即可: hadoop-daemon.sh start datanode hadoop-daemon.sh start secondarynamenode 案例如下: hadoop节点死机,能ping通,ssh连接不上 案例: 时间:2014/9/11 上午 表现:hadoop的web界面上TC-hadoop018节点dead 症状:节点TC-hadoop018的ss

解决android模块化升级的办法

关于原生android版本更新升级必须整个apk更新安装,不能实现部分模块化升级的解决思路: 原生+web混合型APP~ 具体应客户要求,程序必须实现模块化升级,不管用何种办法,我是这么做的,每个功能首页写成html放本地(asset),html里面action操作全部请求服务器端的,之间的传值使用签名+验签方式确保信息安全 [首页放本地而不放服务端是解决即使没网情况下,也可以很友好的给用户展示一个页面] 这个只是我想到的一种解决方案,还有好的方案,请一起分享 public class Main

解决TCP连接数过多的问题

TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题 TCP状态迁移 大家对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基本上显示着established,time_wait,close_wait等,这些到底是 什么意思呢,在这篇文章,我将会详细的阐述. 大家很明白TCP初始化连接三次握手吧:发SYN包,然后返回SYN/ACK包,再发ACK包,连接正式建立.但是这里有点出入,当请求者收到SYS /ACK包后,就开始建立连接了,而被请求者第三次握手结束后才

轻松解决MYSQL数据库连接过多的错误

1.数据库系统允许的最大可连接数max_connections.这个参数是可以设置的.如果不设置,默认是100.最大是16384. 2.数据库当前的连接线程数threads_connected.这是动态变化的. 查看max_connections.max_connections的办法见后. 如果 threads_connected == max_connections 时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝,如果程序没做太多的错误处理,就会出现

解决NSDistributedLock进程互斥锁的死锁问题(一)

在MAC下的多进程开发中,NSDistributedLock是一个非常方便的互斥锁解决方案,一般的使用方法: 12345678 NSDistributedLock *lock = [[NSDistributedLock alloc] initWithPath:@"/Users/mac/Desktop/lock.lock"];while (![lock tryLock]){ sleep(1);} //do something[lock unlock]; 但在实际使用过程中,当执行到do

php-cgi进程过多,导致系统资源耗尽

1:top命令查看一下系统的cpu ram swap的使用情况 由上图分析,可以看出共有602个进程,其中有601个进程休眠了.这好像有点不对劲,内核进程也就80个左右,加上memcached, nginx, mysqld,也不会超出90个.除了这些,剩下的只有php-fpm管理的php-cgi,难道是…? CPU显示,CPU压力并不大,可以说没有压力.我们再看内存使用概要,发现4G的内存,消耗得所剩余无几(free+buffers), 95%以上的内存都已分配.交互空间使用情况,我们暂时不去关

Ubuntu下mysql5.6解决不支持中文的办法

解决步骤现总结如下: 1 修改mysql的配置文件 /etc/mysql/conf.d/mysql.cnf 在[mysql]的下方加入如下语句: no-auto-rehash    default-character-set=utf8 /etc/mysql/mysql.conf.d/mysqld.cnf 在[mysqld]下加入 socket        = /var/run/mysqld/mysqld.sock    port        = 3306    character-set-s

Xcode6.0 解决无法输入中文的办法.

使用Xcode6.0模拟器不能在textField里面输入中文,也切换不过来,模拟器也添加了中文键盘,还是不能切换键盘输入中文. 解决办法:选中Xcode →product → scheme → Edit scheme → run → options → application Region 选项改为"中国"然后就可以输入中文了