

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

# LWLock:BufferIO (IPC:BufferIO)
<a name="apg-waits.lwlockbufferio"></a>

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

**Topics**
+ [相關的引擎版本](#apg-waits.lwlockbufferio.context.supported)
+ [Context](#apg-waits.lwlockbufferio.context)
+ [原因](#apg-waits.lwlockbufferio.causes)
+ [動作](#apg-waits.lwlockbufferio.actions)

## 相關的引擎版本
<a name="apg-waits.lwlockbufferio.context.supported"></a>

此等待事件資訊與所有 Aurora PostgreSQL 版本有關。對於 Aurora PostgreSQL 12 和更早版本，此等待事件命名為 lwlock:buffer\_io，而 Aurora PostgreSQL 13 版中，命名為 lwlock:bufferio。從 Aurora PostgreSQL 14 版 BufferIO 等待事件從 `LWLock` 移動至 `IPC` 等待事件類型 (IPC:BufferIO)。

## Context
<a name="apg-waits.lwlockbufferio.context"></a>

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

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

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

**注意**  
`LWLock:BufferIO` 等待事件在 [IO:DataFileRead](apg-waits.iodatafileread.md) 等待事件之前發生。從儲存讀取資料時會發生 `IO:DataFileRead` 等待事件。

如需輕量級鎖定的詳細資訊，請參閱[鎖定概觀](https://github.com/postgres/postgres/blob/65dc30ced64cd17f3800ff1b73ab1d358e92efd8/src/backend/storage/lmgr/README#L20)。

## 原因
<a name="apg-waits.lwlockbufferio.causes"></a>

`LWLock:BufferIO` 事件出現在最常等待名單中的常見原因包括：
+ 多個後端或連線嘗試存取同一個分頁，而此分頁也擱置輸入/輸出操作
+ 共用緩衝集區 (由 `shared_buffers` 參數定義) 的大小與目前工作負載所需緩衝區數目之間的比率
+ 共用緩衝集區的大小與其他操作移出的分頁數目不太相稱
+ 大型或膨脹的索引迫使引擎將過多分頁讀入共用緩衝集區
+ 缺少索引迫使資料庫引擎從資料表讀取過多分頁
+ 嘗試對同一分頁執行操作的資料庫連線突然激增

## 動作
<a name="apg-waits.lwlockbufferio.actions"></a>

我們根據等待事件的原因，建議不同的動作：
+ 觀察 Amazon CloudWatch 指標，以瞭解 `BufferCacheHitRatio` 和 `LWLock:BufferIO` 等待事件遽降之間的關聯。這可能表示共用緩衝區設定太小。您可能需要提高此設定，或擴充資料庫執行個體類別的規模。您可以將工作負載分割成更多讀取器節點。
+ 驗證是否有未使用的索引，然後移除。
+ 使用分割的資料表 (也有分割的索引)。這樣做有助於盡量避免索引重新排序，並減少其影響。
+ 避免不必要地編製資料欄的索引。
+ 使用連線集區來防止資料庫連線突然激增。
+ 在最佳實務上限制資料庫的連線數目上限。