一、Buffer Cache等待事件主要分为3个级别:
用户级等待
后台进程级别(dbwr)等待;
RAC集群等级等待
DBWR后台等待产生于DBWR进程将BUFFER写入磁盘以及扫描LRU链的等待,包含DBWR写操作超时、请求释放空间时扫描LRU链的时间消耗,checkpoint检查点。
二、等待事件我们常见的主要有以下三种:
buffer busy waits
free buffer waits
write complete waits
三、Buffer Cache命中率:
Buffer Cache的IO以及DBWR是否需要优化,可以首先看下Buffer Cache的命中率:
Buffer Cache的命中率算法:
100 (1-物理读/(一致性获取量+数据块获取量))
则其SQL为:
select to_char(100(1-phy.value/(c.value+b.value)),‘99999.999’) ||’ %’ buffer_cache_hitratio
from v
s
y
s
s
t
a
t
c
,
v
sysstat c,v
sysstatc,vsysstat b,v$sysstat phy
where c.name=‘consistent gets’
and b.name=‘db block gets’
and phy.name=‘physical reads’;
这个值,通常会大于90%,如果在90%以下,那么说明Buffer Cache IO、DBWR则需要优化了
Buffer Cache IO优化的方法主要可以从以下几点入手:
由于DBWR进程,主要就是将Buffer Cache中的数据块进行落盘,写到磁盘中,所以我们可以从写入磁盘方式、硬件方面、数据库参数方面进行考虑:
第一点,可以考虑采用高性能IO的磁盘,如SSD,提升系统的iops、tps等
第二点,将物理存储进行条带化,使得物理IO均衡到多个磁盘,减少IO争用(asm等方式)
第三点,直接使用IO加载,直接插入操作,跳过Buffer Cache,即通过insert /+append/、sqlldr等方式进行直接数据写入(但是需要注意的是append,会造成表锁)
第四点,适当调节参数_sort_multiblock_read_count(默认为2)/db_file_multiblock_read_count(12c中,默认为128)来提高IO性能
第五点,在一些场景中,可以考虑增加DBWR并行度(进程数)来增加写入速度,即修改dbwr_io_slaves(默认为0)/db_writer_processes(默认为1)。
四、当出现buffer busy waits或者free buffer waits的时候该考虑如何优化:
1.buffer busy waits
首先,我们需要了解以下buffer busy waits产生的原因:
1)多个session访问同一个buffer block;
2)多个session等待同一个buffer block(Pin X)的更改提交(与事务相关)。
因此,我们可以发现,buffer busy waits产生的主要原因就是多个会话访问到了同一个数据块,此时该数据块可以被认为是热点块。故我们可以考虑到的解决方法有:
1)将热点块数据分离到不同的block。比如,增加pctfree百分比。
2)对于索引热快的争用,可以考虑使用反向索引将热快分裂到不同的块将热快分裂到不同的块。
3)优化数据的存储方式,采用非顺序的方式随机将同一个块中的记录分散到不同数据块中。
2.free buffer waits
同样,我们需要先了解下free buffer waits产生的原因:
1)LRUW(缓存写入磁盘的buffer)过满;
2)DBWR进程不能及时快速清除LRUW链。
因此,我们可以发现,产生free buffer waits的主要原因是因为LRUW链无法快速释放,没有空闲buffer了,所以会话都在等待空闲的buffer,此时则会产生该等待事件。故我们可以考虑的解决方法有:
1)增加DBWR批量写的大小,我们可以通过增大参数_db_large_dirty_queue(默认25)进行设置;
2)采用SSD条带化磁盘,使DBWR更快写到磁盘
3)使用异步I/O,通过调整参数_dbwr_async_io(默认是true)进行设置
4)适当减少LRU List的数量
5)在使用多个LRUW List的时候使用多个DBWR进程
6)确保’cache buffers lru chain latch’的命中率高于99%
select l.name,
to_char(100 * (1 - sum(misses + l.immediate_misses) / sum(l.gets + l.immediate_gets)),‘9999999.999’) || ‘%’ latch_hitratio
from v$latch_children l
where l.name like ‘&latch_name%’ group by l.name;
输入:cache buffers lru chain
7)使用直接IO加载,直接插入操作,跳过Buffer Cache,提升DBWR写磁盘速度。