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

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

当前的链接数:
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 分钟检捕孝清除一次数据库 中的死链接了。
 mysql

阅读全文>>sql

相关文章
相关标签/搜索