ASMM自动共享内存管理:
自动根据工作量变化调整
最大程度地提高内存利用率
有助于消除内存不足的错误
SYS@PROD>show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 1G
sga_target big integer 1G
SYS@PROD>show parameter memory
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 0
memory_target big integer 0
shared_memory_address integer 0
SYS@PROD>show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 208M
ASMM 的工作原理 :
ASMM 以 MMON 在后台捕获的工作量信息为基础。
MMON 使用内存指导。
将内存移到 MMAN 最迫切需要的地方。
如果使用 SPFILE:在关闭时保存组件大小 、保存的值用于引导程序组件大小 、无需再确定最佳值
自动共享内存管理功能使用由以下两个后台进程实施的 SGA 内存中介:可管理性监视器 (MMON) 和内存管理器 (MMAN)。MMON 定期将统计信息和内存指导数据捕获到内存中。MMAN 根据 MMON 的决定调整内存组件的大小。SGA 内存中介会不断跟踪组件的大小和待处理的大小调整操作。
SGA 内存中介会观察系统和工作量,以便确定理想的内存分配方案。SGA 内存中介每隔几分钟就执行一次这种检查,使内存始终用在需要的地方。如果没有自动共享内存管理功能,必须分别预计各组件在峰值时的内存需求,然后对其内存大小进行调整。
在工作量信息基础上,自动共享内存管理功能会:
定期在后台捕获统计信息
使用内存指导
进行假设分析,确定最佳内存分配方案
将内存移到最迫切需要的地方
如果使用了 SPFILE,则在关闭时保存组件大小(这些大小可以在最后一次关闭前重新起用)
启用自动共享内存管理功能 :
要从手动共享内存管理模式下启用 ASMM,请执行以下操作:
1.获取 SGA_TARGET 的值:
SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET" FROM DUAL;
2.使用该值设置 SGA_TARGET。
3.将自动设置大小的 SGA 组件的值设置为 0。
要从自动内存管理模式切换到 ASMM,请执行以下操作:
1.将初始化参数 MEMORY_TARGET 设置为 0。
2.将自动设置大小的 SGA 组件的值设置为 0。
自动优化的 SGA 参数的行为:
未设置 SGA_TARGET 或将其设置为 0 时:
自动优化的参数指定相应组件的实际大小
、可能需要增加 SHARED_POOL_SIZE
SELECT SUM(bytes)/1024/1024 size_mb FROM v$sgastat WHERE pool = 'shared pool';
SGA_TARGET 设置为非零值时:
自动优化的参数的默认值为零 、指定的值用作下限大小
SELECT component, current_size/1024/1024 size_mb FROM v$sga_dynamic_components;
手动优化的 SGA 参数的行为:
有些组件不能自动优化。
--DB_KEEP_CACHE_SIZE 和 DB_RECYCLE_CACHE_SIZE
--非标准块大小的缓冲区高速缓存,DB_nK_CACHE_SIZE
--
LOG_BUFFER
这些组件必须使用数据库参数手动配置。
这些组件使用的内存会减少可用于自动优化 SGA 的内存量。
修改 SGA_TARGET 参数 :
--是动态参数
--
最多可增大到 SGA_MAX_SIZE
--可以减小,直到所有组件都达到其下限大小为止
更改 SGA_TARGET 的值只会影响自动调整大小的组件
SGA_TARGET 是一个动态参数,可以通过 Database Control 或使用 ALTER SYSTEM 命令更改。
GA_MAX_SIZE 是可分配给 SGA 的内存量的上限。更改该值后,必须重新启动数据库才能生效。SGA_TARGET 最多可增大到 SGA_MAX_SIZE 值。它可以减小,直到任一自动优化的组件达到其下限大小:用户指定的下限值或内部确定的下限值。
如果增大 SGA_TARGET 的值,则会根据自动优化策略在自动优化的组件之间分配增加的那部分内存。
如果减小 SGA_TARGET 的值,则这部分内存将按照自动优化策略从一个或多个自动优化的组件处提取。
假定 SGA_MAX_SIZE 设置为 10 GB,SGA_TARGET 设置为 8 GB。如果 DB_KEEP_CACHE_SIZE 设置为 1 GB,并且将 SGA_TARGET 增大为 9 GB,则增加的 1 GB 只会在 SGA_TARGET 控制的组件之间进行分配。DB_KEEP_CACHE_SIZE 的值不受影响。同样,如果将 SGA_TARGET 减小到 7 GB,则这 1 GB 也只会从 SGA_TARGET 控制的那些组件中提取。这种减少并不会影响手动控制的参数(如 DB_KEEP_CACHE_SIZE)的设置。
禁用 ASMM :
将 SGA_TARGET 设置为 0 可禁用自动优化功能。
自动优化的参数设置为其当前大小。
SGA 大小总体上不受影响。
eg:
SGA_TARGET 的值为 8 GB,SHARED_POOL_SIZE 的值为 1 GB。如果系统将共享池组件的大小内部调整为 2 GB,则将 SGA_TARGET 设置为 0 会导致 SHARED_POOL_SIZE 被设置为 2 GB,从而覆盖用户定义的原始值。
手动调整动态 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