自动管理共享内存的优点
自动管理共享内存的优点 自动管理共享内存 (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_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 池、