KingbaseESV8R6等待事件之LWLockBuffer_IO

说明

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

等待事件发生过程

每个shared buffer都有一个与LWLock:BufferIO等待事件关联的I/O锁,每次都必须在共享缓冲池外检索块。
此锁用于处理多个会话,这些会话都需要访问同一个块。必须从共享缓冲池外部读取此块,共享缓冲池由shared_buffers参数定义。
一旦可以在共享缓冲池中读取页面,就会释放LWLock:BufferIO锁。

注意:LWLock:BufferIO等待事件早于IO:DataFileRead等待事件发生。当从存储读取数据时发生IO:DataFileRead等待事件。
这两个等待事件区别在于一个是轻量级锁类型,一个是IO类型。

等待事件产生原因
LWLock:BufferIO事件出现在TOP等待中的常见原因包括:

多个后端进程或连接试图访问正在进行的I/O操作的同一个page。

大型或膨胀的索引,后端进程需要向共享缓冲池中读取巨量的页面。

缺少索引,这会迫使数据库从表中读取超出需要的页面。

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

试图在同一页上执行操作的数据库连接突然出现峰值。

解决方法
根据等待事件的原因,我们建议采取如下操作:

了解共享缓冲池命中率下降和LWLock:BufferIO等待事件之间的相关性,随着共享缓冲池中命中率降低,有可能伴随LWLock:BufferIO等待事件增加,
可能存在shared_buffers太小的设置,建议适当调大该参数。
查看共享缓冲池命中率的语句:
select userid,dbid,queryid,query,shared_blks_hit from sys_stat_statements;

如果看到LWLock:BufferIO与BufferCacheHitRatio下降一致(注意kwr中blocks hit指标是shared_blks_hit和local_blks_hit共享块和本地块的和),
根据业务系统繁忙程度适度调整max_wal_size和checkpoint_timeout,然后确定可能是哪个查询引起的。

检查是否有未使用的索引,然后将其删除。

使用分区表(分区索引),这样做有助于保持索引的低排序,并减少其影响。

避免对列进行不必要的索引,包括重复索引。

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

限制数据库的最大连接数。

posted @ 2024-04-03 17:01  KINGBASE研究院  阅读(23)  评论(0编辑  收藏  举报