oracle Buffer Cache的管理机制

1、LRU链表结构概述

在前面,我们已经知道了Oracle是如何在hash chain中搜索要找的数据块所对应的buffer header的过程,我们也知道如果在hash chain上没有找到所要的buffer header时,Oracle会发出I/O调用,到磁盘上的数据文件中获取数据块,并将该数据块的内容复制一份到buffer cache中的内存数据块里。这个时候,假如buffer cache是空的,比较好办,直接拿一个空的内存数据块来用即可。但是如果buffer cache中的内存数据块全都被用掉了,没有空的内存数据块了,怎么办?应该重新使用哪一个内存数据块?当然我们可以逐个比较内存数据块与其对应在数据文件中的数据块的内容是否一致,如果一致则可以将该数据块拿来,将其内容清空,然后将当前数据块的内容复制进入;如果不一致,则说明数据块在内存里被修改了,但是还没有写入数据文件,因此该数据块不能被其他内容覆盖,则跳过,再找下一个。毫无疑问,这种方式效率低下。为了高效地管理buffer cache中的内存数据块,Oracle引入了LRU链表等结构。

在buffer cache中,最耳熟能详的链表可能就是LRU链表了。在前面描述buffer cache结构的图上,也可以看到LRU链表。在介绍LRU前,先说明几个概念。

脏数据块(dirty buffer):buffer cache中的内存数据块的内容被修改,从而导致与数据文件中的数据块的内容不一致。

空闲数据块(free buffer):buffer cache中的内存数据块为空。

干净数据块(clean buffer):buffer的内容与数据文件中的一致。

钉住的数据块(pin buffer):当前正在更新的内存数据块。

数据库写进程(DBWR):这是一个很底层的数据库后台进程。既然是后台进程,就表示该进程是不能被用户调用的。由Oracle内置的一些事件根据需要启动该进程,该进程用来将脏数据块写入磁盘上的数据文件。

对于空闲数据块和干净数据块,我们一般都统称为可用数据块,因为其中的内容可以被新的数据内容覆盖。其他状态的数据块,比如脏数据块,则不能被新的内容覆盖。

LRU表示Least Recently Used,也就是指最近最少使用的buffer header链表。LRU链表串联起来的buffer header都指向可用数据块。buffer按照被使用的先后顺序挂在LRU链表上,先被使用的buffer挂在LRU链表的后面,后被使用的buffer则被挂在LRU链表的前面。如果buffer被DML语句修改了,则该buffer会从LRU链表上摘下来。换句话说,LRU链表上的buffer header所指向的buffer都是可用数据块。

当服务器进程无法找到空的buffer来存放新的数据请求时,则需要把已经存放了数据的buffer拿来使用,也就是用新的数据块的内容覆盖曾经使用过的buffer。在查找应该覆盖哪个buffer时,Oracle会在LRU链表上的尾部开始扫描,如果扫描到的buffer正在被使用,则跳过该buffer,继续往下找,直到找到为止。如果扫描了一定数量的buffer以后还没找到可用的buffer,则说明脏块太多了,于是触发DBWn进程,将脏块刷新到数据文件里,刷新完毕以后,buffer的内容与数据文件里的一致,于是这些脏块就变成干净的buffer了,也就可以拿来覆盖其中的内容了。这些干净的buffer就会挂在LRU链表的尾部,供进程所使用。

当进程在LRU链表上扫描可用数据块时,会受到cache buffers lru chain latch的保护

2、DBWn进程

我们已经知道DBWn进程负责将脏数据块写入磁盘。它是一个非常重要的进程,随着内存的不断增加,一个DBWn进程可能不够用了。所以从Oracle 8i起,我们可以为系统配置多个DBWn进程。初始化参数db_writer_processe决定了启动多少个DBWn进程。每个DBWn进程都会分配一个cache buffers lru chain latch。

DBWn作为一个后台进程,只有在某些条件满足了才会触发。这些条件包括:

当进程在LRU链表扫描以查找可以覆盖的buffer header时,如果已经扫描的buffer header的数量到达一定的限度时,触发DBWn进程;

如果脏数据块的总数超过一定限度,也将触发DBWn进程;

发生检查点(包括增量检查点(incremental checkpoint)和完全检查点(complete checkpoint))时触发DBWn;

每隔三秒钟启动一次DBWn;

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-11-10 00:00:50

oracle Buffer Cache的管理机制的相关文章

Oracle中log buffer的内部管理机制概述

