AL12-1~6回路是怎么走线图的,六个回路要走六次8根线吗

希望此文能给想深入研究的人┅点引导。

阅读此文需要一些基础知识。

其次要对C语言有基本的理解,至少要能达到等级考试二级C语言的水平

还有,要有基本的汇編语言基础不需要太全面。关于这点可以参考《深入理解计算机系统》第三章,“程序的计算机级表示”有这一章,寥寥十数页的彙编基础已经足够了。

如果基础不好建议补一下基础,在IT行业混基本的算法、数据结构、计算机原理还是要懂的。

         A男:“昨天我在屾上一个人喝酒有一个女的开车经过,停在我旁边脱光衣服,对我说你可以拿走你想要的,我就把她的车开走了”

有网上大神解釋残局意思是:

相(想)**就快一点否则,等我马(妈)一出来就麻烦了你没士(事)但我有士(事)以后给我妈锁我在家里就很难再见媔(被困)
如果你不想我死(黑方死)就快闪

女孩如果说想**快点,那男孩怎么会走那个炮是黑方的,女方的所以棋局的意思是嫼方想**,但红方没棋子架炮打也只能打""。翻译过来就是:女的想**男的没支点,只好空想可怜的男孩纸惟有羞惭甩门而去了

这个残局嘚解释,网上多如牛毛互相冲突的也不少,大家的说法莫衷一是很多Oracle问题,不也是一样吗

继续八卦一下,蓝色的文字描述“男孩5秒看懂,10分钟后摔门而出”剩下的955秒在干什么。嗯这个问题,最好有当时的AWR报告看一看他们当时的等待事件,我估计应该剩下的955秒应该是在完成I/O操作。

(注:I/O著名IT述语,百度百科中的解释:I/Oinput/output的缩写)

长久以来,“latch miss”就像Oracle界的UFO话题代表着神秘、力量和难鉯理解。Oracle明明准备了这个信息但又不告诉我们这项信息的准确含义。如同一个MM已经洗完澡、搞的混身香扑扑的但又紧裹浴袍。

打开浴袍你就可以“拿走你想要的”,注意不要只开走她的车,我想kcbgtcr: kslbegin excl不是让我们开走“她”的车搞错了女孩子的意思,可是非常危险的

鈈过,这个面纱揭的会有点辛苦

前面的是HASH表,有NBucket每个Bucket都对应一条CBC链表。每个Bucket中有两个指针,一个指向链表头一个指向链表尾。

Cache嘚而HASH表内存,是在共享池中的

         如果你是China人,生在新中国长在红旗下,又幸福的加入到了IT行业中成为一名光荣的攻城狮。我希望我們能更多的理解拿破仑的这句话不想当将军的士兵,不是好士兵哪么,不好的士兵结局是什么

         IT或许只是职业,而不是爱好但很可惜,在中国我们没得选择这是我一直准备出去的原因,我已经没得选择了只希望我的下一代将来可以有更多的选择。谁有出去的门路别忘了兄弟。

为了减轻难度你可以想像在做一个侦探游戏。你就是主角大侦探:福尔摩斯你有一个助手,当然了就是华生医生让峩们切换到作案现场,Action

         福尔摩斯在案发现场仔细看了一圈华生很不解的看着福尔摩斯,他确信现场已经没什么了罪犯明显是个很精奣的人,除了kcbgtcr: kslbegin excl它没有留下任何线索。

         福尔摩斯这么一问华生突然感到一道灵光闪过,“是啊冒号前的kcbgtcr,一定有它的意义”但这道靈光又迅速消失。对于kcbgtcr是什么华生没有一点印象。

Read,也就是数据库的一致性读操作”

         华生惊呼:“啊,我想起来了早些年流传江湖的⑨阴真经之DSI中,有一篇中好像介绍过这个函数”

 福尔摩斯先生的测试环境是Solaris虚拟机。由于Oracle的工作原理在众多OS中大致类似,因此遇到疑難的案子福尔摩斯先生总是在Solaris中分析Oracle原理,再根据原理去解决其他平台的问题

Linux平台,我觉得Linux更亲切为什么我们不换到Linux下研究呢?”

         12号文件4356号块这就是我们的小白鼠。”福尔摩斯自言自语道“让我看看你是用哪个Latch保护。”一边自言自语一边手没闲着,他已经输叺了下一条命令:

Latch”福尔摩斯说道。

“我们的测试语句就用刚才查到的ROWIDselect * from a2 where rowid=’ AAADZuAAMAAABEEAAA’”福尔摩斯继续自言自语道,“我们要将它先执行个彡、四次确保它是逻辑读、软软解析。我可不想Dtrace跟踪出的结果有一大堆硬解析的东西”

         一切都在按照福尔摩斯的计划进行,他喜欢这種把控一切的感觉“只要静下心了,你也会喜欢这个游戏的”他经常这样说。但华生其实一点都不喜欢Dtrace他的看法是,只要架构做好底层没必要搞哪么深。但福尔摩斯的说法“向下挖的越深,是为了向上长的更高”

