楼主: vage

[精华] 福尔摩斯探案集之 -- 解读CBC Latch Miss:kcbgtcr: kslbegin excl 之谜

[复制链接]
论坛徽章:
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
91#
 楼主| 发表于 2013-9-20 11:50 | 只看该作者
oracleodu 发表于 2013-9-13 09:24
我认为文章的结论是错误的。
原文中这样说:

这几天有时间,又研究了一下,你说的SCN对比,是判断是否需要构造CR块的。如果查询开始时的SCN,小于块ITL中最大的SCN,将会构造CR块。
fast path和非fast path的意义,还需要进一步测试。

有可能是kcbgtcr: kslbegin excl除了物理读,还有其他意义。

kcbgtcr+0x5840后的逻辑读代码,是在找不到Hash Bucket后才会跳到此处,因此,它是物理读这是可以确认的。但是否还有其他情况也会跳到此处,这个也说不定,还需进一步研究。

最近又研究了一下,Latch的模式在进程持续过程中会发生变化,很有可能是模式不成功,也会造成kcbgtcr: kslbegin excl问题。

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
论坛徽章:
6402
娜美
日期:2021-10-12 20:11:36技术图书徽章
日期:2021-09-30 12:11:1120周年集字徽章-年	
日期:2021-09-30 12:12:5820周年集字徽章-20	
日期:2021-09-30 12:43:0619周年集字徽章-周
日期:2021-09-30 13:18:3120周年集字徽章-20	
日期:2021-09-30 16:44:1219周年集字徽章-周
日期:2021-09-30 17:01:04技术图书徽章
日期:2021-09-30 17:59:14技术图书徽章
日期:2021-10-06 10:36:4019周年集字徽章-19
日期:2021-10-06 14:43:24
92#
发表于 2013-9-20 16:40 | 只看该作者
好文..
不过,我估摸着看过此文章的人,至少有一半人看不明白~

使用道具 举报

回复
论坛徽章:
0
93#
发表于 2013-10-27 08:38 | 只看该作者
我等货色只有膜拜的份了。晕菜

使用道具 举报

回复
论坛徽章:
5
2010广州亚运会纪念徽章:棒球
日期:2011-05-11 10:34:46茶鸡蛋
日期:2011-05-26 22:51:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292013年新春福章
日期:2013-02-25 14:51:24ITPUB社区OCM联盟徽章
日期:2013-10-21 11:43:54
94#
发表于 2013-10-27 14:41 | 只看该作者
给花生提鞋,丫说你还不行

使用道具 举报

回复
论坛徽章:
5
2010广州亚运会纪念徽章:棒球
日期:2011-05-11 10:34:46茶鸡蛋
日期:2011-05-26 22:51:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292013年新春福章
日期:2013-02-25 14:51:24ITPUB社区OCM联盟徽章
日期:2013-10-21 11:43:54
95#
发表于 2013-10-28 18:12 | 只看该作者
华生在mdb中使用dump命令,显示了一下:
> kcbgtcr+0x27ba+0xa718147,8::dump -e
ceaf9a1:  038001aa b0000000 038001aa b8000000

得到一个内存地址:038001aab0。

这里没懂为啥不是前8位而是多了个B0呢?

使用道具 举报

回复
论坛徽章:
5
2010广州亚运会纪念徽章:棒球
日期:2011-05-11 10:34:46茶鸡蛋
日期:2011-05-26 22:51:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292013年新春福章
日期:2013-02-25 14:51:24ITPUB社区OCM联盟徽章
日期:2013-10-21 11:43:54
96#
发表于 2013-10-28 18:24 | 只看该作者
其实最难的是怎么读懂反汇编出来的汇编语言,然后合理而正确的解析啊,这个要很强的功力,vage传授点入门的技巧把

使用道具 举报

回复
论坛徽章:
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
97#
 楼主| 发表于 2013-10-29 07:39 | 只看该作者
默默叽叽 发表于 2013-10-28 18:12
华生在mdb中使用dump命令,显示了一下:
> kcbgtcr+0x27ba+0xa718147,8::dump -e
ceaf9a1:  038001aa b00 ...

主要原因在dump -e,-e这个选项是做大小端整理。我用的是64位系统,-e之后,mdb按64位大小端反转了一下,本来Oracle保存到这里的数据本系统转为00000b0 01aa8003, 将前面多余的零去掉后,变为b0 01aa8003,再反转一下,就是正确的内存地址了。

使用道具 举报

回复
论坛徽章:
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
98#
 楼主| 发表于 2013-10-29 07:42 | 只看该作者
默默叽叽 发表于 2013-10-28 18:24
其实最难的是怎么读懂反汇编出来的汇编语言,然后合理而正确的解析啊,这个要很强的功力,vage传授点入门的 ...

总结出来,一句话:
先用Dtrace找到断点,再用Mdb/gdb重点突破。

当然,先需要对Oracle的内部原理非常熟悉。才好用这样的方法进一步分析。
另外,C语言、汇编、数据结构、操作系统基本知识,这些还是要掌握的。

使用道具 举报

