問題分析
sleep進程過多
造成睡眠連接過多的原因?
1. 使用了太多持久連接
2. 程序中,沒有及時關閉mysql連接
3. 數據庫查詢不夠優化,過度耗時。
使用如下命令查看mysql所有進程
mysql> show full processlist;
這裏主要看以下幾點!
Host 表示都有哪些地址和端口連接了數據庫
Command 表示連接狀態 sleep表示等待狀態
Time 表示時間
info 具體執行的操作
通過命令查看得知sleep很多,而且time時間也不一樣,有的甚至幾千秒。大家都知道每一個進程都會佔用相應的系統資源。如果sleep進程較多必定影響mysql使用。
如果某天你發現你的網站突然之後有些動態資源無法加載頁面無法顯示,很有可能是mysql進程太多導致客戶端連接mysql的時候無資源可用 這是網站可能顯示504 timeout
很多人有疑問爲什麼會有這麼多sleep進程?
答:mysql默認wait_timeout=28800 也就是8小時,wait_timeout過大有弊端,其體現就是MySQL裏大量的SLEEP進程無法及時釋放,拖累系統性能。不過也不能把這個指設置的過小,否則你可能會遭遇到“MySQL server has gone away”之類的問題。
這裏引申出mysql的兩種連接方式 長連接 and 短連接
長連接:長連接是相對於短連接來說的。長連接指在一個連接上可以連續發送多個數據包,在連接保持期間,如果沒有數據包發送,需要雙方發鏈路檢測包。MySQL的長連接如果長期閒置,mysql會8小時後(默認時間)主動斷開該連接。
客戶端連接--創建socket認證連接--維護連接--數據傳輸--維護連接--數據傳輸.....-關閉連接
短連接:是指通訊雙方有數據交互時,就建立一個連接,數據發送完成後,則斷開此連接,即每次連接只完成一項業務的發送。
客戶端連接--創建socket認證連接--維護連接--數據傳輸--關閉連接
如何選擇mysql連接方式?請根據具體情況而定
用戶少,使用長連接,減少web端與數據庫的邏輯連接數,可以讓連接保持久一點,不用頻繁建立連接。
用戶多,使用短鏈接,這樣用於使用完後就釋放連接了。但是消耗系統資源多一點。
這裏提供兩種解決辦法:
使用kill id 殺掉sleep進程 可以用腳本方式批量查殺
設置wait_timeout = 100
使用腳本批量查殺有可能造成數據崩潰,腳本請看這裏
cat mysql_sleep.sh
#!/bin/sh
user=root
passwd=12345678
host=192.168.1.100
while :
do
n=`mysqladmin processlist -u$user -p$passwd -h$host | grep -i sleep | wc -l`
date=`date +%Y%m%d[%H:%M:%S]`
echo $n
if [ "$n" -gt 20 ]
then
for i in `mysqladmin processlist -u$user -p$passwd -h$host | grep -i sleep | awk '{print $2}'`
do
mysqladmin -u$user -p$passwd -h$host kill $i
done
echo "sleep is too many I killed it " >> /tmp/sleep.log
echo "$date : $n" >> /tmp/sleep.log
fi
sleep 1
done