ITPub博客

首页 > 数据库 > Oracle > 深入浅出buffer cache和shared pool记载01

深入浅出buffer cache和shared pool记载01

原创 Oracle 作者:dotaddjj 时间:2011-12-08 20:22:47 0 删除 编辑

开始静下心来好好看书了,再次翻看egyle的深入浅出的buffer cache于shared pool原理,看得够呛,eygle剖析得很有点深,记载以下书中的有些要点和个人理解!

Sga的buffer cache对oracle体系有些了解的都了解一些,用户进程递交请求给服务器进程,服务器进程不会在disk磁盘上直接获取数据都会构造一个buffer cache的内存机构来缓存数据,数据的修改 读取都是在buffer cache获取然后写给磁盘,同样在大多数os上也是采取的缓存机制,自己最近也在看鸟哥的linux私房菜,文件系统的e2和e3正是采用的缓存机制交换数据,而且e3中还采用了oracle中的所谓的redo机制来实现数据的安全保障。

进程发出请求获取数据,先确定在buffer cache中是否存在如果存在则根据block的状态(scn)和查询的scn来判断是否需要从回滚段构造一致性读取,如果数据在buffer cache不存在,则需要首先在buffer cache中寻找空闲空间然后从disk上获取数据先到buffer cache中然后给相应的进程,期间可能会dbwn去写出脏数据,释放buffer空间!

Buffer cache中,通过几个链表进行内存管理,LRU list和Dirty list,Dirty list又被称为wirte list或者checkpoint queue,list上存放的都是buffer的指针。

LRU list用于维护内存中的buffer,按照LRU先进先出的队列形式管理,数据库初始化时,所有buffer都经过一个hash运算hash到LRU list上,如果一个进程需要需要读取相应的数据,此时假定在buffer cache中不存在,oracle就需要从disk上获取数据到相应的空闲buffer中,此时就需要扫描LRU list寻找空闲buffer,而数据一旦修改就会变为Dirty,也就可以被移动至Dirty list中去了(官方文档中也提到了最近最少使用列表LRU list中记录的是可用缓冲区(free buffer),锁定缓冲区(pinned buffer),及还没被移入待写列表的脏缓冲区。可用缓冲区内的数据无需继续保留,可以用于存储新数据。而锁定缓冲区是正在被访问的缓冲区。)之前自己也理解为LRU list上只会存放非dirty的块,但是dirty list上却是只会存在dirty 块。

这里根据eygle的介绍细化一下关于数据的读取:

1 server进程首先判断数据在buffer中是否存在,存在即判断是否需要根据回滚段构造一致性读取,然后根据LRU list先进先出算法在LRU list上移动相应的block,如果不存在则从磁盘获取数据到buffer cache中。

2 此时由于需要把磁盘上相应的block截取到buffer cache中,需要在buffer cache中查找相应的空闲buffer用于存放,server进程会扫描LRU list从LRU末端开始搜索,扫描过程中发现的dirty buffer会移动到checkpoint queue上。此时如果扫描了LRU list的40%还没有找到相应的空闲buffer,server进程会停止搜索,通知dbwn写出,此时进程会处于free busy wait。

Select kvittag,kvitval,kvitdsc from x$kvit where kvittag=’kcbfsp’ 相应的数据字典查询

kcbfsp 40 Max percentage of LRU list foreground can scan for free

此时就会把LRU list的dirty移到dirty list上去。

在9IR2时同时由于增量checkpoint,dbwn也会主动扫描LRU list,将发现的dirty buffer移动dirty list上去

Select kvittag,kvitval,kvitdsc from x$kvit where kvittag=’kcbdp’ 相应的数据字典查询,不过在10G后却找不到这个阀值了!

Kcbdsp 25 max percentage of lru list dbwriter can scan for dirty

3 同样如果checkpoint queue超过了阀值,也就是当检查点队列超过25%满时,也会触发dbwn写

Select kvittag,kvitval,kvitdsc from x$kvit where kvittag=’kcbldq’ 相应的数据字典查询

kcbldq 25 large dirty queue if kcbclw reaches this

4 如果找到足够的buffer之后,server进程将从disk获取数据到buffer cache,此时如果当前的buffer的相应的scn和查询时刻的scn不一致,还需要从当前的block版本和回滚段构造构造相应的数据块给用户!

从oracle8I开始,LRU list和Dirty list又分别增加了辅助list(AUXILIARY List),用于提高管理效率。

Alter session set events ‘immediate trace name buffers level 4’转储buffers可以查看具体的list信息,其中还有其他分类的List(这个转储文件很大,查看一下max_dump_file_size参数,在10g中默认的为unlimited)

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1056767/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662982