Mysql連線數過大導致連線超時的問題
春節訪問量激增,負載壓力很大,程式處理較慢,然後就調整專案中的執行緒池和資料庫連線數。可是還是沒有太好的提高,追根溯源,發現數據庫連線受到限制。雖然是做了讀寫分離,但是還是沒抗住高峰。所以會有報錯:“MySQL: ERROR 1040: Too many connections”。
檢視最大連線數上限,預設的是151
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
檢視mysql最大使用連線數
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 152 |
+----------------------+-------+
可以看出,已經超過了連線數上限。而且還多了一個,這是為什麼呢?原來MySQL無論如何都會保留一個用於管理員(SUPER)登陸的連線,用於管理員連線資料庫進行維護操作,即使當前連線數已經達到了max_connections。因此MySQL的實際最大可連線數為max_connections+1;
這個引數實際起作用的最大值(實際最大可連線數)為16384,即該引數最大值不能超過16384,即使超過也以16384為準;
增加max_connections引數的值,不會佔用太多系統資源。系統資源(CPU、記憶體)的佔用主要取決於查詢的密度、效率等;
解決方法:
提高資料庫最大連線數:
1、直接設定,不需要重啟:
mysql> set global max_connections=1500;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1500|
+-----------------+-------+
1 row in set (0.00 sec)
2、配置檔案設定,需要重啟:
修改my.cnf檔案,在[mysqld]下面新增語句:
max_connections=1500
數值大小,根據併發情況調整,Max_used_connections/max_connections<90%就可以。
光靠上面的設定,還不夠。執行show processlist檢視執行任務,你會發現很多連線長時間在sleep。如果不是高峰期,這些連線也會消耗CPU和記憶體。這個需要通過程式設定最大超時時間wait_timeout和interactive_timeout。
(1)interactive_timeout:
引數含義:伺服器關閉互動式連線前等待活動的秒數。互動式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。
引數預設值:28800秒(8小時)
(2)wait_timeout:
引數含義:伺服器關閉非互動連線之前等待活動的秒數。
線上程啟動時,根據全域性wait_timeout值或全域性interactive_timeout值初始化會話wait_timeout值,取決於客戶端型別(由mysql_real_connect()的連線選項CLIENT_INTERACTIVE定義)。
引數預設值:28800秒(8小時)
mysql> set global wait_timeout=30;
mysql> set wait_timeout=30;
wait_timeout過大有弊端,其體現就是MySQL裡大量的SLEEP程序無法及時釋放,拖累系統性能。不過也不能把這個值設定的過小,否則你可能會遭遇到“MySQL has gone away”之類的問題。
參考博文