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
阅读(6553) | 评论(0) | 转发(0) |