`

oracle自动共享内存管理(ASMM)

 
阅读更多
oracle自动共享内存管理(ASMM)

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

比如,假设某个系统,白天属于OLTP应用,因此会需要较多的buffer cache。而该系统在晚上属于DSS应用。对于DSS应用,很多的SQL语句由于都是进行全表扫描,因此都会采取并行方式完成。我们知道,并行时需要靠若干的从属进程完成工作,而从属进程会从large pool中进行分配。于是,晚上会需要较多的large pool。如果我们启用了ASMM,则数据库会根据负载的变化而自动的对内存大小进行调整,就不需要DBA进行手工调整了。

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手工进行调整。

举例来说,假设我们将sga_target设置为500MB,表示SGA总容量为500MB。但是如果我们需要配置100MB的keep buffer cache,则必须手工设置参数db_keep_cache_size为100MB。同时如果设置参数log_buffer为3MB,那么shared pool、buffer cache等可以调整的5个部分的总容量就是397MB(500-100-3=397)。

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

为了实现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以下。

实际上,为了使用ASMM,Oracle为这5个可自动调整的组件又提供了5个控制它们大小尺寸的参数,以“__”(两个下画线开头)。我们把当前的spfile导出到pfile里。

SQL> create pfile='/u01/init.ora' from spfile;

SQL> !vi /u01/init.ora

打开该pfile以后,我们会发现文件的前5行,会显示如下的内容(具体值可能不一样):

ora10g.__db_cache_size=134217728

ora10g.__java_pool_size=4194304

ora10g.__large_pool_size=4194304

ora10g.__shared_pool_size=62914560

ora10g.__streams_pool_size=0

可以看到,这5个初始化参数都以“__”开头,后面的部分与我们手工设置内存池大小的参数相同。比如__db_cache_size与 db_cache_size对应等。这种以“_”开头的参数我们叫做隐藏参数。所谓隐藏参数,就是没有官方文档对其含义进行说明的参数。这种参数会根据版本的不同而发生改变。这5个隐藏参数(比如__shared_pool_size)由MMAN进程负责修改,而与之相对应的其他参数(比如 shared_pool_size)则由DBA进行设定。因此,当我们启动数据库时,数据库内核会在初始化参数__shared_pool_size与 shared_pool_size之间进行比较。如果shared_pool_size没有设定,或设定为0,或设定的值比 __shared_pool_size小,则以MMAN自动调整的值来设置内存池的尺寸。否则,以DBA设定的值来设置内存池的尺寸 如果我们在数据库运行过程中,修改了某个可自动调整的内存池的大小,这时会怎么样?如果我们设置的值比MMAN自动调整出来的值要大,则该内存池立即调整为设定的值的大小,同时我们所设定的值作为MMAN新的、自动调整的最小值;反之,如果设置的值比MMAN自动调整出来的值要小,则该内存池的大小不会变化,而我们所设置的值则只作为自动调整的最小值存在。比如,当前MMAN自动调整出来的shared pool大小为150MB,也就是__shared_pool_size为150MB,同时shared_pool_size为60MB。这时,如果我们将参数shared_pool_size从60MB设置为100MB的话,则shared pool的大小仍然为150MB,但是新设置的100MB将作为自动调整时的下限;如果我们将参数shared_pool_size从60MB设置为 200MB,则shared pool立即扩张,从150MB扩张到200MB,同时200MB也将作为自动调整的新的下限。

我们来验证一下。视图v$sga_dynamic_components里记录了能够动态调整的各个内存池的大小。

SQL> SELECT component, current_size/1024/1024 size_mb
2 FROM v$sga_dynamic_components where comp;

COMPONENT SIZE_MB
------------------------------------ ------------
shared pool 80

当前MMAN自动调整出来的shared pool大小为80MB。

SQL> alter system set shared_pool_size=70M;
SQL> SELECT component, current_size/1024/1024 size_mb
2 FROM v$sga_dynamic_components where comp;

COMPONENT SIZE_MB
------------------------------------ ------------
shared pool 80

我们将shared_pool_size设定为70MB,小于自动调整出来的值。可以看到,shared pool没有缩小,仍然是80MB。我们再将其从80MB扩大到100MB。

SQL> alter system set shared_pool_size=100M;
SQL> SELECT component, current_size/1024/1024 size_mb
2 FROM v$sga_dynamic_components where comp;

COMPONENT SIZE_MB
------------------------------------ ------------
shared pool 100

显然,只要我们设定的值比自动调整出来的值大,就会立即生效。
同时,如果当前我们启用了ASMM,同时并没有为这5个可以自动调整的内存池参数指定具体的值。当数据库在ASMM状态下运行一段时间以后,我们再禁用ASMM,会发生什么?我们来看下面的试验。

SQL> select name,value from v$parameter
2 where name in('shared_pool_size','db_cache_size','
java_pool_size','large_pool_size',' streams_pool_size');

NAME VALUE
-------------------- --------------
shared_pool_size 96468992
large_pool_size 0
java_pool_size 0
streams_pool_size 0
db_cache_size 0

可以看到,除了shared pool为DBA指定以外(因为shared_pool_size大于0),其他的内存池都由ASMM指定。

SQL> select component, current_size FROM v$sga_dynamic_
components 2 where component like '%pool' or comp;

COMPONENT SIZE_MB
---------------------------------- -----------
shared pool 138412032
large pool 4194304
java pool 4194304
streams pool 0
DEF***T buffer cache 373293056
我们看到,ASMM根据当前的负载情况,为这5个内存池指定了大小。

SQL> alter system set sga_target=0;
SQL> select name,value from v$parameter
2 where name in('shared_pool_size','db_cache_size','
java_pool_size','large_pool_size',' streams_pool_size');

NAME VALUE
-------------------- --------------
shared_pool_size 138412032
large_pool_size 4194304
java_pool_size 4194304
streams_pool_size 0
db_cache_size 373293056

当我们将sga_target设置为0,从而禁用ASMM时,会发现,Oracle会自动将当前内存池的大小赋给对应的初始化参数(shared_pool_size、db_cache_size等)。同时我们也可以注意到,shared_pool_size的值也不再是DBA当时指定的96468992,而是被ASMM自动调整出来的138412032所覆盖。
分享到:
评论

相关推荐

    Oracle自动内存管理ASMM

    ASMM管理的SGA内存组件包括但不限于: - **Buffer Cache**:数据库缓冲区高速缓存,用于存储数据块; - **Shared Pool**:包含SQL语句的共享数据结构和执行计划; - **Large Pool**:供数据库内部进程使用的大型内存...

    深入了解oracle自动内存管理asmm

    Oracle数据库中的自动共享内存管理(Automatic Shared Memory Management,简称ASMM)自10g版本推出以来,一直是数据库管理员(DBA)关注的焦点之一。ASMM旨在通过自动化的方式管理和调整共享内存区域(SGA),从而...

    oracle内存管理,深入浅出oracle内存管理,盖国强oracleppt

    4. **内存管理的变迁**:Oracle内存管理经历了从早期的静态分配到动态调整,再到自动共享内存管理(ASMM)和自动内存管理(AMM)的演变。AMM使得数据库能够自动管理SGA和PGA,简化了管理员的工作。 5. **Shared ...

    Oracle内存分配与调整--大牛冯春培的一篇文章

    - **内存自动管理**:自Oracle 10g起引入了自动SGA管理特性(Automatic Shared Memory Management, ASMM),可以通过设置`memory_target`参数启用ASMM,让Oracle自动调整SGA各部分的大小。 - **监控与调优**:利用...

    Oracle智能化内存管理特性与配置方法.pdf

    SGA是Oracle数据库的核心组成部分,它是一个共享内存区域,包含了数据缓冲区、重做日志缓冲区、共享池、Java池和大型池等多个子组件。数据缓冲区存储从磁盘读取的数据块,减少对磁盘I/O的依赖;重做日志缓冲区则用于...

    Oracle 10g 内存 调整报告

    这些区域共同构成了Oracle实例的共享内存空间。 - **Shared Pool**: 存储共享SQL语句、PL/SQL代码等。包括Library Cache、Dictionary Cache等。 - **Buffer Cache**: 用于缓存数据块,分为Default Buffer Cache、...

    Oracle启用大页内存.docx

    2. **Automatic Shared Memory Management (ASMM)**: 自动共享内存管理,Oracle 11g及以后版本引入的特性,自动调整SGA(System Global Area)组件的大小。 3. **Automatic Memory Management (AMM)**: 自动内存...

    oracle内存管理

    3. **自动共享内存管理(ASMM)**: 自动调整SGA中的各个组件大小。 4. **自动PGA内存管理(APMM)**: 动态调整PGA大小。 #### 四、示例分析 以下是一个启动Oracle数据库后的内存使用情况示例: ```sql SQL> startup ...

    Oracle 10g的内存调整报告

    除了上述通过自动机制管理的内存外,还有一些内存区域需要手动进行调整,例如: - **Log Buffer**:用于存储重做日志条目。 - **DB Keep Cache Size**:保持经常访问的数据库块在缓存中。 - **DB Recycle Cache ...

    Oracle数据库内存优化配置

    - SGA(System Global Area)是Oracle实例启动时为每一个进程分配的一组共享内存区域,包括上面提到的各个组成部分。合理设置SGA大小对于提升整体性能至关重要。 - 可以通过监控工具查看当前系统的负载情况,结合...

    Oracle数据库10g-对自我管理数据库进行管理2-P.pptx

    - 自动共享内存管理(Automatic Shared Memory Management, ASMM)自动调整SGA各个组成部分的大小,如DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE,以适应系统负载变化。 - **Automatic ...

    Oracle11g日常操作与维护手册.pdf

    - **4.6 内存参数管理**:Oracle提供了多种内存管理方法,如自动内存管理AMM和自动共享内存管理ASMM。 - **4.7 其他管理内容**:包括数据库版本查看、字符集设置、密码文件创建、审计功能关闭、账号管理、Profile...

    Oracle数据库系统工程师培训(内存结构、物理结构、备份和恢复、安全审计、性能调优)

    - 考虑使用高级内存管理特性,如自动共享内存管理(ASMM)。 4. **硬件优化**: - 根据数据库负载选择合适的硬件配置。 - 考虑使用SSD等高速存储设备以提高I/O性能。 通过以上详细的介绍,我们可以看到Oracle...

    Oracle11.2.0.4资源地址

    支持自动内存管理(AMM)、自动共享内存管理(ASMM)等功能,可以根据实际负载动态调整资源分配,确保系统稳定运行。 3. **高可用性**:引入了多种技术来提升系统的可用性,包括Data Guard、RAC (Real Application ...

    Oracle11g_新特性及常用维护工具详解

    **2.1 Oracle11g自动共享内存管理(ASMM)** - **2.1.1 SGA自动调整原理** 自动共享内存管理(ASMM)允许数据库自动调整系统全局区(SGA)和程序全局区(PGA)的大小。这种动态调整机制可以根据当前负载情况自动优化内存...

    Oracle-DSI.rar_Oracle-DSI_oracle_oracle dsi_oracle pdf

    4. **Automatic Shared Memory Management (ASMM)**:Oracle 11gR2引入了ASMM,自动管理共享内存区,减少了手动调整内存参数的需要。 5. **Enhanced Index Compression (EIC)**:增强型索引压缩提高了索引存储效率...

Global site tag (gtag.js) - Google Analytics