
1.7 诊断智能扫描性能问题
当Exadata的智能扫描出现性能问题时,最主要的表现就是与智能扫描相关的等待事件的平均延时变长。例如cell table smart scan和cell index smart scan等待事件,正常情况下这类等待事件的平均延时应该在2ms以下,当智能扫描出现性能问题时,这类等待事件的平均延时可能在十几毫秒甚至几十毫秒。
如何评判一个数据库系统的智能扫描是否出现了性能问题,最简单的方法是查看AWR性能报告或AWR数据库全局性能报告,如图1.12所示。

图1.12 查看AWR性能报告或AWR数据库全局性能报告
1.7.1 智能扫描性能问题常见原因
当一个数据库系统的智能扫描出现了性能问题,通常可能是由以下原因导致的。
1.存储索引使用情况不理想
后面会有单独的章节来详细介绍存储索引特性,这里只简单提及存储索引的主要作用是减少IO扫描量。如果存储索引的效率比较高,则可以大大减少IO扫描量;而相同的SQL语句,如果存储索引的效率不高,则需要扫描更多的IO。即使进行智能扫描,存储节点的IO扫描仍然是不可避免的。因此,存储索引的效率高,则智能扫描的效率高;反之,存储索引的效率低,则智能扫描的效率自然也会低。
2.存储节点设置了Quarantine(隔离区),导致没有过滤功能
Quarantine可以阻止某些SQL语句执行智能扫描操作,这减少了存储软件崩溃的可能性,提高了存储的高可用性。下面通过示例演示针对某条SQL语句设置Quarantine时,对智能扫描的影响,见代码清单1.26。
代码清单1.26 Quarantine阻止智能扫描操作



代码清单1.26执行了一条SQL语句,并获取到该SQL语句的SQL_ID为9htmw8y2q7rx5。在第一次执行时,该SQL语句进行了智能扫描。然后单独对该SQL_ID设置了Quarantine,再次执行该SQL语句,发现Smart IO not used due to SQL Step or DB Quarantine和Storage index disabled due to predicate disk past等指标值都增加了。这说明该SQL语句在第二次执行时没有使用智能IO,原因就是对该SQL语句设置了Quarantine。
同样,可以看出v$mystat视图中cell physical IO interconnect bytes和cell physical IO bytes eligible for predicate offload指标值相同。这说明该SQL语句适合进行智能扫描,但最终还是没有发生智能扫描,也即没有节省任何的IO,因为该SQL语句设置了Quarantine,导致该SQL语句所涉及的所有数据块都无法通过智能扫描的方式传输给数据库服务器,而只能以Passthru模式将所有数据块传输给数据库服务器,在存储节点无法进行数据过滤操作。
3.由于时区升级而导致没有过滤功能
当数据库的时区处于升级模式或者不一致模式时,从计算节点向存储节点发出的IO将不会使用智能扫描,而是使用传统的IO传输方式,这将导致存储节点将所有的数据块发送到数据库所在的计算节点,而不是将合适的数据记录传输到计算节点。
可以在计算节点执行命令来检查数据库的时区升级状态是否设置为正常值,见代码清单1.27。
代码清单1.27 检查数据库的时区升级状态是否正常

Oracle数据库的时区不应该长期处于升级状态。如果存在这种情况,可参考MOS文档Exadata:RDS Performance Degrades when Database is in Timezone Upgrade Mode(Doc ID 1583297.1)来处理时区问题,具体命令如下。

当数据库的sys.database_properties表中DST_UPGRADE_STATE属性值为NONE时,表示时区问题已经修复。
除了执行代码清单1.27中的脚本来检查数据库是否出现时区问题,还可以通过检查数据字典的方式来确认数据库目前是否存在时区问题,见代码清单1.28。
代码清单1.28 通过数据字典检查数据库的时区升级状态是否正常

通过v$sysstat性能视图中的cell num smart IO sessions using passthru mode due to timezone可以评估整个数据库由于时区问题而导致SQL语句无法进行智能扫描的次数,该参数值应该为0。同样,也可以使用v$mystat性能视图来查看当前会话是否存在由于时区问题而导致SQL语句无法进行智能扫描。
4.由于存储节点的CPU能力达到极限
数据库节点如果大量地使用智能扫描,把负载转移到存储节点一端,则可能导致存储节点的CPU负载过高。当存储节点发现CPU的占用率过高时,就会对一部分原本使用智能扫描的SQL语句不使用智能扫描,而直接将相应的数据块返回给计算节点,来缓解存储节点的CPU压力。等到存储节点的CPU负载降下来,则相应的SQL语句会再次使用智能扫描,这个特性称为“反向卸载”。
这个“反向卸载”的阈值是通过存储节点的隐含参数_cell_mpp_threshold来控制的,默认值为90,也即当存储节点的CPU占用率超过90%时,存储节点就不会使用智能扫描进行过滤,而是直接将相应的数据块返回给计算节点。查看存储节点的隐含参数_cell_mpp_threshold当前设置的值,具体命令如下。

