LW 鎖:MultiXact - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

LW 鎖:MultiXact

LWLock:MultiXactMemberBufferLWLock:MultiXactOffsetBufferLWLock:MultiXactMemberSLRU、和 LWLock:MultiXactOffsetSLRU wait 事件表示工作階段正在等待擷取修改指定資料表中相同資料列的交易清單。

  • LWLock:MultiXactMemberBuffer – 程序正在等待簡單的最近最少使用 (SLRU) 緩衝區上的輸入/輸出,以取得 multixact 成員。

  • LWLock:MultiXactMemberSLRU – 程序正在等待存取簡單的最近最少使用 (SLRU) 快取,以取得 multixact 成員。

  • LWLock:MultiXactOffsetBuffer – 程序正在等待簡單的最近最少使用 (SLRU) 緩衝區上的輸入/輸出,以取得 multixact 位移。

  • LWLock:MultiXactOffsetSLRU – 程序正在等待存取簡單的最近最少使用 (SLRU) 快取上,以取得 multixact 位移。

支援的引擎版本

所有版本的 Aurora PostgreSQL 都支援此等待事件資訊。

Context

多重作業是儲存修改相同資料表資料列之交易 ID (X ID) 清單的資料結構。當單一交易參考資料表中的資料列時,交易 ID 會儲存在資料表標頭資料列中。當多個交易參考資料表中的同一資料列時,交易 ID 清單會存放在 multixact 資料結構中。multixact 等待事件表示工作階段正在從資料結構中擷取參照資料表中指定資料列的交易清單。

等待時間增加的可能原因

多重使用的三個常見原因如下:

  • 來自明確儲存點的子交易 — 在交易中明確建立儲存點會為同一資料列產生新的交易。例如,依序使用 SELECT FOR UPDATESAVEPOINTUPDATE

    某些驅動程式、物件關聯式映射器 (ORM) 和抽象層具有組態選項,用於使用儲存點自動包裝所有操作。這可能會在某些工作負載中產生許多 multixact 等待事件。PostgreSQL JDBC 驅動程式的 autosave 選項就是此情況的範例。如需詳細資訊,請參閱 PostgreSQL JDBC 文件中的 pgJDBC。另一個範例是 PostgreSQL ODBC 驅動程式及其 protocol 選項。如需詳細資訊,請參閱 PostgreSQL ODBC 驅動程式文件中的 psqlODBC Configuration Options (psqlODBC 組態選項)。

  • 來自 PL/pgSQL 異常子句的子交易-您在 PL/pgSQL 函數或程序中編寫的每個子EXCEPTION句都會在內部創建一個。SAVEPOINT

  • 外部索引鍵 – 多個交易在上層記錄上取得共用鎖定。

當指定資料列包含在多重交易操作中時,處理資料列需要從 multixact 清單中擷取交易 ID。如果查詢無法從記憶體快取中取得 multixact,則必須從 Aurora 儲存層讀取資料結構。這個來自儲存體的 I/O 表示查詢可能需要較長的時間。由於大量的多重交易,記憶體快取遺漏可能會在大量使用情況下開始發生。所有這些因素都會導致此等待事件的增加。

動作

根據等待事件的原因,我們會建議不同的動作。其中一些操作可以幫助立即減少等待事件。但是,其他人可能需要調查和更正來擴展您的工作負載。

使用此等待事件在表格上執行真空凍結

如果此等待事件突然峰值並影響您的生產環境,您可以使用下列任何一種暫時方法來減少其計數。

  • 在受影響的資料表或資料表分割區上使用 VACUUM FREEZ E 來立即解決問題 有關更多信息,請參見真空

  • 使用真空(凍結,索引 _ 清理假)子句通過跳過索引來執行快速真空。如需詳細資訊,請參閱儘快將表格吸塵

使用此等待事件增加桌子上的自動真空頻率

掃描所有數據庫中的所有表後,VACUUM 最終將刪除多重運行,並且它們最舊的多重反應值是高級的。如需詳細資訊,請參閱多重作業與環繞。要保持 LWLock:將事件MultiXact 等待到最低限度,您必須在必要時經常運行 VACUUM。若要這麼做,請確定 Aurora PostgreSQL 資料庫叢集中的真空設定為最佳狀態。

如果在受影響的資料表或資料表分割區上使用 VACUZE FREEZE 可解決等待事件問題,建議您使用排程器pg_cron,例如執行 VACUUM,而不是在執行個體層級調整自動真空。

為了使自動真空更頻繁地發生,您可以減少受影響表autovacuum_multixact_freeze_max_age中存儲參數的值。如需詳細資訊,請參閱自動吸塵器 _ 凍結 _ 最大值。

增加記憶體參數

您可以在叢集層級設定下列參數,讓叢集中的所有執行個體保持一致。這有助於減少工作負載中的等待事件。我們建議您不要將這些值設定得太高,以致記憶體不足。

  • multixact_offsets_cache_size

  • multixact_members_cache_size至二六五

您必須重新啟動執行個體,參數變更才會生效。透過這些參數,您可以使用更多的執行個體 RAM,在溢出到磁碟之前將多重運算結構儲存在記憶體中。

減少長期執行的交易

長時間執行的交易會導致真空保留其資訊,直到認可交易或唯讀交易關閉為止。建議您主動監控和管理長時間執行的交易。如需詳細資訊,請參閱 < 資料庫在交易連線中長時間執行閒置 >。嘗試修改您的應用程式,以避免或減少使用長時間執行的交易。

長期行動

檢查您的工作負載,以探索多工溢出的原因。您必須修正此問題,才能擴展工作負載並減少等待事件。

  • 您必須分析用來建立資料表的 DDL (資料定義語言)。請確定資料表結構和索引設計良好。

  • 當受影響的資料表具有外部索引鍵時,請判斷是否需要它們,或是否有其他方法可以強制執行參照完整性。

  • 當資料表具有大量未使用的索引時,可能會導致 autovacuum 不符合您的工作負載,並可能阻止其執行。為了避免這種情況,請檢查未使用的索引並完全刪除它們。如需詳細資訊,請參閱使用大型索引管理自動真空

  • 減少在交易中使用儲存點。