专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

Oracle体系结构之服务器结构(五)--oracle内存结构--ASMM

ins518 2024-10-15 13:12:16 技术文章 14 ℃ 0 评论

自动共享管理内存 ASMM

1.ASMM 的作用

从 Oracle 10g 开始,Oracle 提供了自动 SGA 的管理(简称 ASMM,Automatic SharedMemory Management)新特性。所谓 ASMM,就是指我们不再需要手工设置 shared pool、buffer pool 等若干内存池的大小,而是为 SGA 设置一个总的大小尺寸即可。Oracle 数据库会根据系统负载变化,自动调整各组件的大小,从而使得内存始终能够流向最需要它的地方。

例如,假设某个系统在上午 10:00 到下午 9:00 属于 OLTP 应用,因而可能会用到多的 BUFFER CACHE;而下午 9:00 到上午 10:00 属于 OLAP 系统,可能会用到较大的 SHARED POOL 和 LARGE POOL。如果我们启用了 ASMM,数据库就会根据负载的变化而自动对内存大小进行调整,就不需要数据库管理员手工进行调整了。

2.如何使用 ASMM

Oracle 10g 提供了一个新的初始化参数:sga_target 来启动 ASMM,该参数定义了个 SGA 的总容量。同时,初始化参数 statistics_level 必须设置为 typical 或 all 才能启动ASMM,否则如果设置为 basic,则关闭 ASMM。

ASMM只能自动调整5 个内存池的大小,它们是:shared pool、buffer cache、large pool、java pool 和 stream pool 。 我 们 不 再 需 要 设 置 shared_pool_size 、 db_cache_size 、large_pool_size、 java_pool_size、streams_pool_size 这五个初始化参数。而其他的内存池,比如 log buffer、keep buffer cache 等仍然需要 DBA 手工进行调整。

Oracle 10g 还提供了另一个初始化参数 sga_max_size。sga_target 的值不能超sga_max_size 的值,修改 sga_max_size 时,必须重启实例才能生效,而 sga_target 则可以在线修改,立即生效,无须重启实例。

3.ASMM 的原理

为了实现 ASMM,Oracle 新引入了一个名为 MMAN(Memory Manager)的后台进程。每隔很短的一段时间,MMAN 进程就会启动,然后去询问一下 Oracle 提供的各个内存组件顾问,比如有 buffer cache 顾问,也有 shared pool 顾问,由这些顾问根据当前的负载情况将这 5 个可以自动调整的内存池的、建议的大小尺寸,返回给 MMAN。于是,MMAN 进程就会根据该返回的值,来设置各个内存池。同时,如果我们使用了 spfile,还会将这些顾问得出的建议值写入 spfile 里。这样,下次启动实例时,就可以直接把顾问得出的建议值拿来作为启动内存池的依据了。

如果我们启用了 ASMM,同时又手工设置了可以自动调整大小的内存池的尺寸,比如设置了参数 shared_pool_size 为一个非 0 值的时候,会怎么样?对于 Oracle 10g 来说,我们为自动调整大小的内存组件设置了值,则会以我们设置的值作为自动调整的最小值。也是说,假设 sga_target 为 4GB,而我们将 shared_pool_size 设置为 600MB,则 MMAN 在进行自动调整时,永远不会将 shared pool 设置为 600MB 以下。

4.11g 中的 ASMM

在 Oracle11g 数据库中,使用自动内存管理特性不再需要设定参数 SGA_TARGET 和PGA_AGGREGATE_TARGET,,因为这两个参数都已经被修改成自动调优的,除非想指定PGA 和 SGA 的最小值才需要设定这两个参数。

在 Oracle11g 数据库中,则需要设置一个叫做 MEMORY_TARGET 的初始化参数,这个参数是指整个 Oracle 实例所能使用的内存大小,包括 PGA 和 SGA 的整体大小,在MEMORY_TARGET 的内存大小之内,PGA 和 SGA 所用的内存可以根据当前负载情况自动相互转换。

如果当初始设定的 MEMORY_TARGET 的内存不够当前数据库使用的时候,Oracle11g还提供了另外一个初始化参数 MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态 调节 MEMORY_TARGET 的大小,但是不允许超过 MEMORY_MAX_TARGET 的值。下面这张图简单明了的描述出了 Oracle11g 数据库内存大小的设定参数。


写在最后的话

感谢各位的支持与阅读,后续会继续推送相关知识和交流,欢迎交流、转发和关注,感谢!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表