回复
论坛徽章:
5
2010广州亚运会纪念徽章:棒球
日期:2011-05-11 10:34:46茶鸡蛋
日期:2011-05-26 22:51:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292013年新春福章
日期:2013-02-25 14:51:24ITPUB社区OCM联盟徽章
日期:2013-10-21 11:43:54
99#
发表于 2013-10-29 15:22 | 只看该作者
拿我的Linux弄了下反汇编,没有MDB,有个GDB,感觉有点门道了

使用道具 举报

回复
论坛徽章:
5
2010广州亚运会纪念徽章:棒球
日期:2011-05-11 10:34:46茶鸡蛋
日期:2011-05-26 22:51:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292013年新春福章
日期:2013-02-25 14:51:24ITPUB社区OCM联盟徽章
日期:2013-10-21 11:43:54
100#
发表于 2013-10-29 15:24 | 只看该作者
V哥,能不能解释下这段:

他们开始从kcbgtcr的第一个字节处分析反汇编代码,过程有点无聊,长话短说吧,从kcbgtcr+0x2c0处到kcbgtcr+0x385处,是Buffer Cache中的HASH算法:
kcbgtcr+0x2c0:                  movq   0xa723e59(%rip),%r8
kcbgtcr+0x2c7:                  movl   0x80(%r8),%eax
kcbgtcr+0x2ce:                  incl   %eax
kcbgtcr+0x2d0:                  andl   $0xf,%eax
kcbgtcr+0x2d3:                  movq   0xa723e46(%rip),%r8
kcbgtcr+0x2da:                  movl   %eax,0x80(%r8)
kcbgtcr+0x2e1:                  movl   (%r14),%eax
kcbgtcr+0x2e4:                  movq   0xa723e35(%rip),%r8
kcbgtcr+0x2eb:                  movq   0xa723e2e(%rip),%r9
kcbgtcr+0x2f2:                  movl   0x80(%r9),%ecx
kcbgtcr+0x2f9:                  movl   %ecx,%r9d
kcbgtcr+0x2fc:                  movl   %eax,(%r8,%r9,8)
kcbgtcr+0x300:                  movl   0x4(%r14),%eax
kcbgtcr+0x304:                  movq   0xa723e15(%rip),%r8
kcbgtcr+0x30b:                  movq   0xa723e0e(%rip),%r9
kcbgtcr+0x312:                  movl   0x80(%r9),%ecx
kcbgtcr+0x319:                  movl   %ecx,%r9d
kcbgtcr+0x31c:                  movl   %eax,0x4(%r8,%r9,8)
kcbgtcr+0x321:                  movq   0xa714018(%rip),%r8
kcbgtcr+0x328:                  movl   (%r8),%eax
kcbgtcr+0x32b:                  movl   %eax,-0x448(%rbp)
kcbgtcr+0x331:                  movl   (%r14),%eax
kcbgtcr+0x334:                  shll   $0x11,%eax
kcbgtcr+0x337:                  addl   0x4(%r14),%eax
kcbgtcr+0x33b:                  imull  $0x9e370001,%eax,%eax
kcbgtcr+0x341:                  movq   0xa72ed30(%rip),%r8
kcbgtcr+0x348:                  movl   (%r8),%ecx
kcbgtcr+0x34b:                  movl   %eax,%edx
kcbgtcr+0x34d:                  shrl   %cl,%edx
kcbgtcr+0x34f:                  movq   0xa72ed2a(%rip),%r8
kcbgtcr+0x356:                  movl   (%r8),%eax
kcbgtcr+0x359:                  andl   %edx,%eax
kcbgtcr+0x35b:                  movl   %eax,%r8d
kcbgtcr+0x35e:                  shlq   $0x4,%r8
kcbgtcr+0x362:                  movq   0xa72ed1f(%rip),%r9
kcbgtcr+0x369:                  movl   (%r9),%ecx
kcbgtcr+0x36c:                  movl   %edx,%eax
kcbgtcr+0x36e:                  shrl   %cl,%eax
kcbgtcr+0x370:                  movl   %eax,%r9d
kcbgtcr+0x373:                  shlq   $0x4,%r9
kcbgtcr+0x377:                  movq   0xa72ed12(%rip),%r10
kcbgtcr+0x37e:                  movq   (%r10),%r10
kcbgtcr+0x381:                  movq   (%r10,%r9),%r12
kcbgtcr+0x385:                  addq   %r8,%r12

这段代码对应的C语言伪码是:
int sp1=0x11;
int sp2=0x7f;
int sp3=0x7;
int hash_header=0x394953140;

hash(int p1,int p2)
{
        int uk=p1;
        int rdba=p2;

        int v1,v2;
        int target_addr;

        uk=uk<<0x11+rdba;
        uk=(0x9e370001*uk)&0x00000000FFFFFFFF;
        uk=uk>>sp1;
        v1=uk&sp2;
        v1=v1<<0x4;
        v2=uk>>0xsp3;
        v2=v2<<0x4;
        target_addr=hash_header+v2+v1;
}

        通过解析反汇编代码,对于HASH运算消耗的CPU,更加清楚了。


这么一大片汇编,你是怎么看出他是HASH算法的?我觉得这种技术是最难的,我看的头都大了现在也没理解为啥这是HASH算法

使用道具 举报

回复

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

本版积分规则 发表回复

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