Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2655503
  • 博文数量: 569
  • 博客积分: 1860
  • 博客等级: 上尉
  • 技术积分: 6249
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-07 08:51
个人简介

偶尔有空上来看看

文章分类

全部博文(569)

文章存档

2022年(63)

2021年(238)

2020年(115)

2019年(11)

2018年(9)

2017年(9)

2016年(17)

2015年(7)

2014年(4)

2013年(1)

2012年(11)

2011年(27)

2010年(35)

2009年(11)

2008年(11)

分类: Oracle

2022-01-18 22:11:26

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可行吗?
需要依赖当前动态组件的大小。

  1. col type for a12
  2. col component for a30

  3. 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
阅读(3422) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~