當我啟用 Performance Insights 時,我的資料庫執行個體會顯示大量正在等待同步處理 (SYNCH) 等待事件的平均作用中工作階段 (AAS)。我想提高資料庫執行個體的效能。
簡短描述
當多個資料庫工作階段存取相同的受保護物件或記憶體結構時,Performance Insights 中就會發生 MySQL SYNCH 等待事件。以下物件在 Amazon Relational Database Service (Amazon RDS) for MySQL、Amazon RDS for MariaDB 和 Amazon Aurora MySQL 相容版中受到保護:
- binlog 來源執行個體中的活動二進位日誌檔案,包含一個互斥鎖,一次只允許一個工作階段讀取或寫入該互斥鎖。
- 受資料控制語言 (DCL) 或資料定義語言 (DDL) 陳述式寫入保護的資料字典。
- 自適應雜湊索引包含一個互斥鎖,一次只允許一個工作階段讀取或寫入它。
- 開啟的資料表快取,僅允許一個工作階段在快取中新增或刪除資料表。
- InnoDB 緩衝池中的每個資料庫區塊,一次只有一個工作階段可以修改記憶體中區塊的內容。
解決方法
確定資料庫執行個體有足夠的 CPU 資源來管理工作負載
大量等待 SYNCH 事件的工作階段會導致 CPU 使用率過高。當使用率達到 100% 時,等待工作階段的數量會增加。若要解決此問題,請增加資料庫執行個體的大小,以便有足夠的 CPU 來處理額外的工作負載。
由於 SYNCH 事件通常不會持續很長的時間,因此 CPUUtilization Amazon CloudWatch 指標可能無法正確顯示峰值使用量。此指標的精度只有 60 秒。若要檢查峰值使用量,請在 Amazon RDS 主控台上的增強監控中,使用一秒精度計數器。
增加 MySQL 互斥鎖或鎖定等待陣列
MySQL 會使用內部資料結構來協調執行緒,預設陣列大小為 1。此組態適用於單一 CPU 機器,但可能會導致具有多個 CPU 的機器出現問題。如果您的工作負載有大量的等待執行緒,請增加陣列大小。修改 MySQL innodb_sync_array_size 參數,使其等於或大於 CPU 數量。如需詳細資訊,請參閱 MySQL 網站上的 innodb_sync_array_size。
**注意:**MySQL 僅在資料庫啟動時使用 innodb_sync_array_size 參數。
減少並行性
通常,平行處理可提高輸送量。但是,當大量工作階段執行相同或相似的活動時,工作階段必須有權存取相同的受保護物件。工作階段數量越大,等待時使用的 CPU 就越多。
若要解決此問題,請將活動分散到不同的時間段,或按順序安排它們。您也可以將多個操作組合到單一陳述式中,例如多資料列插入。
根據等待事件對您的問題進行疑難排解
根據您收到的等待事件執行下列疑難排解動作。
synch/rwlock/innodb/dict sys RW lock 或synch/rwlock/innodb/dict_operation_lock
當您同時調用大量並行 DCL 或 DDL 時,就會發生這些事件。若要解決這些問題,請在一般應用程式活動期間減少應用程式對 DDL 的相依性。
synch/cond/sql/MDL_context::COND_wait_status
當大量 SQL (包括選項) 存取 DCL 或 DDL 正在修改的資料表時,就會發生此事件。若要解決此問題,請勿在一般應用程式活動期間,對高流量資料表執行 DDL 陳述式。
synch/mutex/sql/LOCK_open 或 synch/mutex/sql/LOCK_table_cache
當工作階段開啟的資料表數量超過資料表定義快取或資料表開啟快取的大小時,就會發生這些事件。若要解決此問題,請增加快取的大小。如需更多資訊,請參閱 MySQL 網站上的 10.4.3.1 MySQL 如何開啟和關閉資料表。
synch/mutex/sql/LOG
當資料庫執行大量目前記錄方法無法支援的陳述式時,就會發生此事件。如果您使用的是 TABLE 輸出方法,請改用 FILE。如果您使用的是一般日誌,請改用 Aurora 中的進階稽核功能。如果將 long_query_time 參數設為 0 或小於 1 的值,請增加該值。
synch/mutex/innodb/buf_pool_mutex、synch/mutex/innodb/aurora_lock_thread_slot_futex 或 synch/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
當您啟動二進位記錄,且有大量提交輸送量、提交交易或副本正在讀取二進位日誌時,會發生這些事件。若要解決此問題,請使用多資料列陳述式或將多個陳述式分組到單一交易中。
如需 Aurora MySQL 相容等待事件的詳細資訊,請參閱使用等待事件調整 Aurora MySQL 和 Aurora MySQL 等待事件。
最佳做法是將資料庫升級到與 8.0 或更新版本相容的主要版本。如果可以,請使用多資料列陳述式,或將多個陳述式分組到單一交易中。在 Aurora 中,請使用 Aurora 全域資料庫而不是二進位日誌複製,或使用 aurora_binlog 參數。
相關資訊
使用 Amazon RDS 上的 Performance Insights 監控資料庫負載
Amazon RDS 的參數群組