全部產品
Search
文件中心

ApsaraDB RDS:RDS MySQL活躍線程數高問題

更新時間:Feb 28, 2024

本文介紹RDS MySQL活躍線程數高的原因及解決方案。

背景資訊

活躍線程數或活躍串連數是衡量MySQL負載狀態的關鍵計量,通常來說一個比較健康的執行個體活躍串連數應該低於10,高規格和高QPS的執行個體活躍串連數可能20、30,如果出現幾百、上千的活躍串連數,說明出現了SQL堆積和響應變慢,嚴重時會導致執行個體停止回應,無法繼續處理SQL請求。

查看活躍線程數

RDS管理主控台提供多種查看活躍線程數的方法:

  • 監控與警示

    在控制台的監控與警示頁面,單擊標準監控頁簽內的標準視圖,可以查看執行個體的活躍線程數監控資訊。

  • 資料庫自治服務DAS

    在控制台的自治服務 > 效能趨勢頁面,單擊效能趨勢頁簽,查看會話串連情況,如果線程數過高,說明執行個體會話有阻塞。

排查慢SQL堆積問題

  • 現象

    如果通過監控發現活躍線程數升高,首先通過show processlist;命令查看是否有慢SQL。如果有很多掃描行數太多的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_waitsInnodb_row_lock_time監控項的指標升高。

    您可以在控制台的自治服務 > 效能趨勢頁面,單擊效能趨勢頁簽,查看行鎖內的監控項,

  • 解決方案

    您可以通過show engine innodb status;命令查看是否有大量會話處於Lock wait狀態,如果有,說明行鎖衝突比較嚴重,需要通過最佳化熱點更新、降低事務大小、及時提交事務等方法避免行鎖衝突。