

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

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

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

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

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

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

## Context
<a name="wait-event.lwlockbufferio.context"></a>

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

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

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

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

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

## 原因
<a name="wait-event.lwlockbufferio.causes"></a>

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

## 動作
<a name="wait-event.lwlockbufferio.actions"></a>

我們根據等待事件的原因，建議不同的動作：
+ 如果您發現與 `BufferCacheHitRatio` 指標一致的 `LWLock:BufferIO` 下降，請根據工作負載尖峰時段來調校 `max_wal_size` 和 `checkpoint_timeout`。然後查明哪個查詢造成此狀況。
+ 驗證是否有未使用的索引，然後移除。
+ 使用分割的資料表 (也有分割的索引)。這樣做有助於盡量避免索引重新排序，並減少其影響。
+ 避免不必要地編製資料欄的索引。
+ 使用連線集區來防止資料庫連線突然激增。
+ 在最佳實務上限制資料庫的連線數目上限。