

# LWLock:buffer\$1content (BufferContent)
<a name="wait-event.lwlockbuffercontent"></a>

当某个会话等待读取或写入内存中的某个数据页面，而另一个会话正锁定该页面以进行写入时，会发生 `LWLock:buffer_content` 事件。在 RDS for PostgreSQL 13 及更高版本中，此等待事件称为 `BufferContent`。

**Topics**
+ [支持的引擎版本](#wait-event.lwlockbuffercontent.context.supported)
+ [上下文](#wait-event.lwlockbuffercontent.context)
+ [等待次数增加的可能原因](#wait-event.lwlockbuffercontent.causes)
+ [操作](#wait-event.lwlockbuffercontent.actions)

## 支持的引擎版本
<a name="wait-event.lwlockbuffercontent.context.supported"></a>

RDS for PostgreSQL 的所有版本均支持此等待事件信息。

## 上下文
<a name="wait-event.lwlockbuffercontent.context"></a>

要读取或操作数据，PostgreSQL 会通过共享内存缓冲区访问数据。要从缓冲区读取，进程会在共享模式下获取缓冲区内容的轻量级锁 (LWLock)。要写入缓冲区，它会在独占模式下获得该锁。共享锁允许其他进程同时获取对该内容的共享锁。独占锁可防止其他进程获取对该内容的任何类型的锁定。

`LWLock:buffer_content` (`BufferContent`) 事件表示多个进程试图获取对特定缓冲区的内容的锁定。

## 等待次数增加的可能原因
<a name="wait-event.lwlockbuffercontent.causes"></a>

当 `LWLock:buffer_content` (`BufferContent`) 事件的发生率超过正常（可能表示性能问题）时，典型原因包括以下几点：

**增加了对同一数据的并发更新**  
更新相同缓冲区内容的查询的并发会话数可能会增加。在具有大量索引的表中，这种争用可能更加明显。

**工作负载数据不在内存中**  
当活动工作负载正在处理的数据不在内存中时，这些等待事件可能会增加。这种影响是因为持有锁的进程可以在执行磁盘输入/输出操作时保持更长时间。

**过度使用外键约束**  
外键约束可能会增加进程在缓冲区内容锁上保留的时间。这种影响是因为读取操作需要在更新引用的键时对该键进行共享缓冲区内容锁定。

## 操作
<a name="wait-event.lwlockbuffercontent.actions"></a>

根据等待事件的原因，我们建议采取不同的操作。您可以通过使用 Amazon RDS 性能详情或查询视图 `pg_stat_activity` 来识别 `LWLock:buffer_content` (`BufferContent`) 事件。

**Topics**
+ [提高内存中的效率](#wait-event.lwlockbuffercontent.actions.in-memory)
+ [减少对外键约束的使用](#wait-event.lwlockbuffercontent.actions.foreignkey)
+ [删除未使用的索引](#wait-event.lwlockbuffercontent.actions.indexes)
+ [使用序列时增加缓存大小](#wait-event.lwlockbuffercontent.actions.sequences)

### 提高内存中的效率
<a name="wait-event.lwlockbuffercontent.actions.in-memory"></a>

为了增加活动工作负载数据在内存中的可能性，请对表进行分区或纵向扩展您的实例类。有关数据库实例类的信息，请参阅 [数据库实例类](Concepts.DBInstanceClass.md)。

### 减少对外键约束的使用
<a name="wait-event.lwlockbuffercontent.actions.foreignkey"></a>

调查在使用外键约束时遇到大量`LWLock:buffer_content` (`BufferContent`) 等待事件的工作负载。删除不必要的外键约束。

### 删除未使用的索引
<a name="wait-event.lwlockbuffercontent.actions.indexes"></a>

对于遇到大量 `LWLock:buffer_content`(`BufferContent`) 等待事件的工作负载，识别未使用的索引并删除它们。

### 使用序列时增加缓存大小
<a name="wait-event.lwlockbuffercontent.actions.sequences"></a>

如果您的表使用序列，请增加缓存大小以消除序列页和索引页上的争用。每个序列都是共享内存中的单个页面。预定义缓存是对应于每个连接的。当许多并发会话获取序列值时，这可能不足以处理工作负载。