本文介紹RDS MySQL活躍線程數高的原因及解決方案。
背景信息
活躍線程數或活躍連接數是衡量MySQL負載狀態的關鍵指標,通常來說一個比較健康的實例活躍連接數應該低于10,高規格和高QPS的實例活躍連接數可能20、30,如果出現幾百、上千的活躍連接數,說明出現了SQL堆積和響應變慢,嚴重時會導致實例停止響應,無法繼續處理SQL請求。
查看活躍線程數
RDS管理控制臺提供多種查看活躍線程數的方法:
監控與報警
在控制臺的監控與報警頁面,單擊標準監控頁簽內的標準視圖,可以查看實例的活躍線程數監控信息。
數據庫自治服務DAS
在控制臺的
頁面,單擊性能趨勢頁簽,查看會話連接情況,如果線程數過高,說明實例會話有阻塞。
排查慢SQL堆積問題
現象
如果通過監控發現活躍線程數升高,首先通過
show processlist;
命令查看是否有慢SQL。如果有很多掃描行數太多的SQL,容易導致活躍連接數升高。您可以在控制臺的
頁面,查看慢SQL的相關信息。解決方案
使用SQL限流功能或結束會話,降低慢SQL的影響。
排查表緩存(Table Cache)問題
現象
Table Cache不足時,會導致大量SQL處于
Opening table
狀態,在QPS過高或者表很多的場景容易出現。解決方案
將參數table_open_cache(不需要重啟實例)和table_open_cache_instances(需要重啟實例)調大。
排查元數據鎖(MDL)問題
現象
出現MDL鎖時,會導致大量SQL處于
Waiting for table metadata lock
的狀態,在DDL prepare和commit階段,DDL語句需要獲取MDL鎖,如果表上有未提交事務或慢SQL,會阻塞DDL操作,DDL操作又會阻塞其他的SQL,最終導致活躍線程數升高。解決方案
中止未提交事務、慢SQL或正在執行的DDL都可以解決問題。
排查行鎖沖突問題
現象
行鎖沖突表現為Innodb_row_lock_waits和Innodb_row_lock_time監控項的指標升高。
您可以在控制臺的
頁面,單擊性能趨勢頁簽,查看行鎖內的監控項,解決方案
您可以通過
show engine innodb status;
命令查看是否有大量會話處于Lock wait
狀態,如果有,說明行鎖沖突比較嚴重,需要通過優化熱點更新、降低事務大小、及時提交事務等方法避免行鎖沖突。