物理读之LRU(最近最少被使用)的深入解析
一组 LRU 链表包括 LRU 主链, LRU 辅助链, LRUW 主链, LRUW 辅助链,称为一个 WorkSet( 工作组 ) 如下图: 650) this.width=650;" src="http://www.68idc.cn/help/uploads/allimg/151214/10060LM3-0.jpg" title="111.png" alt="wKioL1PXLA_RrQwAAAE_O1bng
一组LRU链表包括LRU主链,LRU辅助链,LRUW主链,LRUW辅助链,称为一个WorkSet(工作组)如下图:
sys@ZMDB> selectCNUM_SET,CNUM_REPL,ANUM_REPL,CNUM_WRITE,ANUM_WRITE from x$kcbwds whereCNUM_SET>0;
CNUM_SET CNUM_REPL ANUM_REPL CNUM_WRITE ANUM_WRITE
---------- ---------- ---------- --------------------
15221 15221 3796 0 0
15221 15221 3783 0 0
CNUM_SET:工作组总的buffer总数量
CNUM_REPL:工作组中LRU的buffer总数量(主LRU+辅LRU)
ANUM_REPL:工作组中辅LRU总BUFFER的数量
通过隐含参数查到BUFFER的总的个数是30442,正好与上面的CNUM_SET=15221+15221
sys@ZMDB>@?/rdbms/admin/show_para
Enter value for p: _db_block_buffers
old 12: AND upper(i.ksppinm) LIKEupper('%&p%')
new 12: AND upper(i.ksppinm) LIKEupper('%_db_block_buffers%')
P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIEDISADJ
------------------------------------------------------------------------------------------------------------------------ --------- ---------- -----
_db_block_buffers Number of database blocks cached inmemory: hidden 30442 TRUE FALSE FALSE
Parameter
我们用以下语句查下数据库中buffer所在LRU的状态
sys@ZMDB> select lru_flag,count(*) from x$bh group by lru_flag;
LRU_FLAG COUNT(*)
---------- ----------
6 208
2 10
4 7122
8 15199
0 7646
我们对LRU_FLAG=6,2,4,8,0等做出解释,举个例子,对于6是什么含义呢?
首先要在x$bh中找到lru_flag=6的任意的一个BUFFER
sys@ZMDB> select LRU_FLAG,LOWER(BA)from x$bh where lru_flag=6 andrownum=1;
LRU_FLAG LOWER(BA)
---------- ----------------
6 0000000081dae000
DUMP buffer_cache中BH信息,如下命令:
sys@ZMDB>alter session set events'immediate trace name buffers level 1';
Session altered.
ys@ZMDB> col value for a85
sys@ZMDB> select * from v$diag_info where name='Default TraceFile';
INST_ID NAME VALUE
---------- ---------------------------------------------------------------------------------------------------------------------------------------
1 Default Trace File /u01/app/oracle/diag/rdbms/zmdb/zmdb/trace/zmdb_ora_13235.trc
通过BA=81dae000搜索trace文件,
/u01/app/oracle/diag/rdbms/zmdb/zmdb/trace/zmdb_ora_13235.trc
得到如下内容:
BH (0x81fe7e38) file#: 1 rdba: 0x0040ace1 (1/44257) class: 1 ba:0x81dae000
set: 6 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc:0,25
dbwrid: 0 obj: 421 objn: 423 tsn: 0 afn: 1hint: f
hash: [0x9ef9d710,0x853f8da8] lru:[0x81fe7df0,0x81fe8050]
lru-flags: moved_to_tail on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL]objaq: [NULL]
st: CR md: NULL fpin: 'kdswh06: kdscgr' tch:1
cr: [scn: 0x0.80350f4d],[xid: 0x0.0.0],[uba:0x0.0.0],[cls: 0x0.80350f4d],[sfl: 0x0],[lc: 0x0.8034c532]
flags: block_written_once redo_since_read
LRU_FLAG=6的意思是lru-flags: moved_to_tail on_auxiliary_list,就是向LRU的辅助链表的尾部移动,这有可能是SMON从LRU的主链表上的非脏块、TCH并且状态是非