oracle cache buffer lru chain(一)
oracle database buffer cache:
一、
1)buffer cache 定义:
数据缓存区是copy的数据块信息存在buffercache中sga的一个块区域。所有的客户端进程都能够并发的访问实例来共享这buffer cache。
2)buffer cache实现的目标:
1、优化磁盘的物理读写
2、在buffer cache中保持频繁访问,延迟写入磁盘。
3)buffer状态
数据库使用内部算法来管理buffer cache,没个buffer存在如下情况之一。
1、unused
这种buffer是可以使用的,因为它从来没有被使用或是当前已经使用过了的。这种状态的buffer是最容易被使用的。
2、clean
这种缓冲区是最近使用的并且包含数据块的读一致性。这种数据块包含数据但是是干净的,所以没有必要进行检查点。数据库可以对它进行pin然后重新使用它
3、dirty
这种数据缓冲区包含被编辑的数据块,并且这些数据块还没有被写入磁盘。数据库必须对它进行checkpoint之后,然后再重新使用它。
Every buffer has an access mode: pinned orfree (unpinned). A buffer is "pinned" in the cache so that it doesnot age out of memory while a user session accesses it. Multiple sessionscannot modify a pinned buffer at the same time.
The database uses a sophisticated algorithmto make buffer access efficient. Pointers to dirty and nondirty buffers existon the same least recently used (LRU) list, which has a hot end and cold end. Acold buffer is one that has not been recently used. A hot buffer is frequentlyaccessed and has been recently used.
4)buffer write情况
数据库使用dbwn进程来完成数据从buffer cache写入到datafile中。该进程个数可以通过db_writer_processes参数进行设置。
另外在dbwn进程在执行写的条件有如下:
1)当服务今次那个不能够发现clean请求的buffer的时候,将会执行写操作,这个也受一个隐含参数控制:
SQL> select kvitval,kvittag,kvitdsc fromx$kvit where kvittag='kcbfsp';
KVITVAL KVITTAG KVITDSC
-------------------------------------------------------------------------- ----------------------------------------------------------------
40 kcbfsp Max percentage of LRU list foreground can scan for free
SQL>
还有就是dirty lru达到一定值的时候,需要进行写出操作,这个值也收一个隐含参数控制:
SQL> select kvitval,kvittag,kvitdsc fromx$kvit where kvittag='kcbldq';
KVITVAL KVITTAG KVITDSC
------------------------------------------------------------------------------------------------------------------------------------------
25 kcbldq large dirty queue if kcbclw reaches this
SQL>
2、在完成检查点之前需要写出buffercache。
5)buffer 读的情况
对于oracle clean或是unused buffer的数量很少的时候,那么数据库就会执行删除的操作。这种机制取决于flash cache是否启动了
注意:数据库的smart flash cache只能在solaris和oracle enterprise linux中使用。
flash cache 没有启动:
数据库就会重新使用clean的buffer,或是覆盖之后进行使用。如果覆盖之后的数据过会又被使用,那么只能进行物理的读写操作,把数据文件的信息重新读取到buffer中。
flash cahce 启动:
当dbwn进程能够把clean buffer的body写入到flash cache中,然后再内存中重新使用buffer,这时候数据库会保持原先的数据header存在于内存中的lru链中,数据存在flash cache中。当这个buffer 在此被使用的时候,就会从flash cache进行读取而不是进行物理的读写操作,从而提高了效率。
当一个客户端请求数据的时候,来看一下服务进程执行过程:
1) 首先服务进程搜索全部buffercache,如果找到了,那么就进行逻辑读取信息返回给client
2) 服务进程搜索在flashcache lru list中的buffer header信息。
如果找到了buffer header,那么就会执行最优化的把信息从flash cache中读取到memory cache。
3) 如果服务进程没有找到需要的buffer信息,那么就会进行如下两部:
1、 执行物理读取数据文件信息,把数据块copy到内存中
2、 在buffer 中执行逻辑读取然后返回给用户信息
另外在来看一下flash cache这一部分知识,请查看联机手册:
http://docs.oracle.com/cd/E11882_01/server.112/e25494/memory.htm#BABHEDBH
二、
在oracle的内存中存在很多list进行管理,转储一下buffer然后查看一下具体情况:
对于内存转储有如下等级;
Level 1 :包含buffer headers信息
Level 2:包含buffer headers和buffer概要信息
Level 3:包含buffer headers和完整的buffer内容转储
Level 4:level 1+ latch转储+LRU队列
Level 5: level4 + buffer概要信息转储
Level 6和level 7:level4+完整的buffer内存转储
Level 8:level4+显示users/waiters信息
Level 9:level5 +显示users/waiters信息
Level 10:level 6+显示users/waiters信息:
Eg:
SQL> alter system set events 'immediatetrace name buffer level 4';
System altered.
注意:转储的等级越高,trace文件就越大,内容就越详细,但是注意:max_dump_file_size 参数的设置为没有限制大小,不要在现网中进行很高等级的buffer cache转储操作。
查看信息:
Dump of buffer cache at level 4 fortsn=2147483647, rdba=0
(WS) size: 0 (0) wsid: 1 state: 0 pool: 1
(WS_REPL_LIST) main_prev: 0x76e40858 main_next: 0x76e40858 aux_prev:0x76e40868 aux_next: 0x76e40868
curnum: 0 a