(轉)mysql中有大量sleep進程的緣由與解決辦法

mysql中有大量sleep進程的緣由與解決辦法
 
mysql服務器中有大量的sleep進程,本文分析下mysql出現大sleep進程緣由分析與解決方法。
 
可能的緣由:
 
形成睡眠鏈接過多的緣由?
 
1. 使用了太多持久鏈接(我的以爲,在高併發系統中,不適合使用持久鏈接)
 
2. 程序中,沒有及時關閉mysql鏈接
 
3.  數據庫查詢不夠優化,過分耗時。
 
固然,更根本的方法,仍是從以上三點排查之:
 
1. 程序中,不使用持久連接,即便用mysql_connect而不是pconnect。
 
2. 程序執行完畢,應該顯式調用mysql_close
 
3. 只能逐步分析系統的SQL查詢,找到查詢過慢的SQL,優化之p
 
我是用排除法去定位問題,對於此緣由,1和3經過分析,發現根本不知足
 
此處先排除是mysql 配置的問題,sleep的關閉時間是8個小時,默認值(show variables like 'wait_timeout';),而且服務器配置都是運維人員維護,咱們的運維仍是很出色的
 
排除1:
 
個人業務,php連接mysql並無使用持久連接 mysql_pconnect,高併發系統框架中,都不會用持久連接的
 
排除3:
 
數據庫查詢不夠優化?本身寫的,不可以。若是真的有不夠不夠優化的sql,能夠開啓mysql慢查詢日誌查看,並優化之;還有一點就是個人這個業務經過看數據庫昨日、今日兩天的訪問狀況,讀寫都不是不少,表的數據量只有二百多萬條,並且已經線上正常運營了好久,假若有不夠優化的查詢,早就掛了。
 
那問題只有多是 2 程序中,沒有及時關閉mysql鏈接, 形成這個問題的緣由不少,也很難分析。通常只要是框架裏,都會即時關閉mysql連接的(mysql_close),頁面訪問完,mysql連接必然會自動關閉。

<?php
define('MAX_SLEEP_TIME', 120);

$hostname = "localhost";
$username = "root";
$password = "password";

$connect = mysql_connect($hostname, $username, $password);
$result = mysql_query("SHOW PROCESSLIST", $connect);
while ($proc = mysql_fetch_assoc($result)) {
if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {
@mysql_query("KILL " . $proc["Id"], $connect);
}
} //by www.jbxue.com
mysql_close($connect);php

?>html

將當中的$password 改爲你實際的數據庫密碼,sleep鏈接的時間也能夠修改,而後加入計劃任務就能夠了。好比用 crontab -e 命令加入:
?
1
2
[html]
*/2 * * * * php /usr/local/sbin/kill-mysql-sleep-proc.php
就能夠每隔 2 分鐘檢查並清除一次數據庫中的sleep鏈接了
 
若是你沒有修改過MySQL的配置,缺省狀況下,wait_timeout的初始值是28800
 
wait_timeout過大有弊端,其體現就是MySQL裏大量的SLEEP進程沒法及時釋放,拖累 系統性能,不過也不能把這個值設置的太小,不然你可能會遭遇到「MySQL has gone away」之類的問題,一般來講,我以爲把wait_timeout設置爲10是個不錯的選擇,但某些狀況下可能也會出問題,好比說有一個CRON腳本,其中兩次SQL查詢的間隔時間大於10秒的話,那麼這個設置就有問題了(固然,這也不是不能解決的問題,你能夠在程序裏時不時mysql_ping一下,以便服務器知道你還活着,從新計算wait_timeout時間):
?
1
2
3
4
5
[html]
# vi /etc/my.cnf 
[mysqld] 
wait_timeout=10 
# /etc/init.d/mysql restart  
不過這個方法太生硬了,線上服務重啓不管如何都應該儘量避免,看看如何在MySQL命令行裏經過SET來設置:
?
1
2
3
4
5
6
7
8
[html]
mysql>  set  global  wait_timeout=10; 
mysql> show  global  variables  like  '%timeout'
+ ----------------------------+-------+ 
| Variable_name | Value | 
+ ----------------------------+-------+ 
| wait_timeout | 10 | 
+ ----------------------------+-------+  
相關文章
相關標籤/搜索