`

mysql 线程等待时间,解决sleep进程过多的办法

阅读更多
转载http://blog.163.com/sujoe_2006/blog/static/33531512011521113038227/
如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800。
 
wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQL has gone away”之类的问题,通常来说,我觉得把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    |
+----------------------------+-------+
 
这里一个容易把人搞蒙的地方是如果查询时使用的是show variables的话,会发现设置好像并没有生效,这是因为单纯使用show variables的话就等同于使用的是show session variables,查询的是会话变量,只有使用show global variables,查询的才是全局变量。
 
网络上很多人都抱怨说他们set global之后使用show variables查询没有发现改变,原因就在于混淆了会话变量和全局变量,如果仅仅想修改会话变量的话,可以使用类似set wait_timeout=10;或者set session wait_timeout=10;这样的语法。
 
另一个值得注意的是会话变量wait_timeout初始化的问题,这一点在手册里已经明确指出了,我就直接拷贝了:
 
On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()).
 
MySQL大拿Jeremy Zawodny曾在他的文章Fixing Poor MySQL Default Configuration Values里面列出了几个很恶心的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,优化之
分享到:
评论

相关推荐

    shell的多线程&当前文件夹下批量插入MySQL

    总结起来,虽然Shell本身不支持多线程,但我们可以通过FIFO文件和进程间的通信来模拟多线程行为,实现批量处理任务,例如在当前目录下批量插入MySQL数据库。这种方法在处理大量并发任务时非常有用,提高了工作效率。

    mysql show processlist 显示mysql查询进程

    理解`SHOW PROCESSLIST`的输出有助于识别潜在的问题,比如阻塞的查询、过长的等待时间或不必要的资源消耗。例如,如果你发现很多线程都处于`Copying to tmp table on disk`状态,可能意味着查询需要优化,以减少对...

    mysql数据库my.cnf配置文件

    当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用, # 然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在...

    MYSQL锁表问题的解决方法

    你可以创建一个名为`mysqld_kill_sleep.sh`的脚本,用PHP定时执行,自动杀死那些等待时间超过特定阈值(比如30秒)且不是由`root`用户执行的进程。 5. **优化SQL查询和事务管理**: 避免长时间的查询和事务是防止...

    实例讲解php实现多线程

    例如,下面的代码创建了两个线程,每个线程都会执行`sleep(5)`,但由于它们是并发执行的,实际所需时间仅为5秒。 ```php class pthreadsTest extends Thread { public function run() { sleep(5); } } $...

    快手2020招聘秋招笔试--工程C试卷.docx

    wait() 方法可以让线程等待对象锁的释放。 知识点8: 网络协议 ARP 协议可以将 MAC 地址转换为 IP 地址。 知识点9: 路由器 路由器是在网络层上实现网络互连的。 知识点10: ICMP 协议 ICMP 协议是直接为 TCP 提供...

    python学习笔记之多进程

    在Python编程中,多进程(Multi-Processing)是一种并行处理的方法,它允许程序同时运行多个独立的执行线程,每个线程称为一个进程。在多核CPU系统中,多进程能充分利用硬件资源,提高程序的运行效率。本篇笔记将...

    2019最新Java面试题,常见面试题及答案汇总 (2).pdf

    - `sleep()`使当前线程休眠,`wait()`让线程等待,两者都需要捕获InterruptedException。 - `synchronized`和`volatile`、`Lock`(如ReentrantLock)用于线程同步,前者是内置关键字,后两者是显式锁,提供了更细...

    python爬虫开发常见问题及其解决方法和经验总结.docx

    - **设置合理的超时时间**:在发起请求时,可以通过`requests.get(url, timeout=5)`这样的方式设置超时时间为5秒,以防止长时间等待无响应的请求。 - **异常处理机制**:使用`try-except`语句块来捕获并处理可能出现...

    一线互联网公司面试题目

    阻塞方式包括wait()、sleep()等,其中wait()需在同步块中使用,sleep()则不会释放锁。 7. **HashMap 底层实现**:HashMap基于哈希表,使用数组+链表/红黑树实现,解决冲突采用开放寻址法或链地址法。 8. **抢红包...

    一线互联网企业面试题.pdf

    7. sleep和wait的区别:sleep()是Thread类的静态方法,调用后线程进入Timed Waiting状态,但不会释放锁;wait()是Object类的方法,调用后线程进入Waiting状态,并释放锁。 8. HashMap底层实现:HashMap基于哈希表...

    Java后端面试题大纲(涵盖了百分之九十的考点).pdf

    - `ThreadLocal`提供了一个线程局部变量的解决方案,每个线程都有独立的变量副本。 - 避免了通过参数传递变量的麻烦,但也可能导致内存泄漏。 #### 计算机网络 1. **URL解析过程** - 输入URL后,首先解析域名...

    Java面试宝典

    - `wait()`是`Object`类的方法,会使当前线程等待,直到被其他线程唤醒或达到指定时间,同时会释放对象锁。 8. **实现同步的方式** - 使用`synchronized`关键字。 - 使用`ReentrantLock`类。 - 使用`Semaphore`...

    Java最常见的面试题208道.docx

    23. **线程与进程**:线程是进程内的执行单元,进程是系统分配资源的基本单位。 24. **守护线程**:守护线程是后台线程,当所有非守护线程结束后,守护线程会自动结束。 25. **创建线程的方式**:继承`Thread`类、...

    Python-对懂球帝的文章进行有条件爬取

    8. **多线程或异步IO**:为了提高爬虫的效率,可以考虑使用Python的多线程或多进程,或者使用asyncio库实现异步IO,使得程序在等待网络响应时可以同时处理其他任务。 9. **反爬虫策略**:懂球帝等网站可能会有反...

Global site tag (gtag.js) - Google Analytics