本文介紹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
狀態,如果有,說明行鎖衝突比較嚴重,需要通過最佳化熱點更新、降低事務大小、及時提交事務等方法避免行鎖衝突。