楼主: vage

[精华] 你所不知道的DBWR----DBWR工作原理简述

[复制链接]
论坛徽章:
5
复活蛋
日期:2012-11-02 16:27:37灰彻蛋
日期:2013-01-27 17:08:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-05-27 15:29:10优秀写手
日期:2014-07-01 06:00:12
21#
发表于 2012-12-9 14:13 | 只看该作者
有几个地方没有看懂,特请教:
1>dirty buffers inspected如果持续升高,物理读、CR块构造性能一定会受影响。
    这个结论怎么理解? 该值升高,表示脏块持续增多,物理写增多?
2>从“LRUW写的脏块数”和“检查点写的脏块数”的比值,这个指标差,dirty buffers inspected会很高
    这个结论又如何理解?另外文中没有涉及检查点如何写的内容。

使用道具 举报

回复
论坛徽章:
15
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:27马上有房
日期:2014-04-04 19:42:43马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08本田
日期:2014-01-16 21:44:06大众
日期:2013-12-14 09:29:562013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48奥运会纪念徽章:射箭
日期:2012-07-26 13:53:55奥运会纪念徽章:跆拳道
日期:2012-07-13 13:54:19
22#
发表于 2012-12-9 15:56 | 只看该作者
digdeep126 发表于 2012-12-9 14:13
有几个地方没有看懂,特请教:
1>dirty buffers inspected如果持续升高,物理读、CR块构造性能一定会受影响 ...

前面我也提问了vage目前可能没空

使用道具 举报

回复
论坛徽章:
15
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:27马上有房
日期:2014-04-04 19:42:43马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08本田
日期:2014-01-16 21:44:06大众
日期:2013-12-14 09:29:562013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48奥运会纪念徽章:射箭
日期:2012-07-26 13:53:55奥运会纪念徽章:跆拳道
日期:2012-07-13 13:54:19
23#
发表于 2012-12-9 16:24 | 只看该作者
digdeep126 发表于 2012-12-9 14:13
有几个地方没有看懂,特请教:
1>dirty buffers inspected如果持续升高,物理读、CR块构造性能一定会受影响 ...

我来说说我的理解。
第一个问:在buffer中寻找空闲块时发现脏块,会把脏块及Checkpoint队列中该脏块前面的脏块移到LURW队列中,后通知DBWR进程写数据文件,写后腾出原来来被脏块所占据的内存供数据库服务使用。被移动的块数累加到计数器中。这些被写入的数据块其实还未提交,它不应该被其他任务看到修改后的值(状态),如果有其他任务需要读取这些块的数据,Oracle必须一致性读的原则从undo表空间读取前镜像。此外尚未提交的数据块被再次读写的概率极高,他已经被刷出buffer,降低了命中率,若再次读写势必带来更多的IO。
该值增多,意味着数据库中数据不是正常按照检查点规划正常写入数据文件,而是经常出现很多临时紧急的情况需要把数据应急写入文件。会带来额外的IO开消。
正确与否,待各位批评。

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
24#
 楼主| 发表于 2012-12-10 08:00 | 只看该作者
gszoracle 发表于 2012-12-9 16:24
我来说说我的理解。
第一个问:在buffer中寻找空闲块时发现脏块,会把脏块及Checkpoint队列中该脏块前面 ...

我想的没这么复杂,
什么样的操作会从LRU中找可重用Buffer,也就物理读和生成CR块。
如果脏块多,dirty buffers inspected高,也就是查找脏块时,跳过的脏块也多。
跳过脏块数达到一定数量,Server进程就要移动脏块到LRUW。
这些操作,都增加了“从LRU中找可重用Buffer”这个操作的时间,所以dirty buffers inspected持续升高,一定会影响物理读和生成CR块。

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
25#
 楼主| 发表于 2012-12-10 08:02 | 只看该作者
digdeep126 发表于 2012-12-9 14:13
有几个地方没有看懂,特请教:
1>dirty buffers inspected如果持续升高,物理读、CR块构造性能一定会受影响 ...

什么样的操作会从LRU中找可重用Buffer,也就物理读和生成CR块。
如果脏块多,dirty buffers inspected高,也就是查找脏块时,跳过的脏块也多。
跳过脏块数达到一定数量,Server进程就要移动脏块到LRUW。
这些操作,都增加了“从LRU中找可重用Buffer”这个操作的时间,所以dirty buffers inspected持续升高,一定会影响物理读和生成CR块。

检查点如何写?有啊:
在增量检查点机制中,DBWR触发写操作时,会将脏块从检查点队列移至各个对象的脏对象链表中,在脏对象链表中按块的文件号、块号排序,就可以找到连续的块。
这种算法的确很巧妙,如果将所有脏块一起排序,参与排序的块太多,耗用内存太大,而且有可能影响性能。而不同对象的块,相邻的可能很低,将块按对象分门别类,再排序,的确是个好方法。
根据DUMP结果,块在检查点队列时,状态为obj-flags: object_ckpt_list,当要写脏块时,状态为:obj-flags: object_write_list,同时objq的链表位置有变化。

使用道具 举报

回复
论坛徽章:
24
复活蛋
日期:2012-11-06 10:25:40三菱
日期:2013-12-09 16:01:14日产
日期:2013-12-18 10:21:132014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31马上有房
日期:2014-05-07 14:46:24青年奥林匹克运动会-铁人三项
日期:2014-09-04 09:53:20喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47路虎
日期:2013-11-29 09:18:29
26#
发表于 2012-12-10 08:56 | 只看该作者
占个位置,买包瓜子,坐等版主大大更新!

使用道具 举报

回复
论坛徽章:
5
复活蛋
日期:2012-11-02 16:27:37灰彻蛋
日期:2013-01-27 17:08:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-05-27 15:29:10优秀写手
日期:2014-07-01 06:00:12
27#
发表于 2012-12-10 11:10 | 只看该作者
本帖最后由 digdeep126 于 2012-12-10 13:24 编辑
vage 发表于 2012-12-9 07:29
是先产生Redo,再修改块,再申请检查点队列Latch,将块链接到检查点队列,然后修改块结束。

既然这样,那我可不可推断:在修改buffer block,产生脏块的事务中,已经将该脏块插入到了检查点队列。进一步推断:所有的buffer cache中的脏块必然进入到检查点队列。

既然这样,那么:
1> LRUW中的脏块来源有几个?只有检查点队列一个来源吗?
2> 脏块是先插入到检查点队列,还是先插入到LRUW?您的结论似乎说:脏块先插入到检查点队列,然后从检查点队列移到LRUW,或者从检查点移到objq。可以这样理解您的结论吗?
3> 如果上面我说的第二点是对的,那么脏块的运动轨迹似乎可以分为两种:     1. update语句导致的所有脏块进入检查点队列 ===>> 增量检查点事件发现ckpt-q很长,于是导致脏块移到obj-q ===>>  然后合并batch,写磁盘 ===>> buffer block变成clean 回到LRU-AUX; 这种方式写的脏块数目,就是“从增量检查点写的脏块数量”。
     2. server process扫描LRU,发现脏块,注意此时该脏块一定在ckpt-q上,于是将ckpt-q上该脏块附近的一些LRBA小的脏块移到LRUW ===>> 然后又移到到LRUW-AUX ===>> 然后再移到obj-q ===>> 然后合并batch,写磁盘。 这种方式写的脏块数目,就是“从LRUW写的脏块数量”。

我的推断是正确的吗?
还有一点:

是先产生Redo,再修改块,再申请检查点队列Latch,将块链接到检查点队列,然后修改块结束。
——那么将脏块链接到检查点队列,此时脏块并没有从LRU上摘除吗?因为如果从LRU上摘除了的话,那么server process扫描LRU的时候,就不会发现其上还有脏块了。

希望我的表达,是足够清晰的。


使用道具 举报

回复
论坛徽章:
16
2009日食纪念
日期:2015-08-13 16:27:552011新春纪念徽章
日期:2015-08-13 16:27:552010广州亚运会纪念徽章:皮划艇
日期:2015-08-13 16:27:552010世博会纪念徽章
日期:2015-08-13 16:27:55ITPUB9周年纪念徽章
日期:2015-08-13 16:27:55ITPUB9周年纪念徽章
日期:2015-08-13 16:27:55数据库板块每日发贴之星
日期:2015-08-13 16:27:552010新春纪念徽章
日期:2015-08-13 16:27:55生肖徽章2007版:虎
日期:2015-08-13 16:27:55ITPUB8周年纪念徽章
日期:2015-08-13 16:27:55
28#
发表于 2012-12-10 13:03 | 只看该作者
3、块何时进入检查点队列:当块变脏的时候。


这一点我有异议,瓦鸡,块变脏时候不一定是在灰色链表,在lru链表上,如果块变成dirty了,马上进去检查点队里,是不是rollback操作时候 脏块也会从checkpoint queue里移除,还是只是打上标记为可用?

使用道具 举报

回复
论坛徽章:
41
紫蛋头
日期:2012-11-12 14:45:312014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-03-03 14:29:41马上有车
日期:2014-03-20 17:48:31马上加薪
日期:2014-03-28 15:18:022014年世界杯参赛球队: 厄瓜多尔
日期:2014-06-25 18:57:33马上有车
日期:2014-07-29 18:27:14马上有车
日期:2014-08-19 14:32:59itpub13周年纪念徽章
日期:2014-10-08 15:16:50
29#
发表于 2012-12-10 13:58 | 只看该作者
顶个

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
30#
 楼主| 发表于 2012-12-10 14:39 | 只看该作者
digdeep126 发表于 2012-12-10 11:10
既然这样,那我可不可推断:在修改buffer block,产生脏块的事务中,已经将该脏块插入到了检查点队列。进 ...

3> 如果上面我说的第二点是对的,那么脏块的运动轨迹似乎可以分为两种:     1. update语句导致的所有脏块进入检查点队列 ===>> 增量检查点事件发现ckpt-q很长,于是导致脏块移到obj-q ===>>  然后合并batch,写磁盘 ===>> buffer block变成clean 回到LRU-AUX; 这种方式写的脏块数目,就是“从增量检查点写的脏块数量”。

大部分是对的,

1. update语句导致的所有脏块进入检查点队列 ===>> 增量检查点事件发现ckpt-q很长,于是导致脏块移到obj-q ===>>  然后合并batch,写磁盘 ===>> buffer block变成clean,到这里,并没有 回到LRU-AUX;这个操作,从检查点队列写,不会改变块在LRU中的位置。 这种方式写的脏块数目,就是“从增量检查点写的脏块数量”。


“是先产生Redo,再修改块,再申请检查点队列Latch,将块链接到检查点队列,然后修改块结束。”
——那么将脏块链接到检查点队列,此时脏块并没有从LRU上摘除吗?因为如果从LRU上摘除了的话,那么server process扫描LRU的时候,就不会发现其上还有脏块了。

是的,脏块同时在LRU和检查点队列。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表