对付 MySQL 的死连接,Sleep的进程的来源探究[转]

对付 MySQL 的死连接,Sleep的进程的来源探究[转]

当前的连接数:
mysql > show status like '%Threads_connected%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 27 |
+-------------------+-------+
1 row in set (0.00 sec)

最大连接数:
show variables like '%max_connections%';
set GLOBAL max_connections=800;
flush privileges
也可以修改/etc/my.cnf中的max_connections:
max_connections = 1000

关于php应该在何时调用mysql _close()以及pconnect方式 和传统方式有何种区别收藏
以前我一直认为,当php的页面执行结束时,会自动释放掉一切。相信很多人都跟我想的一样。但事实证明并不是这样。比如session就不会随着页面执行完毕而释放。
php的垃圾回收机制,其实只针对于php本身。对于mysql ,php没权利去自动去释放它的东西。如果你在页面执行完毕前不调用mysql _close(),那么mysql 那边是不会关闭这个连接的。如果你是用的是pconnect方式,即使你在页面执行完毕前调用mysql _close(),也无法另mysql 关闭这个连接。
也许在负载低的情况下,你感受不到有何不妥。但是,一旦负载很高,就回出现很多的死链接 ,于是得杀掉它们,现象:
在php中使用pconnect方式建立连接,然后到mysql 客户端下执行show processlist;如果你的负载到一定程度的话,你可以看到很多sleep的进程,这些进程就是人们常说的死连接,它们会一直保持sleep,直到my.cnf里面设置的wait_timeout这个参数值的时间到了,mysql 才会自己 杀死它。在杀死它的时候,mysql 还会在error-log里面记录一条Aborted connection xxx to db: 'xxx' user: 'xxx' host: 'xxx'的日志,用google 翻译一下,会得到一个相当强悍的解释"胎死腹中的连接"!
那么造成sleep的原因,有三个,下面是mysql 手册给出的解释:
1.客户端程序在退出之前没有调用mysql _close().[写程序的疏忽,或者数据库 的db类库没有自动关闭每次的连接。。。]
2.客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出仁何请求到服务器. [类似常连,类似于不完整的tcp ip协议构造,服务端一直认为客户端仍然存在(有可能客户端已经断掉了)]
3.客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了. [参看:tcp ip协议的三次握手]




网上有一个哥们写了一个,如下:




将它当中的 $password 改成你实际的数据库 密码,死连接的时间也可以修改。然后加入计划 仁务就可以了。比如用 crontab -e 命令加入:

*/2 * * * * php /usr/local/sbin/kill-mysql -sleep-proc.php就可以每隔 2 分钟检捕孝清除一次数据库 中的死连接了。
 

阅读全文>>

转载于:https://my.oschina.net/lgc/blog/5305

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值