LWLock - buffer_content
当某个会话等待读取或写入内存中的某个数据页面,而另一个会话正锁定该页面以进行写入时,会发生 buffer_content
事件。
要读取或操作数据,PostgreSQL 会通过共享内存缓冲区访问数据。要从缓冲区读取,进程会在共享模式下获取缓冲区内容的轻量级锁 (LWLock)。要写入缓冲区,它会在独占模式下获得该锁。共享锁允许其他进程同时获取对该内容的共享锁。独占锁可防止其他进程获取对该内容的任何类型的锁定。
buffer_content
事件表示多个进程试图获取对特定缓冲区的内容的锁定。
当buffer_content
事件的发生率超过正常(可能表示性能问题)时,典型原因包括以下几点:
-
增加了对同一数据的并发更新
更新相同缓冲区内容的查询的并发会话数可能会增加。在具有大量索引的表中,这种争用可能更加明显。
-
工作负载数据不在内存中
当活动工作负载正在处理的数据不在内存中时,这些等待事件可能会增加。这种影响是因为持有锁的进程可以在执行磁盘输入/输出操作时保持更长时间。
-
过度使用外键约束
外键约束可能会增加进程在缓冲区内容锁上保留的时间。这种影响是因为读取操作需要在更新引用的键时对该键进行共享缓冲区内容锁定。
根据等待事件的原因,我们建议采取不同的操作。您可以通过查询视图 pg_stat_activity
来识别 buffer_content
事件。
为了增加活动工作负载数据在内存中的可能性,请对表进行分区或纵向扩展您的实例类。
调查在使用外键约束时遇到大量buffer_content
等待事件的工作负载。删除不必要的外键约束。
对于遇到大量buffer_content
等待事件的工作负载,识别未使用的索引并删除它们。