首页 > 数据库 > Oracle > 某地Oracle AWR分析报告1
两个实例之间的业务负载非常不均衡,造成实例的效率下降。
较高的负载可能集中在实例1,也可能是另一个实例。
2015年1月26日:
2015年1月27日:
ü Cluster类相关的等待占整个DBTime的10%以上,直白的显示出RAC存在一定问题。
ü USER I/O相关的两个等待都是与DB File相关的,在接下来的分析中我们会发现,它们与Cluster等待都源自相同的原因。
ü CPU占比较高,提示我们,可能可以通过减少CPU的占用提高整个实例的效率。
由于硬解析较高,并且,采用了自动自动共享内存管理(ASMM),Shareool被自动调整到很大的值,导致DataBuffer缩小,从而,造成了DataFile的物理读增加(表现为TOP5等待事件中的DBFile等待事件)和实例之间的远程获取增加(表现为TOP5等待事件中的Cluster相关的等待增加)。
同时,硬解析和GC活动的增加也会导致CPU增加。
以上原因造成了单个实例的Top5等待事件。
那么,负载在两个实例之间为什么会差异如此巨大呢?
由于ASMM的关系,两个实例在分配SharePool和DataBuffer时比例是不同的。为了得到平衡的CPU使用率,Oracle针对事务的不同特点,在实例之间进行了平衡。从而,最终,两个实例的DBTime最然差异巨大,但CPU时间却相差不多。本质上,真正平衡的使用了两个实例的资源。
换个说法,如果Oracle数据库,没有重新根据事务特点分配工作量,那么即便是内存比例不同的实例,也会得到相同的工作,最终,就会造成,两个实例上CPU使用的不平衡,工作量虽然是均衡的,但资源却并不能与执行的任务相匹配。
也就是说,Oracle的负载均衡是考虑到了内存的分配情况的后的结果,而不是简单的把任务平均分配给每个实例。Oracle的均衡更倾向于CPUTime的均衡而不是DBTime。
从以下数据,我们发现,两个实例上完成的事务,其特点是不同的。
实例1上,每个事务的RedoSize大约44K,而BufferCache于SharePool的比例大约是5:5
实例2上,每个事务的RedoSize大约不到18K,而BufferCache于SharePool的比例大约是5:3
比较以上数据,发现:实例1的事务更倾向于DML,而实例2上的事务更倾向于查询。
实例1的DBTime明显比实例2多,而DataBuffer的比例明显偏少。
我们发现另一个有意思的现象,就是下面的数据显式,两个实例的CPUTime的百分比非常接近。
这说明RAC的负载均衡在这两个实例上一直以一种稳定的方式运行,这种方式就是以CPUTime百分比为目标的在两个 实例之间作均衡。这也解释了,为什么在负载均衡机制下,两个实例的DBTime差异那么明显,因为均衡不是以DBTime为目标的。
不同实例的内存的分配比例不同,等待事件的影响也不同,为了在实例之间平衡CPUTime的百分比,就需要每个实例运行不同特点的事务,从而弥补那些差异。这也就解释了,为什么我们会发现,两个实例上的事务特点不同,一个倾向于DML,另一个倾向于查询。
下面有一些汇总的数据,可以发现,CPUTime%在不同实例上基本上是相等的。
|
数据跨度 |
指标 |
社保 |
医保 |
||
|
实例1 |
实例2 |
实例1 |
实例2 |
||
|
1月26日 9:00-10:00 |
DBTime |
21 |
45 |
485 |
566 |
|
BufferPool |
3.7 |
6.1 |
27.9 |
27.7 |
|
|
SharePool |
5.2 |
2.9 |
2.6 |
2.8 |
|
|
Redo/Trs |
20 |
37.4 |
8.6 |
8.48 |
|
|
TRS/S |
1.23 |
1.46 |
9.24 |
5.47 |
|
|
CPUTime% |
64.50% |
69.80% |
60.20% |
60.10% |
|
|
|
|
|
|
|
|
|
1月27日 |
DBTime |
62 |
23 |
158 |
133 |
|
BufferPool |
4.7 |
5.5 |
27.9 |
27.9 |
|
|
SharePool |
4.3 |
3.5 |
2.6 |
2.6 |
|
|
Redo/Trs |
44 |
17.7 |
7.7 |
9.26 |
|
|
TRS/S |
1.53 |
1.27 |
11.15 |
3.6 |
|
|
CPUTime% |
64.60% |
66.80% |
75.60% |
74.90% |
|
|
|
|
|
|
|
|
|
共7天 |
DBTime |
11.9 |
20.4 |
9.9 |
7.9 |
|
BufferPool |
5.6 |
3.8 |
27.8 |
28 |
|
|
SharePool |
3.4 |
5.1 |
2.8 |
2.6 |
|
|
Redo/Trs |
17.2 |
53.5 |
7.8 |
15.7 |
|
|
TRS/S |
1.26 |
1.3 |
5.14 |
1.36 |
|
|
CPUTime% |
6.20% |
35.40% |
76.40% |
76.30% |
|
为什么DataBuffer和SharePool大小的比例在这两个实例上会不同呢?原因如下:
ü 每个实例可以设置自己的内存。
ü 从Oracle10g开始,ASMM机制会根据事务对内存的需求,对共享内存(其中就包括DataBuffer和SharePool)自动调整。
ü 较高的硬解析率造成其对SharePool的需求较大。
ü 负载均衡的目标是CPUTime的均衡,因此,在每个实例的事务特点会不同,对SharePool的需求也就不同。
ü Sga_target限制了总的共享内存大小,目前来看,此值设置的过小
也就说,当应解析率较高时,会要求较多的SharePool,但因为总的共享内存是有限的,DataBuffer就不得不减少。又因为每个实例上的事务特点不同,运行的SQL对SharePool的需求也就不同,最终,造成了SharePool在每个实例上都不同。Oracle根据负载平衡的目标,开始在两个实例上分配不同的事务。这可能进一步加剧了共享内存的自动分配,使得dataBuffer 和SharePool进一步变化。在一开始时,可能这种差异并不明显,但ASMM和RAC的负载均衡机制反复相互作用,最后,在运行一段时间后,这种差异就变得比较明显了,CPUTime终于取得了平衡。但是事务在一段时间后是会变化的,这会造成新的不平衡。
也正是这个过程,造成了共享内存内部的分配比例不稳定,一段时间后,平衡被打破,ASMM将重新分配共享内存,这就造成了我们看到的现象:高DBTime的实例并不固定。
以下是具体数据:
实例1和实例2的参数文件中显示的sga_target设置是一样的,大概9.5G左右。
BufferCache和SharePool在每个实例上的总大小都是9G多一点,其中一个增加,另一个就会减少,总量不变。
以下是两个实例在DBTime较高时,显示出硬解析率较高,LibraryHit很低,同时我们从之前的分析了解到,SharePool大小的比例已经很高。高硬解析率对SharePool造成了较大需求,将DataBuffer挤压的很小,造成此处看到的BufferHit较低。
在对共享内存的 建议中,我们看到目前的尺寸的确太小。
关于实例1的建议,DataBuffer建议为8960兆,SharePool建议为5968兆,两者之和为15G,考虑到其他内存结构,最后建议SGA大小为16G:
关于实例2的建议,DataBuffer建议为12160兆,SharePool建议为4480兆,两者之和为16.5G,考虑到其他内存结构,最后建议SGA大小为17G:
如果硬解析可以减少,就可以降低对SharePool的需求,从而给DataBuffer留出空间,提高内存命中率,减少IO和gc活动。同时,由于减少了ASMM对内存的调整,也可以降低CPU消耗。
当解决硬解析后,可以再采集一次AWR报告,观察一下其中关于DataBuffer和SharePool的建议,看看内存是否合理,是否够用。
以下语句可以查询硬解析的SQL有哪些:
with force_mathces as
(select l.force_matching_signature mathces,
max(l.sql_id || l.child_number) max_sql_child,
dense_rank() over(order by count(*) desc) ranking
from v$sql l
where l.force_matching_signature <> 0
and l.parsing_schema_name <> 'SYS'
group by l.force_matching_signature
having count(*) > 10)
select v.sql_id, v.sql_text, v.parsing_schema_name, fm.mathces, fm.ranking
from force_mathces fm, v$sql v
where fm.max_sql_child = (v.sql_id || v.child_number)
and fm.ranking <= 5
order by fm.ranking;
如果内存合理,为了不让ASMM过度的调整内存,可以为DataBuffer和SharePool设置最小值。
可以执行如下命令:
Alter system set db_cache_size=XXXM Scope=Both
Alter system set share_pool_size=XXXM Scope=Both
在解决硬解析后,再次采集AWR报告,观察一下其中关于DataBuffer和SharePool的建议,看看内存是否合理,是否够用。
如果内存不够用,可以按照建议值增加其大小。
为了增加这两个组件的大小,应该先增加sga_target,然后再分别设置DataBuffer和SharePool的最小值:
Alter system set sga_target=XXXM Scope=Both
Alter system set db_cache_size=XXXM
Scope=Both
某地AWR报告分析.docx
Alter system set share_pool_size=XXXM Scope=Both
当然,前提是服务器有足够的物理内存用于分配。
在进行优化后,应该采集AWR报告,观察数据库吞吐量是否提高,之前的TOP5等待事件是否被消除。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29882253/viewspace-1629331/ ,如需转载,请注明出处,否则将追究法律责任。