当前位置:数据库 > Oracle >>

oracle cache buffer lru chain(一)

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
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,