国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 12:38:05
字體:
來源:轉載
供稿:網友

使用mysql的朋友如果是使用phpmyadmin管理或自己經常去查看mysql服務器可能會發現自己的mysql服務器會有大量的sleep進程,今天我來給各位分析mysql出現大sleep進程原因分析與解決方法。

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

1.使用了太多持久連接,個人覺得,在高并發系統中,不適合使用持久連接.

2.程序中,沒有及時關閉mysql連接.

3.數據庫查詢不夠優化,過度耗時.

當然,更根本的方法,還是從以上三點排查之:

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

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

3.只能逐步分析系統的SQL查詢,找到查詢過慢的SQL,優化之.

我是用排除法去定位問題,對于此原因,1和3通過分析,發現根本不滿足.

此處先排除是mysql 配置的問題,sleep的關閉時間是8個小時,默認值(show variables like 'wait_timeout';),并且服務器配置都是運維人員維護,我們的運維還是很出色的.

排除1:我的業務,php鏈接mysql并沒有使用持久鏈接 mysql_pconnect,高并發系統框架中,都不會用持久鏈接的

排除2:數據庫查詢不夠優化?自己寫的,不能夠,如果真的有不夠不夠優化的sql,可以開啟mysql慢查詢日志查看,并優化之,還有一點就是我的這個業務通過看數據庫昨日、今日兩天的訪問情況,讀寫都不是很多,表的數據量只有二百多萬條,而且已經線上正常運營了很久,假如有不夠優化的查詢,早就掛了.

那問題只有可能是 2 程序中,沒有及時關閉mysql連接,造成這個問題的原因很多,,也很難分析,一般只要是框架里,都會即時關閉mysql鏈接的(mysql_close),頁面訪問完,mysql鏈接必然會自動關閉.

網上有一個哥們寫了一個,代碼如下:

  1. define('MAX_SLEEP_TIME', 120); 
  2. $hostname = "localhost"
  3. $username = "root"
  4. $password = "password"
  5. $connect = mysql_connect($hostname, $username, $password); 
  6. $result = mysql_query("SHOW PROCESSLIST", $connect); 
  7. while ($proc = mysql_fetch_assoc($result)) { 
  8. if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {  //Vevb.com 
  9. @mysql_query("KILL " . $proc["Id"], $connect); 
  10. 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時間,代碼如下:

  1. # vi /etc/my.cnf 
  2. [mysqld] 
  3. wait_timeout=10 
  4. # /etc/init.d/mysql restart 

不過這個方法太生硬了,線上服務重啟無論如何都應該盡可能避免,看看如何在MySQL命令行里通過SET來設置,代碼如下:

  1. mysql> set global wait_timeout=10; 
  2. mysql> show global variables like '%timeout'
  3. +----------------------------+-------+ 
  4. | Variable_name | Value | 
  5. +----------------------------+-------+ 
  6. | wait_timeout | 10 | 
  7. +----------------------------+-------+

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盱眙县| 农安县| 贵港市| 新昌县| 贡觉县| 原平市| 涡阳县| 常山县| 鹤壁市| 东乌珠穆沁旗| 镇巴县| 浦城县| 昭觉县| 舟曲县| 北票市| 辽宁省| 天全县| 吉木乃县| 义乌市| 青铜峡市| 十堰市| 宁陕县| 石景山区| 祁东县| 安顺市| 教育| 郴州市| 平山县| 大英县| 清涧县| 兰溪市| 曲阜市| 巩留县| 黄石市| 新田县| 沂水县| 项城市| 大厂| 沐川县| 江源县| 山丹县|