為什麼我的 MySQL 資料庫執行個體在效能洞見中顯示大量等待 SYNCH 等待事件的作用中工作階段?

2 分的閱讀內容
0

當我啟用效能洞見時,我的資料庫執行個體會顯示大量平均作用中工作階段 (AAS) 等待同步處理 (SYNCH) 等待事件。我想提高我的資料庫執行個體的效能。

簡短描述

效能洞見會在下列任何服務上啟動:

  • 適用於 MySQL 的 Amazon Relational Database Service (Amazon RDS) 。
  • Amazon RDS for MariaDB。
  • Amazon Aurora MySQL 相容版。

如果您在效能洞見中看到 MySQL SYNCH 等待事件,則資料庫中有大量會話嘗試存取相同的受保護物件或記憶體結構。MySQL 中受保護的物件包括以下內容:

  • binlog 源執行個體中的活動二進制日誌檔案 - 包含一個互斥鎖,該互斥鎖一次只允許一個會話讀取或寫入它。
  • 資料字典 - 用於通常由資料控制語言(DCL)或資料定義語言(DDL)陳述式引起的寫入。
  • 自適應哈希索引-包含一個互斥體,它允許一次只允許一個會話讀取或寫入它。
  • **打開的表緩存 **-只有一個會話可以添加或從快取中刪除表。
  • InnoDB 緩衝池內的每個資料庫區塊-只有一個會話可以一次修改內存中區塊的內容。

解決方法

確定資料庫執行個體有足夠的 CPU 資源來處理工作負載

如果您有大量會話等待 SYNCH 事件,這會導致 CPU 使用率過高。如果使用率達到 100%,則等待會話數目將增加。進行疑難排解時,請增加資料庫執行個體的大小,以確保有足夠的 CPU 來處理額外的工作負載。

由於這些事件通常是短暫的,因此 Amazon CloudWatch CPU 使用率指標可能無法正確顯示尖峰使用量。檢查此問題的最佳方法是使用 RDS 增強型監控中的一秒 CPU 計數器。這些計數器更具體和詳細。

增加 MySQL 的互斥鎖定等待陣列

MySQL 使用內部資料結構來協調執行緒。預設情況下,此陣列的大小為 1。這適用於單 CPU 機器,但它可能會導致具有多個 CPU 的電腦出現問題。如果您的工作負載有大量的等待執行緒,請增加陣列大小。將 MYSQL 參數 innodb_sync_array_size 設定為 CPU 的數量(或更高,最多為 1024)。

**注意:**In innodb_sync_array_size 參數僅適用於資料庫啟動時。

減少並行性

一般而言,平行處理有助於改善輸送量。但是,當大量會話嘗試執行相同或類似的活動時,會話需要存取相同的受保護物件。會話數目越多,等待時使用的 CPU 就越多。

隨著時間的推移傳播這些活動,或者按序列安排它們。您也可以將多個操作捆綁到單個陳述式中,例如多資料列插入。

檢查特定的等待事件

使用下列範例來疑難排解您的特定等待事件。如需 Aurora MySQL 等待事件的詳細資訊,請參閱使用等待事件調整 Aurora MySQL

  • synch/rwlock/innodb/dict sys RW 鎖定,或
    synch/rwlock/innodb/dict_operation_lock - 這表示同時觸發了大量的並行 DCL。減少應用程式在一般應用程式活動期間使用 DDL 的相依性。
  • synch/cond/sql/MDL_context::COND_wait_status  - 這表示大量的 SQL(包括選擇)嘗試存取 DCL 或 DDL 正在修改的資料表。避免在一般應用程式活動期間對高流量資料表執行 DDL 陳述式。
  • synch/mutex/sql/LOCK_open,或
    synch/mutex/sql/LOCK_table_cache - 這表示會話開啟的資料表數目超過資料表定義快取或資料表開啟快取的大小。增加這些快取的大小
  • synch/mutex/sql/LOG - 您的資料庫可能正在執行大量陳述式,並且當前的記錄方法不能支援它。如果您使用 TABLE 輸出方法,請嘗試改用 FILE。如果您使用一般日誌,請改用 Amazon Aurora 的進階稽核功能。如果對 long_query_time 參數使用 0 或小於 1,則嘗試增加它。
  • synch/mutex/innodb/buf_pool_mutexsynch/mutex/innodb/aurora_lock_thread_slot_futexsynch/rwlock/innodb/index_tree_rw_lock - 有大量類似的 DML 同時存取相同的資料庫物件。使用多資料列陳述式,並使用分割區將工作負載分攤到不同的資料庫物件上。
  • synch/mutex/innodb/aurora_lock_thread_slot_futex - 當一個會話鎖定了要進行更新的資料列,然後另一個會話嘗試更新相同的資料列時,就會發生這種情況。您的動作取決於您看到的其他等待事件。尋找並回應負責此等待事件的 SQL 陳述式,或尋找並回應封鎖階段作業
  • synch/cond/sql/MYSQL_BIN_LOG::COND_done,或
    synch/mutex/sql/MYSQL_BIN_LOG::LOCK_commit,或
    synch/mutex/sql/MYSQL_BIN_LOG::LOCK_log - 您已經開啟二進制記錄功能,並且可能存在下列其中一種情況:

                         -高提交輸送量。

                         -大量交易提交。

                         - 複寫讀取 binlog。

                         - 以上所有組合。

請考慮將資料庫升級至與 5.7 或更高版本相容的主要版本。此外,您也可以使用多資料列陳述式,或將數個陳述式併入單一交易中。在 Amazon Aurora 中,請使用全域資料庫而非二進位日誌複寫,或使用 aurora_binlog 參數。


相關資訊

使用 Amazon RDS Performance Insights

使用資料庫參數群組

Aurora MySQL 事件

AWS 官方
AWS 官方已更新 1 年前