您的位置:首页 > Web前端

DB2的缓冲池(BUFFERPOOL)

2010-07-16 23:18 781 查看
DB2数据库在运行时会占用不少的系统内存。DB2按三个级别来管理内存(由OSS组件向其他组件提供):内存集、内存池和内存块。内存块组成内存池。内存池属于一个内存集。内存集里有多个内存池。缓冲池(BUFFERPOOL)就其中的一种内存池,这类型内存池消耗的内存数量最大。BUFFERPOOL里装载的是从表空间里读进的页(数据或索引)。

BUFFERPOOL可以有多个。每一个都有自己的配置信息。这些配置信息存放在SQLBP.1文件(放于实例目录下,SQLBP.2是其备份)和系统编目表SYSCAT.BUFFERPOOLS

SQLBP.1文件中有两种重要的信息:SQLB_BUFFERPOOL_HEARDER记录和SQLB_BUFFERPOOL_CB记录。

SQLB_BUFFERPOOL_HEARDER记录:

1)保存当前BUFFPERPOOL的个数

2)哪些BUFFERPOOL使用了标准页大小和数量,哪些使用了非标准页大小和数量

SQLB_BUFFERPOOL_CB记录:

1)一个BUFFPERPOOL对应一条SQLB_BUFFERPOOL_CB记录

2)占256字节

2)包含:BUFFERPOOL的名称、ID、页大小、页数、lifeLSN

DB2的BUFFPERPOOL是以页为单位来管理的。每一页有一个BPD(缓冲池页描述符),约100字节大小。所有BPD都保存在另一个内存池DB_HEAP(数据库堆)。BPD包含的数据结构和信息如下:

1)flags,取值包括

dirty,已被修改

new,刚被预取读入

prefetch_saw_it,预读程序准备读入时发现已在内存

prefetch_to_purge,预读程序将清除该页

prefetch_to_hate,被预读程序选为victim页而覆盖

2)fixcount计数,记录页面被引用的次数,>0表示正在被访问,不能换出

3)指向hash链表的指针(hashprev/hashnext)

4)指向hate链表的指针(hateprev/hatenext)

5)指向dirty链表的指针(dirtyprev/dirtynext)

6)BUFFERPOOL的池ID

7)页面对应对象的ID

8)页面对应对象的内容

9)缓冲池的页数

10)页面对应对象的页数

11)hflag,只是是否被连接到hate链表(值为0或对应链表的索引)

12)hashidx,hash桶的桶号(用池ID、对象ID、对象类型和页面号计算),-1表示未连接,-2表示选中做victim页

13)dflag,是否连接到dirty表

14)weight,反映页面再次被引用的可能性(由使用过页面的agent释放控制权时设置)

15)pminlsn,页在内存中第一次修改时产生的日志LSN号

HASH桶

hash桶主要用来快速查找页面。hash桶的个数约是BUFFERPOOL页面的1.5倍。每个桶都有一个指针指向该桶的第一个页面,通过该页的hash链表指针,DB2可以遍历整个BUFFERPOOL,由此找到想要的页或发现没有合适的页(BUFFERPOOL MISS)

HATE链表

遇到BUFFERPOOL MISS时,DB2会检查hate链表以找到一个victim页用于与将要读进的页替换。hate链表中fixcount为0而且weight为0的页面会被选中做victim页。通过页面的hate链表指针,DB2遍历整个hate链表,由此找到合适的victim页或发现没有合适的页。

时钟算法

BUFFERPOOL的页面通过指针一页接一页串联起来成为一条链。实际上这条链是首尾相接的,形成一个环。在遍历hate链表后仍然没有找到合适的victim页后,DB2再次按环的情形遍历BUFFERPOOL中的searchcount个页面,寻找fixcount为0而且weight最小的页作为victim页(尽量选非脏页)。如果仍然没有找到合适的页,BUFFERPOOL满的错误就会产生。

新页面置换算法

在较新版本的DB2中,把注册标量DB2_USER_ALTERNATE_PAGE_CLEANING设为YES会启用新的页面置换算法。新算法需要num_ioserver至少为3。

预取

当预取触发点达到后,预取就会发生。 这个触发点是PREFETCH SIZE倍数的页面个数。顺序检测会导致预取。BUFFERPOOL SIZE、PREFETCH SIZE和ACCESS PLAN都会影响是否预取和预取数量。预取请求被拆分成PREFETCH SZIE/EXTENT SIZE个放入共享队列。预取服务进程按FIFO方式提取和执行请求。

清除

被修改过的页面是脏页,需要在合适的时候写入到磁盘。页面清除进程负责这个任务。触发清除有以下情况:

1)BUFFERPOOL中的脏页所占百分比超过了数据库配置参数CHNGPGS_THRESH

2)内存中最大的LSN与写入日志文件最老的事务LSN间隔超过了数据库配置参数SOFTMAX的值

3)选中的victim页是脏页

清除触发时,执行以下动作:

1)从触发的dirty链表上收集页面,最大400个或收集到的LSN不再老为止

2)同时写入收集到的页面

3)检查触发条件是否仍满足,若是,继续下一轮动作

小结

BUFFERPOOL上发生的过程有:页面查找、页面置换、页面预取和页面清除。

本文参考和引用牛新庄的《深入解析DB2》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: