查看: 13849|回复: 44

[精华] 揭密buffer Cache中的链表补遗

[复制链接]
论坛徽章:
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
发表于 2012-7-6 08:44 | 显示全部楼层 |阅读模式
本帖最后由 vage 于 2012-7-6 09:02 编辑

揭密buffer Cache中的链表补遗:

(揭密Oracle之七种武器之四:揭密Buffer Cache中的链表
http://www.itpub.net/thread-1631537-1-1.html)

补充两个问题:
1、如果一个脏块在CKPT-Q上,当此脏块被移到LRUW时,会从CKPT-Q上去掉吗?
回答:不会。直到从LRUW上被写到磁盘上后,才会从CKPT-Q上去掉。
测试过程很简单,搞一个脏块,然后再运行一个需要大量扫描LRU的操作,我是这样的:
set autot trace
update a2_70m set id2=id2+0 where id1=1;
commit;
select * from a4_70m;
(测试环境和前面所述一致,Buffer Cache 100M,a4_70m 80M,但它被设为了Cache)
然后在另一会话中不停运行如下几条语句:
alter session set events 'immediate trace name SET_TSN_P1 level 5';
set pagesize 50000
set linesize 10000
select file#,dbablk,tch,lru_flag,ba,decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi', 9,'memory',10,'mwrite',11,'donated'),
decode(bitand(flag,1), 0, 'N', 'Y') dirty,NXT_REPL,PRV_REPL,WA_NXT,WA_PRV,ts#,HLADDR from x$bh a where file#=4 and dbablk=20
order by      FILE#  ,   DBABLK;
select CNUM_SET,CNUM_REPL,ANUM_REPL,CNUM_WRITE ,ANUM_WRITE  from x$kcbwds where cnum_set>0;
alter session set events 'immediate trace name BUFFER level 0x01000014';
在DUMP结果中,可以找到如下内容:
BH (7c3f497c) file#: 4 rdba: 0x01000014 (4/20) class: 1 ba: 7c298000
……………………(省略部分无意义内容)…………………………………………………………
  hash: [8e96e068,8e96e068] lru: [80bf9cc8,7c7efffc]
  obj-flags: object_ckpt_list
  ckptq: [7bfe8140,7dfea5d0] fileq: [8ea707ec,8ea707ec] objq: [88c3d034,88c3d034]
……………………(省略部分无意义内容)…………………………………………………………
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x7C298000 to 0x7C29A000
……………………(省略部分无意义内容)…………………………………………………………
BH (7c3f497c) file#: 4 rdba: 0x01000014 (4/20) class: 1 ba: 7c298000
……………………(省略部分无意义内容)…………………………………………………………
  hash: [8e96e068,8e96e068] lru-write: [8ea63e58,7c7efffc]
  obj-flags: object_ckpt_list
  ckptq: [7bfe8140,7dfea5d0] fileq: [8ea707ec,8ea707ec] objq: [88c3d034,88c3d034]
……………………(省略部分无意义内容)…………………………………………………………

上一次DUMP的时候,LRU链前后块的指针为lru: [80bf9cc8,7c7efffc],下一次DUMP时,已经变成lru-write: [8ea63e58,7c7efffc],但检查点队列相关的信息没变,都是ckptq: [7bfe8140,7dfea5d0]。
当脏块写完成时,BH中信息变为这样:

BH (7c3f497c) file#: 4 rdba: 0x01000014 (4/20) class: 1 ba: 7c298000
……………………(省略部分无意义内容)…………………………………………………………
  hash: [8e96e068,8e96e068] lru: [7c7efffc,7c3f2f18]
  lru-flags: on_auxiliary_list
  ckptq: [NULL] fileq: [NULL] objq: [88c3d02c,88c3d02c]
……………………(省略部分无意义内容)…………………………………………………………
从lru-write: [8ea63e58,7c7efffc],变为了lru: [7c7efffc,7c3f2f18],从lru-flags可以看到,已经被放到辅助链表中了。同时,ckptq已经是NULL了。写磁盘完成时,才从CKPT-Q上摘掉。

2、根据上面的测试结果,脏块可能会同时存在于两个链表:LRUW和CKPT-Q。块从LRUW写磁盘后,会从CKPT-Q上摘掉。但反过来呢?从CKPT-Q中写磁盘,写完后会从LRUW上摘掉吗?
答案是,会的。
如何验证呢?我是通过Latch的获取来验证的。
脏块通过CKPT-Q写到磁盘后,其所处的LRU位置不变,这一点我在前文中已经提到过,也很容易验证这点,从x$BH中的NXT_REPL,PRV_REPL两列,就可以验证此点。也就是说,从CKPT-Q写脏块,是和LRU链表无关的,也就是不需要获得LRU Latch。如果从CKPT-Q写脏块申请了LRU Latch,哪一定和LRUW有关。
将检查点超时参数设为很小的值,写个简单的DTrace脚本,跟踪一下DBWR进程Latch的获得情况。发现每次从CKPT-Q写脏块时,DBWR都要按如下顺序申请Latch:
获得cache buffers chains Latch
  获得LRU Latch
  释放LRU Latch
释放cache buffers chains Latch
获得checkpoint queue latch
释放checkpoint queue latch
获得cache buffers lru chain
释放cache buffers lru chain
也就是说,从CKPT-Q写脏块时,不但要获得checkpoint queue latch,还要LRU Latch。根据前面的分析,从CKPT-Q写脏块时,获取LRU Latch的目的,只能是为了访问LRUW,因为CKPT-Q写不改变块在LRU的位置,不必要访问LRU。哪么,CKPT-Q写访问LRUW的目的是什么,可以推论,目的是为了检查脏块是否在LRUW、并摘掉它。

还有一点,由于块已经从LUR移到了LURW,从CKPT-Q写完成后,虽然不是从LURW写的,块应该仍会被放入辅助LRU,这个就是猜想了。我尽量找个测试实际验证下。
论坛徽章:
56
生肖徽章2007版:鼠
日期:2013-11-30 10:39:31生肖徽章2007版:牛
日期:2013-11-30 10:39:31生肖徽章2007版:虎
日期:2013-05-22 22:35:00生肖徽章2007版:兔
日期:2013-12-03 18:21:40生肖徽章2007版:龙
日期:2013-11-30 10:39:31生肖徽章2007版:蛇
日期:2013-11-30 10:39:31生肖徽章2007版:马
日期:2013-12-06 09:52:15生肖徽章2007版:羊
日期:2013-11-30 10:39:31生肖徽章2007版:猴
日期:2013-11-30 21:08:54生肖徽章2007版:鸡
日期:2013-12-05 20:04:41
发表于 2012-7-6 08:53 | 显示全部楼层
赶快抢沙发顶大神

使用道具 举报

回复
论坛徽章:
43
2015年新春福章
日期:2015-03-06 11:58:392015年新春福章
日期:2015-03-04 14:53:16itpub13周年纪念徽章
日期:2014-09-30 08:13:41itpub13周年纪念徽章
日期:2014-09-30 08:13:49凯迪拉克
日期:2013-12-25 11:13:34凯迪拉克
日期:2013-12-24 13:01:42保时捷
日期:2013-08-02 17:00:00保时捷
日期:2013-08-06 12:54:15劳斯莱斯
日期:2013-10-29 12:57:11林肯
日期:2013-12-19 16:13:50
发表于 2012-7-6 08:54 | 显示全部楼层
支持大師!

使用道具 举报

回复
论坛徽章:
11
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51兰博基尼
日期:2013-12-16 17:11:55现代
日期:2013-09-06 11:18:52Jeep
日期:2013-08-16 09:05:16日产
日期:2013-08-15 14:48:29现代
日期:2013-08-05 15:16:16保时捷
日期:2013-07-30 11:05:37茶鸡蛋
日期:2013-03-18 10:38:482013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-21 17:49:52
发表于 2012-7-6 09:25 | 显示全部楼层
一直纠结dbwr写dirty块是按CKPT-Q还是LRUW,今终解开迷团.

使用道具 举报

回复
论坛徽章:
14
2012新春纪念徽章
日期:2012-01-04 11:58:182012新春纪念徽章
日期:2012-02-07 09:59:35ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59马上加薪
日期:2014-08-09 14:42:472014年世界杯参赛球队: 美国
日期:2014-06-04 09:05:20优秀写手
日期:2014-03-12 06:00:13马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:水球
日期:2012-10-11 16:40:16
发表于 2012-7-6 10:58 | 显示全部楼层
V神从哪些资料了解这么多底层知识啊,能否推荐些资料?还是只是自己估研究

使用道具 举报

回复
论坛徽章:
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
 楼主| 发表于 2012-7-6 11:07 | 显示全部楼层
ziling2011 发表于 2012-7-6 10:58
V神从哪些资料了解这么多底层知识啊,能否推荐些资料?还是只是自己估研究

没有啥资料,自己多做测试,多用DTrace跟踪,用GDB分析。
工作中碰到有稀奇古怪的问题时不放弃,慢慢就积累的多了。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
87
生肖徽章2007版:虎
日期:2009-03-02 15:42:532011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:32数据库板块每日发贴之星
日期:2011-04-05 01:01:01现任管理团队成员
日期:2011-05-07 01:45:08鲜花蛋
日期:2011-06-26 11:15:422011新春纪念徽章
日期:2011-01-25 15:41:01
发表于 2012-7-6 11:14 | 显示全部楼层
墙裂支持楼主,继续加油!

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2012-7-6 11:27 | 显示全部楼层
你这精华蹭蹭往上涨啊

使用道具 举报

回复
认证徽章
论坛徽章:
21
奔驰
日期:2013-08-06 15:23:05日产
日期:2013-08-07 22:56:38蜘蛛蛋
日期:2012-12-29 19:15:08奥迪
日期:2013-08-07 17:02:24数据库板块每日发贴之星
日期:2010-06-28 01:01:03奥迪
日期:2013-08-13 10:10:28本田
日期:2013-11-20 15:17:02优秀写手
日期:2013-12-18 09:29:08玉兔
日期:2014-03-04 16:47:17铁扇公主
日期:2012-02-21 15:02:40
发表于 2012-7-6 13:07 | 显示全部楼层
GOOD!

使用道具 举报

回复
论坛徽章:
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
发表于 2012-7-6 13:28 | 显示全部楼层
mark

使用道具 举报

回复

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

本版积分规则 发表回复

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