LWLock:BufferIO (IPC:BufferIO) - Amazon Relational Database Service

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

LWLock:BufferIO (IPC:BufferIO)

LWLock:BufferIO 事件表示 RDS for PostgreSQL 與其他程序同時嘗試存取分頁,正在等待其他程序完成輸入/輸出 (I/O) 操作。目的是為了將該分頁讀入共用緩衝區。

相關的引擎版本

此等待事件資訊與所有 RDS for PostgreSQL 版本有關。對於適用於 PostgreSQL 12 的 RDS 和更早版本,此等待事件被命名為 lwlock:buffer_io,而在 RDS 中為 PostgreSQL 13 版本,它被命名為 lwlock:bufferio。從 RDS for PostgreSQL 14 版開始,此等待事件從 LWLock移動至 IPC等待事件類型 (IPC:BufferIO)。

Context

每次必須在共用緩衝集區外擷取區塊 (或分頁) 時,每個共用緩衝區都有與 LWLock:BufferIO 等待事件相關聯的輸入/輸出鎖定。

此鎖定用於處理全都需要存取同一個區塊的多個工作階段。必須從 shared_buffers 參數定義的共用緩衝集區外讀取此區塊。

在共用緩衝集區內讀取分頁後,就會立刻釋放 LWLock:BufferIO 鎖定。

注意

LWLock:BufferIO 等待事件在 IO:DataFileRead 等待事件之前發生。從儲存讀取資料時會發生 IO:DataFileRead 等待事件。

如需輕量級鎖定的詳細資訊,請參閱鎖定概觀

原因

LWLock:BufferIO 事件出現在最常等待名單中的常見原因包括:

  • 多個後端或連線嘗試存取同一個分頁,而此分頁也擱置輸入/輸出操作

  • 共用緩衝集區 (由 shared_buffers 參數定義) 的大小與目前工作負載所需緩衝區數目之間的比率

  • 共用緩衝集區的大小與其他操作移出的分頁數目不太相稱

  • 大型或膨脹的索引迫使引擎將過多分頁讀入共用緩衝集區

  • 缺少索引迫使資料庫引擎從資料表讀取過多分頁

  • 檢查點太頻繁出現或需要清除太多已修改的分頁

  • 嘗試對同一分頁執行操作的資料庫連線突然激增

動作

我們根據等待事件的原因,建議不同的動作:

  • 觀察 Amazon CloudWatch 指標,以瞭解 BufferCacheHitRatioLWLock:BufferIO 等待事件遽降之間的關聯。這可能表示共用緩衝區設定太小。您可能需要提高此設定,或擴充資料庫執行個體類別的規模。您可以將工作負載分割成更多讀取器節點。

  • 如果您發現與 BufferCacheHitRatio 指標一致的 LWLock:BufferIO 下降,請根據工作負載尖峰時段來調校 max_wal_sizecheckpoint_timeout。然後查明哪個查詢造成此狀況。

  • 驗證是否有未使用的索引,然後移除。

  • 使用分割的資料表 (也有分割的索引)。這樣做有助於盡量避免索引重新排序,並減少其影響。

  • 避免不必要地編製資料欄的索引。

  • 使用連線集區來防止資料庫連線突然激增。

  • 在最佳實務上限制資料庫的連線數目上限。