buffer cache实验6-latch:cache buffers lru chains

1.working set与Latch:cache buffers lru chain:

每个working set都具有它自己的一组LRU和LRUW链表(LRU和LRUW链表总是成对出现的)。
ORACLE为了提高buffer cache性能(大内存),使用了多个working set
每个working set都由一个名为“Latch:cache buffers lru chain”的latch来保护,每一个lru latch对应一个working set。
而每个被加载到buffer cache的buffer header都以轮询的方式挂到working set(包含的LRU链表)上去--。
而每个被加载到buffer cache的buffer header都以轮询的方式挂到working set上去。也就是说,当buffer cache加载一个新的数据块时,其对应的buffer header会去找一个可用的lru latch,如果没有找到,则再找下一个lru latch,直到找到为止。如果轮询完所有的lru latch也没能找到可用的lru latch,该进程只有等待latch free等待事件,同时出现在v$session_wait中,并增加“latch misses”。
如果启用了多个DBWR后台进程的话,每个DBWR进程都会对应一个不同的working set,而且每个DBWR只会处理分配给它的working set,不会处理其他的working set。

2.cache buffers lru chain LATCH的个数:

ORACLE默认创建的cache buffers lru chain LATCH数量与CPU个数、DBWR个数相关。
DBWR小于4,个数为:4*CPU个数
DBWR大于4,个数为:DBWR*CPU个数
每个buffer pool使用自己的cache buffers lru chain LATCH,一个数据库实例可以配置:DEFAULT,2KB,4KB,8KB,16KB,32KB,KEEP,RECYCLE 这8种类型的buffer pool,故cache buffers lru chain LATCH的数量最少为8个。详见: 点击打开链接
或使用以下语句查出buffer cache中各个pool中cache buffers lru chain LATCH的获取情况:  --语句来自周亮《ORACLE DBA实战攻略》
SYS@ bys3>select d.blk_size,c.child#,p.bp_name,c.gets,c.sleeps from x$kcbwds d,v$latch_children c,x$kcbwbpd p where d.set_latch=c.addr and d.set_id between p.bp_lo_sid and p.bp_hi_sid order by c.child#;

  BLK_SIZE     CHILD# BP_NAME                    GETS     SLEEPS
---------- ---------- -------------------- ---------- ----------
      8192          1 KEEP                         18          0
      8192          3 RECYCLE                      18          0
      8192          5 DEFAULT                  864096        144
      2048          7 DEFAULT                      18          0
      4096          9 DEFAULT                      18          0
      8192         11 DEFAULT                      18          0
     16384         13 DEFAULT                      18          0
     32768         15 DEFAULT                      18          0

在我的虚拟机中,CPU是一个,在10G中是有8个LRU LATCH,在11GR2中,是16个LRU LATCH.见:http://blog.csdn.net/haibusuanyun/article/details/19084583#t6

3.cache buffers lru chain LATCH在什么情况下需要使用:

数据块读入buffer cache前需要获得cache buffers lru chain LATCH--因为要到LRU上找空闲buffer
DBWR扫描LRUW链表前需要获得cache buffers lru chain LATCH
SMON将空闲buffer移动至LRU辅助列,也需要cache buffers lru chain LATCH。

4.cache buffers lru chain LATCH在哪些情况下出现争用:

简单说就是多个进程同时检索LRU/LRUW时出现。
具体情况有:   --物理读过多引起争用概念高。
多个会话并发访问不同表或索引,因为这样发生物理读可能较大--由上面可知物理读时需要在LRU找空闲buffer
脏块过多,DBWR写出慢(DBWR的性能不足-主机性能问题,或者磁盘I/O),涉及DBWR调优-在此不多讨论。

注:CBC LATCH主要发生在逻辑读时-多会话并发访问相同的表或索引-相同表或索引多集中于几条相同hash chain。


你可能感兴趣的:(buffer cache实验6-latch:cache buffers lru chains)