Err: 1040: Too many connections 真正解決方法

| |
2010/11/08    01:17    0    1179    admin »
1040: Too many connections 真正解決方法

抱歉~ 剛剛一直發生1040,因為流量瞬間過大造成伺服器當機~

問題分析:
是因為 mysql 預設的 connection 數量用完了,瞬間 loading 過高最會發生

連接數超過了MySQL 設置的值,與max_connections 和wait_timeout 都有關係。

wait_timeout 的值越大,連接的空閒等待就越長,這樣就會造成當前連接數越大。

問題現象:
今天配置了一台用於數據統計的linux服務器,訪問量在200萬以上,開始以前配置順利,域名生效,訪問統計鏈接,出現DateBase Err: 1040: Too many connections  

解決過程
第一反應,修改MYSQL 的參數max_connections=4087
運行了不到2分鐘,服務器平均負載狂飆到>400 瞬間當機,顯而易見,連接數加大給服務器帶來了巨大壓力,可是407的連接數並不算多。

apache 配置有問題? mysql 配置有問題?查了一邊又一遍。 。 。

原來問題出在PCONNECT
PCONNECT是不會在查詢完成後就關閉,而是會等待一定時間,這個時間可以由MYSQL上的wait_timeout設定
而且mysql_close並無法關閉pconnect所開啟的連線,只能關閉connect所開啟的資料庫連線。 當然如果沒有CLOSE在經過TIMEOUT時間之後也是會被DB DROP掉。

PCONNECT必須要小心使用,在寫的不好的CODE中,會殘留一大批的DATABASE CONNECTION。

最大值可以這樣計算每台SERVER的APACHE行程數* 所有WEB SERVEWR數量,每個連線都會消耗DB的CPU TIME與MEMORY
PCONNECT是傻瓜式的模擬連接池的方法,系統負載會瘋狂上升。

解決方法:
修改php.ini參數為
[MySQL的]
; 允許或阻止持久連接.
mysql.allow_persistent =關
修改my.cnf參數為
max_connections = 600 (建議600~1000 一般大於apahce的MaxClients )
wait_timeout = 5
最後上效果圖:

兩天后:

問題完全解決,關鍵還是程序員的SQL語句存在問題,昨天程序員優化SQL語句後mysql進程中已經不再出現死鎖的問題

之前將一個數據表的類型從myisam(表級別鎖定,導致資源無法釋放,知道內存消耗殆盡,當機)改成了innodb(記錄集級別鎖定,不在鎖表),問題有所緩解罷了~


Tags: , , , , , , , , | 引用(0)