RAC两个节点上的SQL语句执行效率差好几倍,这种情况可能很多朋友也遇到过,这种问题的分析实际上比较简单,因为大多数情况下是因为两个节点上的执行计划出现了不同,其中一个执行计划是错误的。这个往往和绑定变了窥视有关。随着Oracle 11g之后绑定变量窥视的算法的优化,实际上这种情况已经比较少见了,不过还是偶尔会遇到。分析此类问题也比较简单,只要在两个节点上分别做awrsqrpt,查看执行计划或者使用dbms_xplain.display_cursor或者display_cursor_awr查找一下,就可以发现二者执行计划之间的差异。
今天我们遇到的问题和这个还真有点不一样。前几天在网上和一位网友讨论这个问题的时候,我首先就提出了这个怀疑,让他们做个awrsqrpt看看。那位朋友说他们早就做了sql分析报告,从awrsql报告上看,二者的执行计划是相同的。实际上这条SQL十分简单,就是根据某个id去UPDATE一张单表,每次更新几千条到一万多条数据,可以通过这个Id的索引去范围扫描这张表。
下面两张图,第一张是存在问题的节点的执行计划和SQL统计信息,第二张图是执行速度较快的节点的执行计划和SQL统计信息:
同一条SQL在不同时间执行的时候修改的数据量会略有不同。不过可以看出执行的比较快的节点的执行时间是1秒钟多点,修改了1.5W条记录,而执行的比较慢的节点的平均执行时间是16秒,修改了7000多条记录。二者的速度相差十多倍。而执行计划都是相同的。除了执行时间,buffer get的数量也有不同,有十多倍的差异,几乎与执行时间的差异是一个数量级的。
从上面的情况来看我们会感到比较晕,也可能让我们的分析陷入错误的方向。因为buffer get的差异确实太怪异了。执行计划相同,数据也是类似的,为什么buffer get会有如此大的差异呢?如果我们按照这个思路往下分析,那么我们就很可能会陷入僵局了。幸运的是,网友那边发现了这个问题之后做了10053和10046的trace。实际上10053 trace就没必要仔细研究了,因为执行计划都是相同的。不过10046 trace是十分有帮助的。
在存在问题的节点上,我们看到了大量的gc current block busy等待事件。于是我们对此做了一个分析,这两个节点的10046 trace虽然不是同一时间做的,修改的数据量也不同,但是从10046 trace上我们还是看到了很大的不同。执行正常的节点的执行起始时间是12:04:26.825603+08:00,结束时间是12:04:27.129960,用了不到一秒钟的时间。而存在问题的节点的SQL执行起始时间是10:56:43.763941,执行结束时间是10:57:09.294109,大概执行了25秒多。二者差异为24秒。下面我们统计了一下gc current block busy在两个节点上的等待时长,发现二者差异为19秒多。看样子这条SQL在两个节点上的执行差异最主要的问题集中在了gc current block busy上了,这个等待事件的含义是某个节点需要一个buffer的current block,而这个block在另外一个节点上,当申请这个block的时候,因为某种原因导致申请失败,需要再次申请。一般情况下,在RAC环境中等待这个等待事件的最主要的场景有两个,一般都会涉及数据的修改问题,这个和我们这个案例的UPDATE语句的场景是吻合的。第一个场景是某个节点修改了数据块,但是redo log entry还没被写入redo log文件,这时候,在另外一个节点上会看到这个等待事件。另外一种情况就是BUFFER BUSY了,当这个buffer 还被其他session pin住,无法把current block发送给其他节点的时候,那么对端也会发生这个等待事件。第三种出现类似等待事件的原因是BUG,就像在和本案例完全相同的12.2.0.1版本中,BUG 23734075就是一个可能导致此类问题的例子。
通过上述的分析,我们初步定位了问题分析的方向,那么在这个问题没有被彻底分析清楚之前,我们首先可以想到一个临时解决方案,那就是将这个批量处理操作任务绑定到一个节点上,而不要随机分布到不同节点上去跑,这样整个性能问题就能临时解决。随后我们可以有充足的时间去仔细分析这个问题。实际上在分析这个问题的过程中,下一步我们就需要去分析lms/lmd进程的trace文件,在lms的trace文件中我们也发现了大量的网络通讯方面的报错。这些都是后续需要去分析的。
今天老白这个案例并没有最终的结果,因为这是一个网络讨论的案例,并没有进行深入的分析。不过从这个分析过程中,大家也可以学习到一些分析此类问题的通用方法。通过10046 trace中的等待事件的统计去分析问题的主因方向,从而缩小分析范围,或者找到临时性解决方案。这种分析方法,在今后遇到类似问题的时候,肯定能发挥作用的。