KingbaseES V8R6 等待事件之LWLock Buffer_IO

发布时间 2023-05-09 19:41:51作者: KINGBASE研究院

等待事件含义

当进程同时尝试访问相同页面时,等待其他进程完成其输入/输出(I/O)操作时,会发生LWLock:BufferIO等待事件。其目的是将同一页读取到共享缓冲区中。

每个共享缓冲区都有一个与LWLock:BufferIO等待事件相关联的I/O锁,每次都必须在共享缓冲区外部检索页。

此锁用于处理多个会话,假如这些会话都需要访问同一块。必须从共享缓冲池外部读取此块,共享缓冲池大小由shared_buffers参数定义。

一旦在共享缓冲池中读取到页面,就会释放LWLock:BufferIO锁。

注意:

LWLock:BufferIO等待事件先于IO:DataFileRead等待事件。从存储读取数据时发生IO:DataFileRead等待事件。

等待事件增加的可能原因

多个后端进程或连接试图访问正在进行I/O活动的同一页面

共享缓冲池的太小,大型或膨胀的索引,需要向共享缓冲池中读取比膨胀前更多的数据。

缺少索引,这迫使数据库引擎从表中读取的页面超过了必要的数量。

检查点出现频率太高或需要刷新太多脏块

试图在同一页面上执行操作的数据库连接突然出现峰值,造成并发争用问题

解决方法

根据等待事件的原因,我们建议采取以下操作:

shared_buffer中的HitRatiio急剧下降和LWLock:BufferIO等待事件之间存在相关性。这种效果可能需要增加shard_buffer大小。还可以应用读写分离集群分摊数据库负载到不同实例。

如果您看到LWLock:BufferIO增加与BufferCacheHitRatio指标下降,则根据您的工作负载峰值时间调整max_wal_size和checkpoint_timeout。然后确定可能是哪个查询导致的。

验证是否有未使用的或不必要的索引,然后将其删除。

使用分区表(应用分区索引)。这样做有助于尽量低的将索引重新排序,并减少其影响。

通过使用连接池来防止突然的数据库连接高峰。

作为最佳方案,限制与数据库的最大连接数。并适时中断连接,释放内存。