日志缓冲区的内部管理分为两部分,一部分是生成重做记录,另一部分就是重做记录写入联机日志文件.这两部分不是孤立的,没有关联的.在生成重做记录的过程中,可能会触发LGWR将重做记录写入联机日志文件. 我们先用一个例子来说明在日志缓冲区中的操作过程,并使用[file# , blk#]来表示某个数据块:file#表示文件号:blk#表示数据块号. 假设session 1发出更新语句:update redo_test set name='cdf' where id=1; Oracle首先找出id=1所在的

buffer cache 内存管理物理结构纯干货

buffer cache 里有三种数据结构来管理内存空间 1 hash chain 2 LRU LIST 3 DIRTY LIST hash chain 是为快速定位buffer cache中块的结构,主要通过hash链表实现.每个hash桶对应一个hash链.链上每个header指向一个数据块,  一个hash latch管理多个hash桶.  有对应隐含参数管理latch个数,和hash桶的个数.大概一个latch管理32个hash桶.latch就是桶上的锁,如果两个进程都已只读方式读取链上

buffer cache 深度解析+

本文内容整理自网络:     本文首先详细介绍了oracle中buffer cache的概念以及所包含的内存结构.然后结合各个后台进程(包括DBWRn.CKPT.LGWR等)深入介绍了oracle对于buffer cache的管理机制,并详细解释了oracle为什么会采用现在的管理机制,是为了解决什么问题.比如为何会引入touch次数.为何会引入增量检查点等等.最后全面介绍了有关buffer cache监控以及调优的实用方法. 1. buffer cache的概念   用最简单的语言来描述ora

Oracle内存结构详解(二) Oracle管理Buffer Cache

Buffer Cache是SGA区中专门用于存放从数据文件中读取的的数据块拷贝的区域.Oracle进程如果发现需要访问的数据块已经在buffer cache中,就直接读写内存中的相应区域,而无需读取数据文件,从而大大提高性能(内存的读取效率是磁盘读取效率的14000倍).Buffer cache对于所有oracle进程都是共享的,即能被所有oracle进程访问. 和Shared Pool一样,buffer cache被分为多个集合,这样能够大大降低多CPU系统中的争用问题. 1.Buffer c

《Oracle高性能自动化运维》一一2.4 Buffer Cache

2.4 Buffer Cache 2.4.1 Buffer(Cache)Pool 1. Buffer(Cache)Pool组成结构 Oracle Buffer Cache由3个Buffer Pool组成,如图2-9所示. 其中: Default Pool:默认池,用于缓存常规数据: Keep Pool:保留池,主要用于缓存频繁更新的小表: Recycle Pool:回收池,用于缓存随机使用的大表. 2. Buffer Pool与Working Set Buffer Pool与Working Se

oracle中如何设置buffer cache

buffer cache的设置随着Oracle版本的升级而不断变化.Oracle 8i下使用db_block_buffers来设置,该参数表示buffer cache中所能够包含的内存数据块的个数:Oracle 9i以后使用db_cache_size来设置,该参数表示buffer cache的总共的容量,可以用字节.KB.MB为单位来进行设置.而到了Oracle 10g以后则更加简单,甚至可以不用去单独设置buffer cache的大小.因为Oracle 10g引入了ASMM(Automatic

Linux内核文件cache管理机制介绍

1 操作系统和文件Cache管理 操作系统是计算机上最为重要的软件,他负责管理计算机的各种硬件资源,并将这些物理资源抽象成各种接口供上层应用使用.所以从程序的角度看,操作系统就好比是一个虚拟机,这个虚拟机不提供各种硬件资源的具体细节,而仅仅提供进程.文件.地址空间以及进程间通信等等逻辑概念. 对于存储设备上的数据,操作系统向应用程序提供的逻辑概念就是"文件".应用程序要存储或访问数据时,只需要向这个文件读或者写入内容即可,而文件与物理存储设备的交互则由操作系统提供. 2 文件Cache

Oracle中ASM Buffer Cache的作用和功能

10g在视图v$sga_dynamic_components中我们注意到多了一个component:ASM Buffer Cache,并且在instance_type=asm的实例中该参数有值,也就是说该参数是为asm实例所使用,它是用来做什么,在doc中搜了一下没找到,我猜测应该和db_cache_size的作用差不多,估计是用来cache disk header信息的. SQL> select component,current_size from v$sga_dynamic_compone

揭密Oracle之七种武器之四:揭密Buffer Cache中的链表

有日子没写东西了.又是看房又是讲课,好多朋友问我是不是不写了,怎么会呢,分享知识,也是自我总结的一个过程,对自己的提高也是有帮助的吧. 前段时间,一直有人问我Buffer Cache的链表,LRU.辅助LRU.检查点队列等等.检查点队列已经有很多文章讨论过了,我就不再重复的制造轮子 .  另外,还有主LRU冷热端的相关内容,这一块我也不再详细描述,因为也有相关的文章. 我主要说一下主LRU.辅助LRU和LRUW相关的内容. 本篇文章没有使用DTrace和GDB,难度较低,但实验内容较多.我先将结