zoukankan      html  css  js  c++  java
  • mysql sleep进程 过多

    如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800。


    wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQLhas goneaway”之类的问题,通常来说,我觉得把wait_timeout设置为10是个不错的选择,但某些情况下可能也会出问题,比如说有一个CRON脚本,其中两次SQL查询的间隔时间大于10秒的话,那么这个设置就有问题了(当然,这也不是不能解决的问题,你可以在程序里时不时mysql_ping一下,以便服务器知道你还活着,重新计算wait_timeout时间):


    # vi /etc/my.cnf


    [mysqld]

    wait_timeout=10


    # /etc/init.d/mysql restart

    不过这个方法太生硬了,线上服务重启无论如何都应该尽可能避免,看看如何在MySQL命令行里通过SET来设置:


    mysql> set global wait_timeout=10;


    mysql> show global variables like'wait_timeout';

    +----------------------------+-------+

    | Variable_name            | Value |

    +----------------------------+-------+

    | wait_timeout             | 10   |

    +----------------------------+-------+


    这里一个容易把人搞蒙的地方是如果查询时使用的是showvariables的话,会发现设置好像并没有生效,这是因为单纯使用show variables的话就等同于使用的是showsession variables,查询的是会话变量,只有使用show globalvariables,查询的才是全局变量。


    网络上很多人都抱怨说他们set global之后使用showvariables查询没有发现改变,原因就在于混淆了会话变量和全局变量,如果仅仅想修改会话变量的话,可以使用类似setwait_timeout=10;或者set session wait_timeout=10;这样的语法。


    另一个值得注意的是会话变量wait_timeout初始化的问题,这一点在手册里已经明确指出了,我就直接拷贝了:


    On thread startup, the session wait_timeout value isinitialized from the global wait_timeout value or from the globalinteractive_timeout value, depending on the type of client (asdefined by the CLIENT_INTERACTIVE connect option tomysql_real_connect()).


    MySQL大拿Jeremy Zawodny曾在他的文章Fixing Poor MySQL DefaultConfigurationValues里面列出了几个很恶心的MySQL缺省设置,不过没包含wait_timeout,但我觉得它也应该算一个,每次新装MySQL后最好都记得修改它。


    参考文章2

    睡眠连接过多,会对mysql服务器造成什么影响?


    严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。


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


    1. 使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)


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


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


    那么,如果要从根本上解决sleep连接过多,就得从以上三点反复检查,但是见效并不快。


    网上有人分享,使用shell脚本配合cron,定期杀死睡眠时间太久的连接,但是这种方法非常不可取,典型的以暴制暴,很可能导致数据崩溃,而且,还需要编写相应shell,设置cron, 实施成本较繁琐,不推荐使用。


    那么更好的办法应该是让mysql自己决定这些睡眠连接的命运,实施会更简单,有效。


    mysql的配置文件中,有一项:


    wait_timeout, 即可设置睡眠连接超时秒数,如果某个连接超时,会被mysql自然终止,多好的办法!


    如设置: 


    wait_timeout=100#即设置mysql连接睡眠时间为100秒,任何sleep连接睡眠时间若超过100秒,将会被mysql服务自然终止,要比编写shell脚本更简单。


    那么,对于正在运行中的生产服务器,在不能停止服务情况下,修改此项怎么办?很简单,以root用户登录到mysql,执行:


    set global wait_timeout=100


    即可。


    在我的生产环境中,使用这个办法,取得了相当好的效果。


    当然,更根本的方法,还是从以上三点排查之:


    1. 程序中,不使用持久链接,即使用mysql_connect而不是pconnect。


    2.   程序执行完毕,应该显式调用mysql_close


    3. 只能逐步分析系统的SQL查询,找到查询过慢的SQL,优化之


    PS: wait_timeout  设置为大于数据池执行心跳探雷的时间

  • 相关阅读:
    HDU2036 计算多边形的面积
    poj 3648 线段树成段更新
    线段树基本知识
    计算几何基本模板
    最长递增子序列问题—LIS
    poj 2503
    Python基础(5)_字符编码、文件处理
    Python基础(4)_字典、集合、bool值
    Python基础(3)_可变对象与不可变对象、列表、元祖和字典
    流程控制练习
  • 原文地址:https://www.cnblogs.com/signheart/p/6595401.html
Copyright © 2011-2022 走看看