(原创)如何在性能测试中自动生成并获取Oracle AWR报告
版权声明:本文为原创文章,转载请先联系并标明出处
由于日常使用最多的数据库为Oracle,因此,最近又打起了Oracle的AWR报告的主意。
过去我们执行测试,都是执行开始和结束分别手动建立一个快照,然后需要这部分数据的时候再去获取AWR报告查看。
但是有的时候忙乱起来或者一个任务项交给别人来做就经常会有忘记建立快照的情况,这时候就只能通过Oracle自己默认建立的快照来获取了。但是我们知道 Oracle默认是一个小时才建立一个快照,且建立快照的时间点很难跟我们的测试过程能匹配到一起,这样我们获取的测试报告就有了很多的干扰项。
而且,有很多新来的小朋友做性能测试的时候也并不知道该怎么取报告。每次都要去教的话,不是我的风格,懒癌晚期当然是能偷懒就偷懒了。于是开始动起了歪脑经:能不能使用软件测试工具同步把AWR报告也收集过来呢,如果可以集成到脚本中,那么获取AWR报告的时候使用的始末快照就能跟我们的测试过程完全匹配了,也防止了因为疏忽忘记建立快照的情况。
可以选择的测试工具有很多,比如Loadrunner、Jmeter、HyperPacer等,仔细研究了HyperPacer提供的JDBC采样器,发现HyperPacer完全可以胜任这个需求。
对如何在性能测试中手工生成AWR报告完成数据库性能分析还不了解的同学猛戳这里了解!
于是大概梳理了一下思路:
首先:
在初始化场景内:添加JDBC采样器,分别进行两个操作:一个是通过dbms_workload_repository这个包提供的create_snapshot()建立快照,然后查询当前最大的快照号,也就是我们刚刚建立的快照,作为测试的起始快照号;
在收尾场景内:添加JDBC采样器,同样建立快照,并查询当前最大快照号,作为测试的终止快照号;再多添加一个JDBC采样器,通过包dbms_workload_repository提供的方法AWR_report_html获取两个快照间的AWR报告。
理想很美好,但是实际实现起来却发现没有那么简单。原来想当然的是在初始化场景里先获取测试开始的快照号,然后作为变量传给收尾场景的JDBC采样器。但是执行的时候一直报变量无效。
想了好久不知道是什么原因,最后忽然想明白原因了,没想到学习使用了这么长时间的HyperPacer,最后在小--(阴)--(沟)---(里)翻了船。
获取初始快照号的采样器建在初始化场景下,这也就决定了这个采样器的作用域只能在初始化场景下,我把它输出的变量传给收尾场景的采样器,超出了作用域自然就无法识别了。
汗~~~~~~~~~~
于是只好调整思路,既然无法完美实现,那么只好退而求其次,初始化场景只建立快照,获取这个快照号的采样器移到收尾场景内。于是最终实现后就是如图下面的样子:
可以看到在快照浏览器里已经取到对应本次执行过程的AWR报告。
下面给童鞋们说一下具体的实现步骤:
依赖于HyperPacer强大的功能,要实现这个自动获取AWR报告的需求,脚本里面其实只用到了两个元件来实现,配置元件里的JDBC连接配置和取样器里的JDBC请求取样器。
第一步:我们需要在工程Demo下面增加一个配置元件,JDBC连接配置,配置界面如下:
配置界面很简单,首先需要自定义一个数据源名称,因为在后面我们的JDBC取样器都会用到这个变量里定义的名称,所以尽量用识别度高且有实际含义的名称。
然后下面是选择数据库类型和填写数据源的连接信息,截图已经给出了各个图形界面输入框的含义。小伙伴们还可以选择勾上URL的复选框,然后自己把TNS文件里配置的连接信息直接简单粗暴的Copy进来。
第二步:在初始化场景里添加JDBC取样器,如下图配置:
Oracle提供的包以及包里包括的方法,可以查看Oracle官网文档,有很详细的解释
第三步:在收尾场景里添加5个JDBC取样器,分别如下:
建立结束快照号
获取DBID
获取实例NUMBER
获取开始和结束快照号
获取AWR报告正文
齐活,以调试模式运行,然后就可以在快照浏览器里,选中我们定义的获取AWR报告正文的取样器“获取AWR报告数据”,在右侧的渲染里就可以看到AWR报告了。
好了,相信大家按照这个步骤做下来应该已经学会如何使用HyperPacer自动获取AWR报告了。然—并—卵,因为我要告诉大家的是:一个好消息一个坏消息。
坏消息是:即便你取到了AWR报告,你可能根本不知道该看哪里而且也看不懂;好消息是:HyperPacer运营组后续可能会因为小伙伴们要求传授此类知识的呼声太高而不得不组织此类培训哦。
最后,作为一个有情怀的人,我必须直面HyperPacer的不完美,所以我必须要告诉大家,这个实现方案并不完美。这样的实现为什么我说不完美呢?因为,就如我们前面所说,Oracle默认情况下自己也会隔一个小时做一个快照,假设我们的测试过程耗时较长,超过了一个小时,那么,我们再去取最大的两个快照号时,实际上取到的是下图所示的红框内的统计数据。
如果我们能预先知道测试运行多长时间,我们还可以手动修改一下提取快照号的SQL(如何修改,来HyperPacer的交流群来问我啊),但是如果没办法预知测试耗时,那就没办法支持了。
还有一个不完美的地方,那就是只能在调试模式下才能看到取到的AWR报告,虽然说,我们需要AWR报告的时候大多都是在排查问题的时候,使用调试模式也无可厚非,但是,有着强迫症的我,总觉得脚本调试模式的性能损耗会把本来可以漂亮的结果拖累成一个Ugly things。以前的快照浏览器明明是一个配置元件,为什么它长大了就变成了一个功能页签。
于是,怀着无比郁闷的心情,我给HyperPacer技术组的小伙伴们又提了两个需求:
1、真心希望HyperPacer能够再增加一个全局变量配置的地方,通过对该变量读写进行跨域的参数传递。
2、运行模式也能支持特定的取样器结果输出。
提完需求,技术组的小伙伴哭着去加班去解决了,而我,美美的坐上了班车回家了。
参考文章:
Oracle AWR报告指标全解析 原文出处