溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql中出現(xiàn)大量sleep進程的原因及應該如何解決

發(fā)布時間:2020-05-19 11:30:34 來源:網(wǎng)絡 閱讀:2680 作者:三月 欄目:數(shù)據(jù)庫

下面一起來了解下mysql中出現(xiàn)大量sleep進程的原因及應該如何解決,相信大家看完肯定會受益匪淺,文字在精不在多,希望mysql中出現(xiàn)大量sleep進程的原因及應該如何解決這篇短內容是你想要的。

可能的原因: 造成睡眠連接過多的原因?
1. 使用了太多持久連接(個人覺得,在高并發(fā)[系統(tǒng)] (http://www.2cto.com/os/)中,不適合使用持久連接)
2. 程序中,沒有及時關閉mysql連接
3. 數(shù)據(jù)庫查詢不夠優(yōu)化,過度耗時。
當然,更根本的方法,還是從以上三點排查之:

  1.  程序中,不使用持久鏈接,即使用mysql_connect而不是pconnect。

  2. 程序執(zhí)行完畢,應該顯式調用mysql_close

   3. 只能逐步分析系統(tǒng)的SQL查詢,找到查詢過慢的SQL,優(yōu)化之p 我是用排除法去定位問題,對于此原因,1和3通過分析,發(fā)現(xiàn)根本不滿足 此處先排除是mysql 配置的問題,sleep的關閉時間是8個小時,默認值(show variables like 'wait_timeout';),并且云服務器配置都是運維人員維護,我們的運維還是很出色的 排除1: 我的業(yè)務,php鏈接mysql并沒有使用持久鏈接 mysql_pconnect,高并發(fā)系統(tǒng)框架中,都不會用持久鏈接的 排除3: 數(shù)據(jù)庫查詢不夠優(yōu)化?自己寫的,不能夠。如果真的有不夠不夠優(yōu)化的sql,可以開啟mysql慢查詢日志查看,并優(yōu)化之;還有一點就是我的這個業(yè)務通過看數(shù)據(jù)庫昨日、今日兩天的訪問情況,讀寫都不是很多,表的數(shù)據(jù)量只有二百多萬條,而且已經(jīng)線上正常運營了很久,假如有不夠優(yōu)化的查詢,早就掛了。 那問題只有可能是 2 程序中,沒有及時關閉mysql連接, 造成這個問題的原因很多,也很難分析。一般只要是框架里,都會即時關閉mysql鏈接的(mysql_close),頁面訪問完,mysql鏈接必然會自動關閉。 例子:


  [php] <?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);  
   ?>

將當中的$password 改成你實際的數(shù)據(jù)庫密碼,sleep連接的時間也可以修改,然后加入計劃任務就可以了。比如用 crontab -e 命令加入:

1
2
[html]
*/2 * * * * php /usr/local/sbin/kill-mysql-sleep-proc.php

就可以每隔 2 分鐘檢查并清除一次數(shù)據(jù)庫中的sleep連接了

 

如果你沒有修改過MySQL的配置,缺省情況下,wait_timeout的初始值是28800

 

wait_timeout過大有弊端,其體現(xiàn)就是MySQL里大量的SLEEP進程無法及時釋放,拖累系統(tǒng)性能,不過也不能把這個值設置的過小,否則你可能會遭遇到“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 | 
+----------------------------+-------+  

看完mysql中出現(xiàn)大量sleep進程的原因及應該如何解決這篇文章后,很多讀者朋友肯定會想要了解更多的相關內容,如需獲取更多的行業(yè)信息,可以關注我們的行業(yè)資訊欄目。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI