测试中遇到压力上不去的问题,查看AWR报告,Top 5 Events里面"free buffer waits"的AVG-wait times很高。
关于free buffer wait的分析和调优云云,就不多说了。后来经过检查,本人遇到的问题主要是虽然提高了sga_max_size的大小和意愿使用ASSM,但是由于初始化参数里设置SGA_TARGET=0,造成数据库内存分配不合理,并没有真正动态调整内存使用,而一些SGA参数设置不合理从而引起"free buffer wait event"。
重新设置SGA_TARGET的值(>0,略小于SGA_MAX_SIZE),问题解决。整理了一下学习过程中的知识点,如下:
1. SGA
auto-tuned parameters,可动态分配参数
· SHARED POOL
· LARGE POOL
· JAVA POOL
· DB CACHE (using the DB_BLOCK_SIZE value)
· STREAMS_POOL_SIZE (Oracle10gR2后)
manual parameters,必须预定义参数
· DB_<KEEP/RECYCLE>_CACHE_SIZE
· DB_nK_CACHE_SIZE (non default block size)
· LOG_BUFFER
· FIXED SGA
· STREAMS_POOL_SIZE (Oracle10gR2前)
2. ASMM, Automatic Shared Memory Management
· ORACLE 10g以前,数据库需要人工设置buffer cache, shared pool, java pool, and large pool
· ORACLE 10g开始,引用了ASMM机制,通过SGA_TARGET参数的设定,可以实现数据库自动分配buffer cache (default pool), Shared pool,Large pool and Java pool的大小。
· 从10R2后,streams pool也包含进ASSM来,实现自动分配。
· 如果使用ASMM,则数据库设置必须满足以下2个条件:
STATISTICS_LEVEL=TYPICAL or ALL
SGA_TARGET > 0
3. SGA_TARGET
· SGA_TARGET的默认值为0。如果值为0,则ASSM不起作用,必须自定义buffer cache, shared pool, java pool, and large pool的值
· SGA_TARGET值非0,ASMM才可以自动分配调节内存。
· SGA_TARGET是动态参数,可以使用"alter system set sga_target=** ;"命令调整
· SGA_TARGET始终<= SGA_MAX_SIZE
· INSTANCE已经OPEN后,SGA_MAX_SIZE不可再修改
4. 关于free buffer wait调优的重要参数
· Buffer cache
· DB_BLOCK_WRITE_BATCH
· DB_WRITER_PROCESSES