mysql出現大量sleep進程原因與解決方案

來源:互聯網
上載者:User

以前也曾遇到過類似的問題,導致此問題的原因從網上查了,大體有幾下幾種原因:

造成睡眠串連過多的原因?

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連結必然會自動關閉

網上有一個哥們寫了一個,

 代碼如下 複製代碼

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);
}
}
mysql_close($connect);
?>

將當中的$password 改成你實際的資料庫密碼,sleep串連的時間也可以修改,然後加入計劃任務就可以了。比如用 crontab -e 命令加入:

 代碼如下 複製代碼
*/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時間):

 代碼如下 複製代碼

# 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 '%timeout';

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

| Variable_name | Value |

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

| wait_timeout | 10 |

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.