RDS MySQL 連接數滿情況的處理
RDS MySQL 連接數滿有2種情況
1. 空閑連接過多
原因:
-
應用使用長連接模式 - 對於長連接模式(比如Java應用),應用側應該配置連接池。連接池的初始連接數設置過高,應用啟動后建立多個到RDS實例空閑連接。如果出現連接數滿(too many connections)不能連接的問題,請檢查連接池是否啟用了復用連接功能。
-
應用使用短連接模式 - 對於短連接模式(比如PHP應用),出現大量的空閑連接說明應用沒有在查詢執行完畢后顯式的關閉連接。用戶應該檢查應用是否在頁面查詢結束后調用連接關閉方法主動顯式關閉了到RDS實例的連接。
解決:
-
通過DMS或者Kill 命令來終止當前空閑會話,詳細步驟請參考: RDS MySQL 如何終止連接
-
修改應用,長連接模式需要啟用連接池的復用功能(建議也啟用連接檢測功能),具體設置請參考連接池配置文檔。
-
修改應用,短連接模式需要在代碼中查詢結束后調用關閉連接的方法。
-
對於非交互模式連接,控制台=》參數設置=》設置 wait_timeout 參數為較小值,wait_timeout 參數控制非交互模式連接的超時時間(單位秒,默認值為 24小時 - 86400秒),當非交互式連接空閑時間超過wait_timeout指定的時間后,RDS實例會主動關閉(斷開)連接。
-
對於交互模式連接,控制台=》參數設置=》設置 interactive_timeout 參數為較小值,interactive_timeout參數控制交互模式連接的超時時間(單位秒,默認值為 3小時 - 7200秒),當交互式連接空閑時間超過wait_timeout指定的時間后,RDS實例會主動關閉(斷開)連接。
建議與說明:
-
在RDS MySQL 實例連接數完全打滿的情況下,通過DMS或者其他方式是無法連接實例的;因此對於長連接模式,建議連接池的最大連接數要略小於實例規格的連接數限制,比如保留10個連接給DMS或其他管理操作使用。當發生無法連接的情況時,建議先在控制台修改wait_timeout參數為較小值,促使RDS實例主動關閉空閑時間超過閥值的連接。
-
通常情況下,應用到RDS實例會采用非交互模式;具體采用哪個模式需要查看應用的連接方式配置,比如 PHP 通過傳遞 MYSQL_CLIENT_INTERACTIVE 常量給 mysql_connect()函數即可開啟連接的交互模式。
-
RDS MySQL 作為服務器,被動的接收來自應用或客戶端的連接,處理應用或客戶端提交的查詢或命令並返回結果。RDS 實例自身是不會主動發起連接的。
注:在出現大量空閑連接之前,有可能會出現瞬間連接數過多的情況,由於RDS作為服務器被動接收連接,通常情況下是應用SQL未優化導致的問題,因此需要從SQL優化入手來根本解決這個問題。
2. 活動連接過多
原因:
-
鎖等待導致活動連接數增加(包括 InnoDB 鎖等待、MyISAM表級鎖等待、表元數據鎖等待)
-
CPU使用率高導致活動連接數增加
-
IOPS使用率高導致活動連接數增加
解決:
-
InnoDB鎖等待處理,請參考:RDS MySQL InnoDB 鎖等待和鎖等待超時的處理
-
MyISAM表級鎖等待處理,請參考:RDS MySQL MyISAM 表級鎖等待的產生和處理
-
表元數據鎖等待,請參考:RDS MySQL 表上 Metadata lock 的產生和處理
-
CPU 使用率高導致活動連接數增加的處理,請參考:RDS MySQL CPU使用率高情況的原因和解決
-
IOPS使用率高導致活動連接數增加,請參考:RDS MySQL IOPS 使用率高的原因和處理
如問題還未解決,請聯系售后技術支持。