Oracle DB 自动管理共享内存
• 启用Oracle Enterprise Manager (EM) 内存参数
• 设置自动优化的内存参数
• 使用手动优化的SGA 参数覆盖最小大小
• 使用SGA Advisor 设置SGA_TARGET
- Oracle 数据库体系结构
Oracle 数据库体系结构
该幻灯片显示自动管理共享内存 (ASMM) 所涉及的关键 SGA 组件和进程。
SGA 组件共享池、大型池、Java 池、流池和默认缓冲区高速缓存参与 ASMM。监视和动
态调整大小由下列两个后台进程进行处理:内存管理器 (MMAN) 和可管理性监视程序
(MMON) 。
ASSM 基础结构取决于可管理性监视程序收集的统计信息,所以必须将
STATISTICS_LEVEL 参数设置为 TYPICAL或ALL ,以使用 ASMM。
注:ASH 缓冲区、排序区池和全局上下文池全部都包含在共享池中。
- 动态SGA 功能
• 实施基础结构,以使服务器可以在不关闭实例的情况下
更改其SGA 配置
• SGA 大小由SGA_MAX_SIZE进行限制:
– 用于在实例启动时保留虚拟内存地址空间
– 无法动态地进行更改
• 允许动态地调整某些SGA 组件的大小
SELECT bytes
FROM V$SGAINFO
WHERE name = 'Free SGA Memory Available';
动态SGA 功能
Oracle9i Database 中引入了动态 SGA 功能。系统全局区 (SGA) 在内部分为多个内存组件。
组件代表用于满足特定类的内存分配请求的内存池。最常配置的内存组件包括数据库缓冲
区高速缓存、共享池、大型池、Java 池和流池。
动态SGA 基础结构允许在不关闭实例的情况下调整某些 SGA 组件的大小,修改初始化参
数文件,以及重新启动实例。
此外,动态 SGA 基础结构还允许在运行时设置整个 SGA 使用的内存量的限制。限制内存
的参数为 SGA_MAX_SIZE。这是在实例启动时分配的内存量,与个别组件是否会利用全
部内存量无关。
注:在实例启动期间,如果 SGA 组件使用的所有内存的总和超过 SGA_MAX_SIZE分配
的数量,则将调整 SGA_MAX_SIZE的值,以满足内存要求。
- 区组
• SGA 内存以相邻的内存块(称为区组)为单位进行分配。
• 区组大小取决于估计的总SGA。如果估计的SGA 大小:
– 小于或等于1 GB,则区组大小为4 MB
– 大于1 GB,则区组大小为16 MB
SELECT bytes
FROM V$SGAINFO
WHERE name = 'Granule Size';
区组
SGA 内存以区组为单位进行分配。每个 SGA 组件使用的区组数量记录在动态性能视图中。
区组大小由总 SGA 大小决定。在大多数平台上,如果总 SGA 大小小于 1 GB,则区组大
小为4 MB,如果 SGA 大于1 GB,则区组大小为 16 MB 。某些平台的相关性会增加。例
如,在 32 位Windows 上,如果 SGA 大于 1 GB,则区组大小为 8 MB。
可以在 V$SGAINFO 视图中查看每个组件的 SGA 当前使用的区组大小。
- 内存指导
• 缓冲区高速缓存建议(在9 i R1 中引入):
– V$DB_CACHE_ADVICE
– 预测不同高速缓存大小的物理读取数
• 共享池建议(在9 i R2 中):
– V$SHARED_POOL_ADVICE
– 预测不同大小的共享池可以节省的分析时间
• Java 池建议(在9 i R2 中):
– V$JAVA_POOL_ADVICE
– 预测不同大小的Java 池可以节省的Java 类加载时间
• 流池建议(10 g R2)
– V$STREAMS_POOL_ADVICE
– 预测不同大小的溢出和未溢出活动
内存指导
为了帮助调整最重要的 SGA 组件的大小,引入了很多指导,如下所示:
• V$DB_CACHE_ADVICE 包含的行预测与每行对应的高速缓存大小的物理读取数。
• V$SHARED_POOL_ADVICE 显示有关不同池大小的共享池中估计的分析时间的信息。
• V$JAVA_POOL_ADVICE显示有关不同池大小的 Java 池中估计的分析时间的信息。
• V$STREAMS_POOL_ADVICE显示有关估计的溢出或未溢出邮件数,以及用于不同
流池大小的溢出或未溢出活动的关联时间的信息。
- 在组件中手动添加区组
• 使用ALTER SYSTEM 命令动态地增加为组件分配的
内存。
• 只有存在满足请求的足够可用区组时,才能成功地增
加组件的内存使用量。
• 不会自动地从另一个组件释放内存区组来满足此增加
请求。
• 可以减小组件大小,但是只有组件未使用释放的区组
时才能实现此操作。
在组件中添加区组
可以通过发出 ALTER SYSTEM 命令,增加共享池或任何缓冲区高速缓存组件的大小。新大
小将舍入至与区组大小最接近的倍数。只有存在满足请求的足够可用区组
(SGA_MAX_SIZE减去所有 SGA 组件的当前大小)时,才能成功地使用 ALTER SYSTEM
命令增加组件的内存使用量。服务器不会释放另一个组件的区组来支持 SGA 组件的增加。
必须确保实例拥有足够的可用区组来满足组件区组使用量的增加。如果存在可用区组,则
服务器可以分配更多的区组,直到 SGA 大小达到 SGA_MAX_SIZE。
注:在调整 SGA 组件的大小时应记住,一部分 SGA 是固定的。此固定内存最少包含一个
区组。
- 增加SGA 组件的大小
增加SGA 组件的大小
下表显示了内存分配的起点:
NAME TYPE VALUE
------------- ----------- -----------------------
sga_max_size big integer 200M
db_cache_size big integer 92M
java_pool_size big integer 4M
large_pool_size big integer 4M
shared_pool_size big integer 84M
streams_pool_size big integer 8M
- 自动管理共享内存:概览
• 使用动态SGA 和内存指导来自动适应工作量的变化
• 最大化内存使用率
• 帮助避免内存不足错误
• 消除了在使用SPFILE
时的重新学习过程
自动管理共享内存:概览
自动管理共享内存 (ASMM) 是一项重要的自行管理功能。此功能可自动管理最重要的 SGA
组件,这样您就不必手动配置这些组件了。ASMM 使用内存指导数据来评估最佳的内存配
置,然后使用动态 SGA 功能调整组件的大小。通过 ASMM 可以更有效地使用可用内存,
从而减少了由采购其它硬件内存资源而导致的成本,并通过更加动态、灵活且更具适应性
的内存管理方案,显著简化了 Oracle 数据库管理。
例如,在白天运行高并发性 OLTP 工作量的系统中,需要大量缓冲区高速缓存,必须配置
缓冲区高速缓存和大型池来满足高峰期的要求。通过 ASMM,在运行 OLTP 工作量时,将
为缓冲区高速缓存分配所需的内存,以优化缓冲区高速缓存访问。以后启动决策支持系统
(DSS) 批处理作业时,内存将自动迁移到大型池,以便并行查询操作可以使用内存,而不
会产生内存溢出错误。
注:通过 ASMM,如果使用 SPFILE ,则会在关闭时保存组件大小。可以继续使用上次关
闭之前的大小,从而消除了重新学习过程。
- SGA 调整大小参数:概览
• 使用ASMM,可以自动调整五个重要SGA 组件的大小。
• 不会自动优化非默认缓冲区池。
• 日志缓冲区不是动态组件,但是具有很合适的默认值。
SGA 调整大小参数:概览
如幻灯片中所示,激活 ASMM 时将自动优化五个最重要的池。这些池的参数被称为“自
动优化的参数”。
“手动动态参数”是那些可以在不必关闭实例的情况下手动调整大小的参数,但是系统不
会自动优化这些参数。
“手动静态参数”是固定大小的参数,如果不先关闭实例,则无法调整大小。
- 自动管理共享内存的优点
自动管理共享内存的优点
自动管理共享内存 (ASMM) 可以简化系统全局区 (SGA) 的配置。在以前版本的 Oracle 数
据库中,需要手动指定要为数据库缓冲区高速缓存、共享池、Java 池、大型池和流池分
配的内存量。通常很难将这些组件调整为最佳大小。大小不足可能会导致性能较差,并
出现内存不足错误 (ORA-4031 ),而大小过大可能会浪费内存。
通过ASMM 可以指定要用于所有 SGA 组件的总内存量。Oracle 数据库服务器根据工作
量的要求,定期在幻灯片中所示的组件之间重新分配内存。
在以前的版本中,您无法精确地控制 SGA 的总大小,因为内存会被分配给固定 SGA ,
以及超过用户指定 SGA 参数的总大小的其它内部元数据分配。此附加内存通常在 10 到
20 MB 之间。
将SGA_TARGET参数设置为非零值会启用 ASMM。SGA_TARGET初始化参数包括 SGA
中的所有内存,其中包括自动调整大小的组件、手动调整大小的组件以及启动时的任何
内部分配。
- 动态SGA 传递模式
• ASMM IMMEDIATE 传递模式:
– 内存不足(ORA-04031) 错误
– 可以使用部分区组
• ASMM DEFERRED 传递模式:
– 在后台透明地执行
– 可以使用部分区组
• MANUAL 传递模式:
– 与ALTER SYSTEM 命令一起使用
– 调整大小必须使用全部区组
动态SGA 传递模式
目前,动态 SGA 组件之间存在三种区组传递机制:
• IMMEDIATE :将在激活 ASMM 时使用此模式,一个自动优化的组件将出现内存不
足错误。为了避免出现该错误,系统将尝试从另一个组件传递区组。如果没有完全
空的可用区组,则此传递可以是部分传递。如果是这种情况,则系统会开始耗尽来
自其它组件的区组来满足内存请求,并将区组部分传递给请求内存的组件。
• DEFERRED:如果确定存在更有效的内存分配,则系统将使用此模式在组件之间传递
内存。使用与指导有关的数据来确定最佳内存分配。
• MANUAL:要求系统调整组件大小时使用此模式。此模式只能使用空的区组进行调整
大小操作。如果没有空的区组,则增大请求将返回 ORA-4033 错误,收缩请求将返
回ORA-4034 错误。
- 内存中介体系结构
内存中介体系结构
启用ASMM 时,内存中介定期执行此幻灯片中的活动。这些操作处于 DEFERRED 模式。
通过将内存分配到最需要的地方来实现为自动优化的组件自动调整大小,以适应工作量的
变化这个目标。如果总的来说这样做有好处,则会完成传递。
在此后台操作期间,MMON 在循环缓冲区中定期捕获统计信息和内存指导数据。
不同缓冲区条目之间的增量代表不同时段的统计信息。这些增量由 MMON 计算。
MMON 使用内存中介策略分析增量并检查长期趋势和短期趋势。
MMON 通过在调整大小请求系统队列中发布请求,可以根据此分析生成调整大小决策。
MMAN 定期扫描请求系统队列,以执行相应的内存传递。
- 手动调整动态SGA 参数的大小
• 对于自动优化的参数:
– 如果新值大于当前大小,则手动调整大小将立即调整组件
的大小
– 如果新值小于当前大小,则手动调整大小将更改最小大小
• 调整手动优化的参数的大小会影响SGA 的可优化部分
手动调整动态 SGA 参数的大小
调整自动优化的参数的大小并设置了 SGA_TARGET后,只有新值大于组件的当前大小时,
调整大小才会立即更改组件的大小。例如,如果将 SGA_TARGET设置为8 GB,并将
SHARED_POOL_SIZE 设置为 2 GB,则应确保共享池始终至少为 2 GB,以适应必要的内
存分配。此后,如果将 SHARED_POOL_SIZE 的值调整为 1 GB,则不会立即影响共享池
的大小。这样做只会允许自动内存优化算法在必要时将共享池大小减少到 1 GB。但是,
如果最初将共享池的大小设置为 1 GB,则将 SHARED_POOL_SIZE 的值调整为 2 GB 会
使共享池组件的大小增加到 2 GB。此调整大小操作使用的内存从一个或多个自动优化的
组件中获取,手动组件的大小不受影响。
也可以动态更改手动调整大小的组件的参数,但是区别在于参数的值会立即指定该组件
的精确大小。因此,如果手动组件的大小增加,则会从一个或多个自动调整大小的组件
获取额外的内存。如果手动组件的大小减小,则会将释放的内存分配给自动调整大小的
组件。
- 自动优化的SGA 参数的行为
• 未设置SGA_TARGET或将其设置为零时:
– 明确设置了自动优化的参数
– 注:SHARED_POOL_SIZE
包含内部启动开销
与以前的版本相比,值可能需要增加
• 设置了SGA_TARGET时:
– 自动优化的参数的默认值为零
– 非零值为下限
– 当前值(MB) 显示为:
SELECT component, current_size/1024/1024
FROM V$SGA_DYNAMIC_COMPONENTS;
自动优化的 SGA 参数的行为
未设置 SGA_TARGET或将其设置为零时,必须明确设置自动优化的 SGA 参数。
SHARED_POOL_SIZE 是一个例外。在以前版本的 Oracle 数据库中,
SHARED_POOL_SIZE 参数不包含元数据(进程、会话等的数据结构)的内部开销分配,
但是现在包含这些内部开销分配。
注:升级问题:要在升级到 Oracle Database 10 g 时获得同样有效的共享池大小,请增加
SHARED_POOL_SIZE 的值,以包含内部分配。例如,如果在以前的版本中使用的
SHARED_POOL_SIZE 值为 256 MB,并且内部分配的值为 32 MB ,则需要将 Oracle
Database 10 g 的SHARED_POOL_SIZE 设置为288 MB。使用以下查询可以找到内部启动
开销的准确值:
select * from V$SGAINFO where name like 'Startup%';
将SGA_TARGET设置为非零值时,自动优化的 SGA 参数的默认值为零。ASMM 算法将
自动调整这些组件的大小。但是,如果将它们设置为非零值,则指定的值将作为下限使用。
例如,如果将 SGA_TARGET设置为8 GB,并将 SHARED_POOL_SIZE 设置为1 GB,则
共享池不会收缩到小于 1 GB 的值,但是可能增加到更大的值。可以使用查询来确定 SGA
中自动优化的组件的实际大小。
- 手动优化的SGA 参数的行为
• 手动优化的组件包括:
– KEEP 和RECYCLE缓冲区高速缓存
– 非默认块大小高速缓存
– LOG_BUFFER
• 手动优化的组件由用户指定。
• 手动优化的组件包含在SGA_TARGET中,可以精确地
控制SGA 大小。
手动优化的 SGA 参数的行为
手动SGA 大小参数包括:
• DB_KEEP_CACHE_SIZE
• DB_RECYCLE_CACHE_SIZE
• DB_nK_CACHE_SIZE(n = 2 , 4, 8, 16, 32)
• LOG_BUFFER
手动SGA 参数由用户指定,指定的大小精确地控制相应组件的大小。
设置了 SGA_TARGET后,将从 SGA_TARGET值中减去手动 SGA 大小参数的总大小,并
将余数分配给自动优化的 SGA 组件。
例如,如果将 SGA_TARGET设置为8 GB,并将 DB_KEEP_CACHE_SIZE 设置为 1 GB,
则五个自动优化的组件(共享池、Java 池、默认缓冲区高速缓存、大型池和流池)的总大
小限制为 7 GB。7 GB 大小包括固定 SGA 和日志缓冲区。只有分配了这些内存之后,才
会在自动优化的组件之间分配剩余的内存。保留高速缓存的大小为 1 GB,由参数指定。
- 使用V$PARAMETER 视图
使用V$PARAMETER 视图
为SGA_TARGET指定非零值,并且没有为自动优化的 SGA 参数指定值时,
V$PARAMETER 视图中自动优化的 SGA 参数的值为 0,ISDEFAULT 列的值为 TRUE。
如果为任何自动优化的 SGA 参数指定了一个值,则查询 V$PARAMETER 时显示的值是为
该参数指定的值。
- 调整SGA_TARGET 的大小
• SGA_TARGET初始化参数:
– 是动态参数
– 最大可以增加到SGA_MAX_SIZE
– 可以缩小此参数,直到所有组件都达到最小
– 更改只影响自动调整大小的组件
• 包括SGA 中的所有部分:
– 固定SGA 和其它内部分配
– 自动调整大小的SGA 组件
– 手动SGA 组件
• 允许Oracle 服务器精确地调整总共享内存分配的大小
调整SGA_TARGET的大小
SGA_TARGET是动态参数,可以通过 DNT 或使用ALTER SYSTEM 命令进行更改。
SGA_TARGET最大可以增大到 SGA_MAX_SIZE的值。可以缩小此参数,直到任何一个自
动优化的组件都达到其最小大小:用户指定的最小值或内部确定的最小值。
如果增加 SGA_TARGET的值,则将根据自动优化策略在自动优化的组件之间分配附加的
内存。
如果减小 SGA_TARGET的值,则将按照自动优化策略从一个或多个自动优化的组件获取
内存。因此,SGA_TARGET的值中的任何更改只影响自动优化的组件大小。
例如,将 SGA_MAX_SIZE设置为 10 GB ,并将 SGA_TARGET设置为8 GB。如果将
DB_KEEP_CACHE_SIZE 设置为1 GB,并将 SGA_TARGET增加到9 GB,则只在
SGA_TARGET控制的组件之间分配附加的 1 GB。DB_KEEP_CACHE_SIZE 的值不受影响。
同样,如果将 SGA_TARGET减小到7 GB,则将只从 SGA_TARGET控制的组件获取 1 GB。
此减小操作不会更改明确设置的参数(例如 DB_KEEP_CACHE_SIZE )的最小值设置。
- 禁用自动管理共享内存
• 将SGA_TARGET设置为零会禁用自动优化。
• 将自动优化的参数设置为其当前大小。
• SGA 大小整体上不受影响。
禁用自动管理共享内存
可以通过将 SGA_TARGET设置为零,动态选择禁用自动管理共享内存。在这种情况下,
会将所有自动优化的参数的值设置为相应组件的当前大小,即使以前为自动优化的参数指
定了不同的非零值也是如此。
在本幻灯片的示例中,SGA_TARGET的值为8 GB,SHARED_POOL_SIZE 的值为1 GB。
如果系统在内部将共享池组件的大小调整为 1.5 GB ,然后将 SGA_TARGET设置为零,则
会使SHARED_POOL_SIZE 被设置为1.5 GB ,从而覆盖原来用户指定的值。
- 配置ASMM
配置自动管理共享内存
可以使用 DNT 配置自动管理共享内存,步骤如下所示:
• 单击“Administration(管理)”选项卡。
• 在“Database Configuration(数据库配置)”标题下选择“Memory Parameters(内存
参数)”。
• 单击“SGA ”选项卡。
• 单击“Automatic Shared Memory Management(自动管理共享内存)”的“Enable
(启用)”按钮,然后输入总的 SGA 大小(MB)。此大小代表为 SGA_TARGET指定
的值。
• 要禁用“Automatic Shared Memory Management(自动管理共享内存)”,请单击
“Disable(禁用)”。
在Oracle Database 10 g 版本2 中,自动管理共享内存的默认设置为“Enable (启用)”。
在“Memory Parameters(内存参数)”页上可以看到一个新的图表,用于显示 SGA 分配
的历史记录。可以将光标放在图表中您感兴趣的区域,以便在图表右侧突出显示图例中的
组件。
注:不会通过 EM 界面显示流池。
- SGA Advisor
SGA Advisor
SGA Advisor 显示如果指定了总的 SGA 大小,数据库时间方面可以得到的改善。在此示
例中,如果总的 SGA 大小增加到大约 470 MB,则数据库时间方面大约可以得到 5% 的
改善。
使用此指导可以减少设置 SGA 大小时反复试验的次数。
指导数据将存储在 V$SGA_TARGET_ADVICE 表中,包含下列值:
• SGA_SIZE :SGA 的大小
• SGA_SIZE_FACTOR:SGA_SIZE 与SGA 的当前大小的比率
• ESTD_DB_TIME:为此 SGA_SIZE 估计的DB_TIME
• ESTD_DB_TIME_FACTOR:ESTD_DB_TIME与SGA 当前大小的 DB_TIME的比率
• ESTD_PHYSICAL_READS:估计的物理读取数
注:数据库时间与“使用自动工作量资料档案库”课程中说明的“数据库时间”相同。数
据库时间包括执行操作的所有等待,在这种情况下,差异在于不同 SGA_TARGET大小所
需的读取数和写入数。
- 监视ASMM
监视自动管理共享内存,并使用下列视图检查所做的调整大小
决策:
• V$SGA_CURRENT_RESIZE_OPS:有关正在进行的调整
大小SGA 操作的信息
• V$SGA_RESIZE_OPS :包含最近800 个SGA 调整大小
请求的循环历史记录缓冲区
• V$SGA_DYNAMIC_COMPONENTS:所有内存组件的当前
状态
• V$SGA_DYNAMIC_FREE_MEMORY:有关以后的调整大小
操作可用的SGA 内存的信息
监视ASMM
下列视图提供有关动态 SGA 调整大小操作的信息:
• V$SGA_CURRE NT_RESIZE_OPS :有关当前正在进行的 SGA 调整大小操作的信息。
操作可以是增加或收缩动态 SGA 组件。
• V$SGA_RESIZE_OPS :有关最近完成的 800 个SGA 调整大小操作的信息。其中不
包括当前正在进行的任何操作。
• V$SGA_DYNAM IC_COMPONENTS :有关 SGA 中的动态组件的信息。此视图基于启
动后完成的所有 SGA 调整大小操作汇总信息。
• V$SGA_DYNAM IC_FREE_MEMORY:有关以后的动态 SGA 调整大小操作可用的 SGA
内存量的信息。
注:有关这些视图的详细信息,请参阅《Oracle Database Reference 》指南。
- 小结
• 启用EM 内存参数
• 设置自动优化的内存参数
• 设置手动优化的SGA 参数
• 使用SGA Advisor 设置SGA_TARGET