暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PGA自动管理下--单进程内存消耗控制

原创 Jenny 2021-07-04
1496

1.确定PGA是自动管理还是手动管理,<*_area_size>参数是否生效。

workarea_size_policy参数定义PGA是自动管理还是手动管理,其取值为auto和manual。但是它的取值是与pga_aggregate_target的取值有关。
(1)pga_aggregate_target设置为0时,workarea_size_policy自动设置为manual,不会使用PGA自动内存管理,*_area_size参数生效。
(2)pga_aggregate_target设置为非0时,workarea_size_policy自动设置为auto,使用PGA自动内存管理,*_area_size参数不生效。
(3)不设置pga_aggregate_target,缺省也是自动内存管理,缺省值为SGA*20%与10MB的较大值。

总之: PGA手动管理,*_area_size参数生效;PGA自动管理,*_area_size参数不生效。

2.对参数pga_aggregate_target的理解

pga_aggregate_target 如同它名字里体现的target,它只是一个目标值,而不是一个绝对的限制。这意味着在高负荷下,实际消耗的内存量会连续的或至少间歇性的超过这个目标值,但是自动PGA内存管理会在所有可能的情况下释放内存,使得总的内存消耗快速降到目标值之下。
PGA的内存是按需分配的,不像SGA在实例启动的时候分配。即使手动管理,*_area_size参数也不会导致分配一个指定大小的内存,而是会按需分配。

3.PGA自动管理,work area区的大小限制。

image.png
SQL Work Areas:
对于内存密集型操作,Oracle会为会话分配私有内存用于这些操作,比如sort area用于排序操作,hash area用于hash join,Bitmap Merge Area用于位图合并。这些区域就是PGA的work area。并不是每个会话分配的PGA内存里一定包含这些区域,因为有的sql可能只有order by,有的sql只有hash join。
如果要处理的数据量超过了workarea的大小,Oracle会把数据拆分成小份,当在内存处理一部分数据时,其余数据写入临时文件,这样会造成很多的IO操作,从而消耗更多的时间。所以workarea的大小对于处理消耗内存多的操作的性能很重要。
PGA的自动管理受隐藏参数 _pga_max_size、_smm_max_size、_smm_px_max_size的影响。_pga_max_size用于限制单个进程所有工作区的最大大小,_smm_max_size用于限制单个进程一个单独工作区的最大大小,_smm_px_max_size用于限制并行执行(Parallel Execution PX)进程每个PX进程最大工作区大小。
_pga_max_size单位为bytes,_smm_max_size、_smm_px_max_size单位为KB,
查询这几个参数值:

select x.ksppinm name, 
case  when x.ksppinm like  '_pga%' then 
to_number(y.ksppstvl)/1024/1024
else 
to_number(y.ksppstvl)/1024
end as value(MB),
 x.ksppdesc description 
from x$ksppi x ,x$ksppcv y 
where  x.indx=y.indx 
and x.ksppinm in ('_pga_max_size','_smm_max_size','_smm_px_max_size');

NAME VALUE(MB) DESCPRIPTION


_pga_max_size 200 Maximum size of the PGA memory for one process
_smm_max_size 80 maximum work area size in auto mode (serial)
_smm_px_max_size 200 maximum work area size in auto mode (global)

改变pga_aggregate_target值,这三个隐藏参数也会随之进行动态改变。改变pga_aggregate_target的值在10MB~32G之间变化,三个隐藏参数的变化规律如下表所示:以下数据是通过oracle11.2.0.4版本所测。
image.png

请注意:如果把_pga_max_size,_smm_max_size与_smm_px_max_size三个隐藏参数写入到参数文件覆盖设置时,其将不会进行动态调整。

4._pga_max_size

参数_pga_max_size限制了单个进程所有工作区的最大大小。
(1)当pga_aggregate_target(PAT) 小于1GB时,_pga_max_size为200MB。
(2)当PAT在1GB和10GB之间时,_pag_max_size为PAT的20%
(3)当PAT超过10GB时,随着PAT的增长,_pga_max_size不再增长,保持2G。
(4)在Oracle 9i中_pga_max_size限制在200MB之内,Oracle10GR2中_pga_max_size限制这480M内。

5._smm_max_size

参数_smm_max_size限制了单个进程下一个单独工作区的最大大小。
从表格中看出_smm_max_size的变化规律为:
(1)当PAT低于512MB时,_smm_max_size为PAT的20%。
(2)当PAT超过512MB时,_smm_max_size占_pga_max_size的50%。
综合来看 _smm_max_size的取值是取_pga_max_size的50%与PAT的20%中较小的一个。

_pga_max_size是一个动态参数,可以通过手动修改它的值来达到增大_smm_max_size的目的,_smm_max_size=_pga_max_size*50%,但是_smm_max_size不会超过PAT的20%。通过修改_pga_max_size,_smm_max_size可动态设置的比正常限制范围1GB大,但是MOS上提示_pga_max_size超过2G,会存在一些bug。

6._smm_px_max_size

(1)_smm_px_max_size的值始终设置为PAT的50%。
(2)Oracle 9i中_smm_px_max_size占PAT的30%
参数_smm_px_max_size适用于并行执行(Parallel Execution PX)进程,对PX的每个进程的最大工作区的大小做了额外限制,每个PX进程使用的内存都不能超过_smm_px_max_size/DOP。 【DOP为并行度(degree of parallism)】。_smm_max_size对每个进程的限制对PX进程也是有效的。这样每个PX进程的可用内存取_smm_max_size与_smm_px_max_size/DOP中较小的一个。
所以完全在内存中进行排序或hash join,必须满足条件:
1)每个PX进程的数据量低于_smm_max_size
2)每个PX进程的数据量低于_smm_px_max_size/DOP

7.总结:

当使用PGA自动内存管理时,三个隐藏参数_pga_max_size、_smm_max_size、_smm_px_max_size就在幕后工作以加强对内存的消耗限制。
参数_pga_max_size限制单个进程的所有工作区大小(包含sort_area, hash_area、bitmap merge area、create bitmap area)。而_smm_max_size限制无论串行还是并行情况下一个单独工作区的大小。当使用并行执行时,所有并行进程涉及的所有工作区的大小受_smm_px_max_size参数的限制。
在这些限制范围内,修改PAT,这个三个参数值都在运行时会重新计算。这三个参数可以手动设置覆盖计算结果。

最后修改时间:2021-07-05 10:37:45
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论