由于一些Bug的存在,在某些情况下,可能需要手动关闭这一特性。这个特性由数据库层面的隐含参数_kcfis_cell_passthru_fromcpu_enabled进行控制,默认值为true,代表开启“反向卸载”;如果设置为false,则表示关闭“反向卸载”。如果打算在会话级别关闭“反向卸载”特性,代码如下。

5.由于存储节点的IO处理能力达到极限
有一个观点需要再次强调,那就是智能扫描仅仅是减少了IO的传输量,它仍然需要进行大量的IO扫描(除非存储索引特性生效)。如果Exadata上的业务系统IO访问繁忙,则进行大量的智能扫描同样有可能导致存储节点的IO处理能力达到极限。
判断存储节点的IO处理能力是否达到极限,可以查看存储节点的OSWather或ExaWatcher收集的资源使用信息,或直接调用iostat命令查看存储节点的磁盘使用情况(无法在计算节点上调用iostat命令查看存储节点的磁盘使用情况)。
6.由于存储节点的Flash闪存使用不理想
在老版本的存储软件中,智能扫描操作访问的数据块不会缓存到存储节点的FlashCache中(除非对表对象设置了keep属性),这就可能导致Flash闪存资源没有得到有效的利用,而底层的机械硬盘访问非常频繁,从而导致智能扫描的性能出现问题。
1.7.2 智能扫描性能问题诊断工具
如果智能扫描出现性能问题,可以通过AWR性能报告、数据库性能视图(v$sysstat或v$cell_state)和OSWather等工具来诊断原因。
1.AWR性能报告
AWR性能报告是Oracle数据库性能分析工具,从报告中的一些性能指标可以看出智能扫描出现性能问题的原因。
下面简要说明一些性能指标,如表1.6所示。
表1.6 智能扫描涉及的模块及说明

2.v$sysstat性能视图
v$sysstat性能视图提供了系统相关的统计信息,可以帮助诊断没有进行智能扫描或没有利用上存储索引的原因,具体见代码清单1.29。
代码清单1.29 v$sysstat性能视图提供智能扫描相关的统计信息

下面对v$sysstat性能视图中提供的一些性能指标进行简要说明,如表1.7所示。
表1.7 v$sysstat性能视图性能指标说明

3.v$cell_state性能视图
v$cell_state性能视图提供了整个集群中所有存储节点的统计信息,可以帮助诊断没有进行智能扫描或没有利用上存储索引的原因,具体见代码清单1.30。
代码清单1.30 v$cell_state性能视图提供整个集群中所有存储节点的统计信息

从v$cell_state视图中可以看到9个方面的统计信息,具体解释如下。
■ RCVPORT:包含有关网络接收流量的详细信息。
■ SENDPORT:包含有关网络发送流量的详细信息。
■ PREDIO:包含有关Exadata如何处理Smart Scan的信息。
■ NPHYSDISKS:列出每个存储节点中物理磁盘的详细信息。
■ CELL:列出每个存储节点相关的性能信息,类似于cellsrvstat。
■ THREAD:列出有关CELLSRV服务工作线程的信息。
■ PHASESTAT:列出有关Smart Scan中各阶段的信息。
■ CAPABILITY:列出存储软件的各种功能。
■ LOCK:分解存储节点中每种对象类型的mutex等待。
下面对v$cell_state性能视图中提供的一些性能指标进行简要说明,如表1.8所示。
表1.8 v$cell_state性能视图性能指标说明

v$cell_state视图中的STATISTICS_VALUE字段是CLOB数据类型,但该字段中存储的内容其实是按照XML格式存储的,当需要访问STATISTICS_VALUE字段的内容时,可以对该字段进行XML转换,代码如下。

以上输出只展示了一小部分结果集,在后面的示例中,将以这一小部分结果集来进一步展示如何格式化XML文本的内容输出。
如果需要访问STATISTICS_VALUE字段中/cell_stats/stats属性为network_directory的元素,且将XML格式化成数据库的表记录格式输出,代码如下。

通过对比可以看出,需要的内容已经完全格式化成数据库的表记录格式输出,便于查看。
如果需要访问STATISTICS_VALUE字段中/cell_stats/stats属性为network_directory的元素的下一层——stat中send_ports_hwm的元素的详细信息,代码如下。

4.cellsrvstat工具
存储软件从11.2.2.3版本开始,在Exadata的存储节点上自带了一个名为cellsrvstat的工具。利用该工具提供的运行时刻性能统计数据,可以了解整个存储节点的运行情况。cellsrvstat工具的语法如下。

下面对cellsrvstat工具中常用的各项参数进行说明,如表1.9所示。
表1.9 cellsrvstat工具常用参数进行说明

如果指定table选项,则只会显示增量信息,而不会显示累积信息,见代码清单1.31。
代码清单1.31 cellsrvstat工具展示性能指标

相同的命令,如果指定了table选项,只显示实时的增量信息;如果不指定table选项,则还会显示该指标的累积信息。