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,然后确定可能是哪个查询引起的。
检查是否有未使用的索引,然后将其删除。
使用分区表(分区索引),这样做有助于保持索引的低排序,并减少其影响。
避免对列进行不必要的索引,包括重复索引。
通过使用连接池来防止突然出现数据库连接高峰。
限制数据库的最大连接数。