10g开始自动内存管理,设置sga_target=4g即可实现自动分配高速缓存和共享池大小,ok,直到遇到了ora-4033。
设置streams_pool_size时,提示这个异常,那么到底当前环境能够调整为多大?
从头看。
asmm要想生效,前提条件是由两个参数决定:
statistics_level=typical or all
sga_target > 0
当然最小的sga至少得3个内存粒度,按设计最小内存粒度是4m(148495.1),因此这个target至少得12m。如下分配:
1个用于fixed sga (includes redo buffers)
1个用于buffer cache
1个用于shared pool
内存粒度大小
(947152.1):
12c后当然要排除掉imm部分(2658593.1)。
测试环境粒度应该是16m,但却显示4m(不解),而实际计算时得按16m做统计,见下文。
sga动态调整部分涉及:
db_cache_size,shared_pool_size,streams_pool_size,large_pool_size,java_pool_size
固定不动的内存是:
db_nk_cache_size, fixed sga, log_buffer
sga的最大值是sga_max_size参数(天花板)
通常将sga_max_size与sga_target两个参数的值设置为相同。使用spfile的库,sga_target可以动态调整,这个例子中从1000m调大到1200m很容易理解,但是也不一定能实现,要依赖v$sga_dynamic_free_memory中的信息来判断,下图是刚重启实例,看起来没问题。
有时可能是还没有释放,导致并不一定能获取到整200m。
sga_target想从1000m调小为800m可行吗?
需要依赖当前动态组件的大小。
-
col type for a12
-
col component for a30
-
-
select component, current_size/1024/1024 "current_size", min_size/1024/1024 "min_size", user_specified_size/1024/1024 "user_specified_size" from v$sga_dynamic_components;
-
这里看到了一个有趣的现象,我故意将db_cache_size设置的过小,才给8m,但是数据库最低也给了两个granule,即16m*2=32m。
最小sga计算如下:
244(shared pool) 128(large pool) 256(streams pool) 32(buffer cache) 48(shared io pool) 16(一个粒度用于sga的
固定部分)
再低一点儿也不行。
再看看剩余sga内存:
1196比1200还差4m,不知道谁没释放,先不管了。
回到问题之初:sga内部组件可以调整多大?
通常调大需求较多,依赖以下公式:
sga_target - ((sum(min_size for other auto-tuned parameters) (current_size for manual parameters) (size allocated for fixed parameters))
翻译一下:
某个组件可用内存=sga_target - 自动调整组件最小值合计 - 手工设置的当前值 - 一个粒度
举例:
当前sga是844m
想调大共享池大小,先看当前各组件值:
因此共享池可以调整的大小是:844-128-256-48-16=364m
想多给一点都不行。
参考:295626.1
阅读(5899) | 评论(0) | 转发(0) |