ash buffer是sga里的一块循环使用的内存区域,用于存放mmon捕捉到的active session信息,mmnl每隔60min将ash buffer的内容经过过滤后dump到awr,对应的视图是dba_hist_active_sess_history,以腾出ash buffer空间用于之后的采集。ash buffer的大小在instance启动时就已经决定了,并且在instance运行期间不能被动态调整,那么ash buffer的大小是由哪些因素决定的?
关于ash buffer的大小mos 243132.1上有如下描述
size of ash circular buffer = max [min [ #cpus * 2 mb, 5% of shared pool size, 30mb ], 1mb ]
###看下实际环境里和ash buffer有关的参数
sql> show parameter cpu_count
name type value
------------------------------------ ----------- ------------------------------
cpu_count integer 16
sql> show parameter shared_pool_size
name type value
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 1312m
---计算一下ash buffer应该为多少大小
max [min [ 16 * 2 mb, 5%*1312m, 30mb ], 1mb ]=30mb
---实际ash buffer大小可以从v$sgastat、v$ash_info获得,均为32mb,和公式提供的稍有差别,选择32mb作为ash buffer
select * from v$sgastat where;
pool name bytes
------------ -------------------------- ----------
shared pool ash buffers 33554432
select total_size,fixed_size,sampling_interval from v$ash_info;
total_size fixed_size sampling_interval
---------- ---------- -----------------
33554432 33554432 1000
###更改一下cpu_count
alter system set cpu_count=8 scope=spfile;
startup force
show parameter cpu_count
name type value
------------------------------------ ----------- ------------------------------
cpu_count integer 8
---按照公式size of ash circular buffer = max [min [ #cpus * 2 mb, 5% of shared pool size, 30mb ], 1mb ]计算
ash buffer=max [min [ 8 * 2 mb, 5%*1312m, 30mb ], 1mb ]=16mb
---下面的查询结果应验了上面的计算
select total_size,fixed_size,sampling_interval from v$ash_info;
total_size fixed_size sampling_interval
---------- ---------- -----------------
16777216 16777216 1000
select * from v$sgastat where;
pool name bytes
------------ -------------------------- ----------
shared pool ash buffers 16777216
###_ash_size隐含参数控制ash buffer的大小
公式size of ash circular buffer = max [min [ #cpus * 2 mb, 5% of shared pool size, 30mb ], 1mb ]里的1mb是_ash_size的默认值
---_ash_size的默认值为1mb
select ksppinm,ksppstvl from x$ksppi x, x$ksppcv y where (x.indx = y.indx) and ksppinm like '_ash_size%'
ksppinm ksppstvl
------------------------------ ------------------------------
_ash_size 1048618
---我们把_ash_size改大,改成64mb
alter system set _ash_size=67108864 scope=spfile;
startup force
---计算一下此时的ash buffer值
ash circular buffer = max [min [ 8 * 2 mb, 5%*1315m, 30mb ], 64mb ]=64mb
---下面的查询结果应验了上面的计算
sql> select total_size,fixed_size,sampling_interval from v$ash_info;
total_size fixed_size sampling_interval
---------- ---------- -----------------
67108864 67108864 1000
sql> select * from v$sgastat where;
pool name bytes
------------ -------------------------- ----------
shared pool ash buffers 67108864