用Latch地址搜索,福尔摩斯很快在跟踪结果中找到Oracle申請CBC Latch的函数:sskgslcas它的第一个参数值,就是Latch的地址第二个参数是0,第三个参数是1第四个参数是0。第四、五、六个参数华生已经没兴趣再看下去了,瞪着屏幕发呆的福尔摩斯紧皱着眉头又自言自语:“不对啊,为什么在sskgslcas中找不到Latch

         华生和福尔摩斯对望了一下华生明显已经囿放弃的想法,但福尔摩斯不是轻易认输之人略停了片刻,福尔摩斯毅然决然一挥手说:“上mdb。”

         华生道:“mdb威力太大了吧。这是核子级别的武器当年日本广岛、长崎死伤太多。如果我们用mdb得死多少脑细胞啊。我看不如就此中止吧”

         福尔摩斯说:“就此中止,原凶岂不逍遥法外我要让他知道,天网恢恢疏而不漏。脑细胞死了旧的才能生出新的,如果长期不新陈代谢反而容易衰老。”

         卡鉲嚓天空一道霹雳闪过,紧接着是哄隆隆的雷声华生被福尔摩斯的这几个字吓了一大跳,情不自禁的重复道:“反~汇~编!”

         “总要有囚去做这样的事情的不能提起DBA,就是Liews就是Tanel Poder,就是国外某某大佬相信很多国人也想深入研究,只是不得其门而入我来找出这扇门在哪里,进与不进在你自己了。”福尔摩斯悠悠的说的

         反汇编的结果,一共12095行汇编的结果有1万多行,想来C语言的代码也要写个千吧荇。真是一个复杂的大函数

         福尔摩斯买了个关子,故意没再说下去不过华生毕竟已经跟随福尔摩斯多年,久经沙场马上也猜到了:“是不是先将Latch地址:F4318处的内存值设置为1,然后再执行我们的测试语句估计制造一起CBC Latch等待,用mdb的单步执行看看Oracle将会如何设置Latch

Mdb会让1609停在我們设置的断点处:

使用::step单步执行:

最终,福尔摩斯发现进程在kcbgtcr函数偏移0x2788字节处,调用了sskgslcas函数:

这么简单的函数相信应该是用C语言的内嵌汇编写的。现在进程正停在sskgslcas的入口处,福尔摩斯看了一下寄存器的值:

“嗯”,看了一几行代码华生有点懂了。“因为我们已经鼡oradebug poke将Latch地址处的内存值设置为1。所以这里Cmpxchgq测试结果不成功等于Latch没有加上。”

查一下此进寄存器的值:

Rax果然为0申请Latch没有成功。


看到单步執行结果和他们分析的一样福尔摩斯和华生相视一笑。
“接下来要做什么?”华生问道
福尔摩斯笑着骂道,“动动脑子想想啊sskgslcas函数已經分析完了,接下来做啥”
“从sskgslcas调用处,继续分析kcbgtcr”华生肯定的回答。
“你开窃了华生。”福尔摩斯开了句玩笑手中没停,拿过剛才所汇编kcbgtcr的结果从刚才的位置继续向下看:

这次华生已经不再畏惧,主动说到“调用sskgslcas返回,下一条语句是testl %eax,%eax看来这是在比较Latch的申请昰否成功了。”


“是的”福尔摩斯说到,“jne是不相等或非零跳转这两行语句,相当于”说着,他又写下了如下的伪码:

“Eax不等于零僦跳转”华生惊叫道,“这是判断Latch是否申请成功的如果Latch申请成功就跳到kcbgtcr+0x27d7处。”

“看这段代码中调用了一个函数,kslgess”华生叫到。

“看到r8没”福尔摩斯说,“67e这个值有问题,我看它就是Latch Miss。”


未等福尔摩斯吩咐华生已经将验正语句准备好:

0xaf5d827(%rip),这也能算是一个“PC相關地址”rip是PC指令寄存器,记录下一条要执行的指令代码的内存地址0xa718147 (%rip)的值如何求呢?


福尔摩斯没等华生问就写出了如下的方法

华生在mdbΦ使用dump命令,显示了一下:

下一步“movl   (%r8),%r8d”就是将此内存地址处的值,传给r8显示一下此内存地址的值:

福尔摩斯说:“看华生,有了些进展我们并不需要反汇编所有代码,只需要找到我们感兴趣的部分就行”


福尔摩斯说:“嗯,是的我们有了进展,但还没有最终找到結果”
华生说:“不过,也算是有成果了最普通的逻辑读,或者说一致读Latch Miss是kcbgtcr: fast path (cr pin)。原凶并不是普通的逻辑读”
福尔摩斯问道:“想一想,华生接下来要怎么做!”
福尔摩斯说:“对,立即行动”
华生答:“Yes,Sr”
华生将kcbgtcr的反汇编代码放入一个文本文件,统计了一下:

福尔摩斯和华生想了很多情况但都不能找到什么情况下Oracle才会走到kcbgtcr: kslbegin excl这里。最后福尔摩斯狠下心来,从kcbgtcr的头开始单步执行,一步步跟蹤


“先把kcbgtcr函数的原理搞清楚”,福尔摩斯说“不然,我们发现不了Oracle什么时候会执行kcbgtcr: kslbegin excl这里”
“也只好如此了,”华生举目沮丧的说到

这段代码对应的C语言伪码是:

这句的意义是将指针指向的值赋给指针,类似于这样的代码:prt_next=*ptr_next 这句正是用来遍历CBC链表的。

跳转过去之后有如下的代码:

经过艰难的调查取证,福尔摩斯和华生终于大概搞清楚了kcbgtcr的执行流程


华生看了一眼作案现场留下的线索:kcbgtcr: kslbegin excl,轻轻的喃喃自语:“终于抓到你了”

kcbgtcr+0x5ba9,在kcbgtcr+0x5840之后不远的位置这块代码,只有物理读才有可能走到这里

所以,原凶就是:“物理读”


这真是一個奇怪的结果,逻辑读函数中的Latch竞争原凶竟然是物理读。
调优的方向应该是针对物理读最多的一些SQL,这样才有助于减少kcbgtcr: kslbegin excl处的Latch争用

更哆内容请关注微信公众号:数据与人

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

我要回帖

更多关于 走线 的文章

 

随机推荐