分享

深入浅出Oracle学习笔记(4)

 cinnamon 2011-10-09

第四章      内存管理

 Redo Buffers指日志缓冲区分配的内存大小,这个参数通常比log_buffers参数设置略大。这是因为Log Buffer并非按照数据块大小分配,在内存中通常需要设置保护页对Log Buffer进行保护。

当前SGA的分配和使用的具体信息还可以通过V$SGASTAT视图查询。

SQL> select * from v$sgastat;

可以看到,v$sgastat中显示的shared pool大小和shared_pool_size设置的不同,这是因为在共享池内存的分配和使用过程中会存在一定量的额外消耗,这部分内存在Oracle10g中被单独列出:

SQL> select * from v$sgainfo;

NAME                                    BYTES                RESIZEABLE

Startup overhead in Shared Pool                46137344                             NO

 

SGA的设置在Linux/UNIX上和一个操作系统内核参数有关,这个参数是shmmax

Shmmax内核参数定义的是系统允许的单个共享内存段的最大值,如果该参数设置小于Oracle SGA设置,那么SGA仍然可以创建成功,但是会被分配多个共享内存段,通常推荐通过调整shmmax设置,将SGA限制在一个共享内存段中。

使用ipcs命令来查看系统设置下共享内存的分配。

 

如果没有修改shmmax参数,Oracle在启动过程中就会在alert_<sid>.log文件中记录以下警告:

WARNNING:EINVAL creating segment of size 0x000000000……

Fix shm parameters in /etc/system or equivalent

 

Oracle 9i动态SGA管理:

Oracle 9i中,可以设置SGA_MAX_SIZE,该参数用以控制各缓冲池使用的内存总和,本质上是在进程中预先分配一段虚拟地址备用而不分配物理内存,目的是防止和进城私有地址段的冲突。

只要总的SGA内存设置不超过SGA_MAX_SIZE的设置,更改都可以立即生效。需要注意的是,在Oracle 9iR1中,动态减小内存设置会触发一些Bug

当在动态修改内存参数时,需要注意:

--修改的内存大小必须是粒度大小的整数倍,否则会自动向上取整;

--SGA的总大小不能超过SGA_MAX_SIZE

 

伴随动态SGA管理的新特性,Oracle推出了一系列内存设置建议功能,同时引入了一系列动态性能视图:

SQL> select tname from tab

 2 where tname like '%ADVICE%';

 

TNAME

------------------------------

GV_$DB_CACHE_ADVICE

GV_$MTTR_TARGET_ADVICE

GV_$PGATARGET_ADVICE_HISTOGRAM

GV_$PGA_TARGET_ADVICE

GV_$SHARED_POOL_ADVICE

V_$DB_CACHE_ADVICE

V_$MTTR_TARGET_ADVICE

V_$PGA_TARGET_ADVICE

V_$PGA_TARGET_ADVICE_HISTOGRAM

V_$SHARED_POOL_ADVICE

 

缓冲区高速缓存建议受初始化参数DB_CACHE_ADVICE控制,该参数为动态参数,可用的值有:

OFF:关闭建议并且不为建议分配内存;

ON:开启建议并且CPU和内存开销都会发生;

READY:关闭建议但是仍然保存为建议分配的内存。

SQL> show parameter db_cache_advice

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

db_cache_advice                     string     ON

 

SQL> select id,name,block_size,size_for_estimate sfe,size_factor sf,

 2 estd_physical_read_factor eprf,estd_physical_reads epr

 3 from v$db_cache_advice;

       ID NAME      BLOCK_SIZE       SFE        SF      EPRF       EPR

---------- ---------- ---------- ---------- ---------- ---------- ----------

        3 DEFAULT         8192         4     .1667    2.6591      7945

        3 DEFAULT         8192         8     .3333    2.0114      6010

        3 DEFAULT         8192        12        .5    1.4886      4448

        3 DEFAULT         8192        16     .6667    1.0398      3107

        3 DEFAULT         8192        20     .8333    1.0057      3005

        3 DEFAULT         8192        24         1         1      2988

        3 DEFAULT         8192        28    1.1667         1      2988

        3 DEFAULT         8192        32    1.3333         1      2988

        3 DEFAULT         8192        36       1.5         1      2988

        3 DEFAULT         8192        40    1.6667         1      2988

        3 DEFAULT         8192        44    1.8333         1      2988

 

       ID NAME      BLOCK_SIZE       SFE        SF      EPRF       EPR

---------- ---------- ---------- ---------- ---------- ---------- ----------

        3 DEFAULT         8192        48         2         1      2988

        3 DEFAULT         8192        52    2.1667         1      2988

        3 DEFAULT         8192        56    2.3333         1      2988

        3 DEFAULT         8192        60       2.5         1      2988

        3 DEFAULT         8192        64    2.6667         1      2988

        3 DEFAULT         8192        68    2.8333         1      2988

        3 DEFAULT         8192        72         3         1      2988

        3 DEFAULT         8192        76    3.1667         1      2988

        3 DEFAULT         8192        80    3.3333         1      2988

可以看到,伴随db_cache_size的增大,估计的物理读(estd_physical_reads)在逐渐减少。我们的选择基于db_cache_size的设置和physical_reads,使用可以接受的内存设置,获得尽可能低的物理读。

 

对于shared pool的建议,受到初始化参数STATISTICS_LEVEL的影响,该参数有三个选项:

BASIC:收集基本的统计信息;

TYPICAL:收集大部分的统计信息,这是系统的缺省设置;

ALL:收集全部的统计信息。

可以通过v$statistics_level视图来查看该参数的影响范围:

SQL> select STATISTICS_NAME,SESSION_STATUS,SYSTEM_STATUS,

 2 ACTIVATION_LEVEL,SESSION_SETTABLE from v$statistics_level;

STATISTICS_NAME                    SESSION_ SYSTEM_S ACTIVAT SES

----------------------------------- -------- -------- ------- ---

Buffer Cache Advice                ENABLED ENABLED TYPICAL NO

MTTR Advice                        ENABLED ENABLED TYPICAL NO

Timed Statistics                   ENABLED ENABLED TYPICAL YES

Timed OS Statistics                DISABLED DISABLED ALL    YES

Segment Level Statistics           ENABLED ENABLED TYPICAL NO

PGA Advice                         ENABLED ENABLED TYPICAL NO

Plan Execution Statistics          DISABLED DISABLED ALL    YES

Shared Pool Advice                 ENABLED ENABLED TYPICAL NO

 

可以看到,在TYPICAL设置下,除Timed OS StatisticsPlan Execution Statistics信息不收集外,其他信息都被收集。其中Buffer Cache Advicedb_cache_advice参数独立控制,Timed Statisticstimed_statistics参数独立控制,其他统计信息的收集都受到STATISTICS_LEVEL参数的控制。

 

当修改STATISTICS_LEVELBasic时,可以看到除Timed Statistics外,其他信息收集都被禁止。

SQL> alter system set statistics_level=basic;

系统已更改。

SQL> select STATISTICS_NAME,SESSION_STATUS,SYSTEM_STATUS,

 2 ACTIVATION_LEVEL,SESSION_SETTABLE from v$statistics_level;

STATISTICS_NAME                    SESSION_ SYSTEM_S ACTIVAT SES

----------------------------------- -------- -------- ------- ---

Buffer Cache Advice                DISABLED DISABLED TYPICAL NO

MTTR Advice                        DISABLED DISABLED TYPICAL NO

Timed Statistics                   ENABLED ENABLED TYPICAL YES

Timed OS Statistics                DISABLED DISABLED ALL    YES

Segment Level Statistics           DISABLED DISABLED TYPICAL NO

PGA Advice                         DISABLED DISABLED TYPICAL NO

Plan Execution Statistics          DISABLED DISABLED ALL    YES

Shared Pool Advice                 DISABLED DISABLED TYPICAL NO

 

当进行动态参数修改时,修改session会处于等待状态,等待事件为background parameter adjustment

SQL> select sid,seq#,event,seconds_in_wait,state

 2 from v$session_wait where sid=60;

v$lock视图中,可以获得相关锁定信息:

SQL> select * from v$lock where sid=60;

锁定类型为PE,即Kernel Service system Parameter Enqueue,在修改系统参数时需要获取该锁定。

 

Oracle10g自动共享内存管理

Oracle10g使用一个新的初始化参数SGA_TARGET,该参数是个动态参数,其值不能超过SGA_MAX_SIZE参数的设置。并非所有的SGA组件都可以自动调整,通过指定这个参数,可以自动分配的内存包括:

Buffer Cache

Shared Pool

Java Pool

Large Pool

 

启用自动共享内存管理,可以估算一个SGA的总大小,然后设置SGA_TARGET参数为非零值,Oracle将启用自动共享内存管理。自动共享内存管理需要STATISTICS_LEVEL参数设置为TYPICAL或者ALL

Oracle服务器根据系统运行的情况自动调整这些内存的大小,并记录在spfile中,进程重新启动时,不会丢失之前的调整结果。

 

以下几个初始化参数还是需要手工配置的:

非标准BLOCK_SIZEcache

Keep/Recycle Buffer Cache

Redo Log Buffer

Stream Pool

 

自动共享内存管理引入了一个新的后台进程MMANMemory Manager)。该进程用于动态调整内存组件,动态调整的依据来自系统不间断收集的内存建议。

 

Select pid,spid,program from v$process;

操作系统上进程的PID号对应数据库V$PROCESSSPID,因此,V$PROCESS视图实际上是从操作系统到数据库的一个接口,可以通过V$PROCESS把操作系统合数据库联系起来。

 

如果不想使用自动共享内存管理的新特性,Oracle也允许使用手工管理,只需要简单地将SGA_TARGET参数设置为0Oracle就会回到手工管理的模式,当前的各内存组件值会被计入spfile,作为手工管理的初始值使用。

 

PGA管理

PGA指的是程序全局区(Program Global Area),是服务器进程使用的一块包含数据和控制信息的内存区域,PGA是非共享的内存,在服务器进程启动或创建时分配(在系统运行时,排序、连接等操作页可能需要进一步的PGA分配),并为服务器进程排他访问。PGA的内容依专用模式和共享服务器模式而不同,但是通常来说,PGA中包含私有SQL区(存放绑定信息、运行时内存结构等)和session信息等内容。

 

所有服务器进程分配的PGA总和被称为PGA合计。在Oracle 9i以前的版本中,PGA由一系列的内存区域组成,这些区域包括主要由*_area_size参数控制。

Oracle 8i的环境中,这些参数主要有:

Sort_area_size

hash_area_size

bitmap_merge_size

create_bitmap_area_size

 

Oracle 9i开始,Oracle提供了自动PGA内存管理:

PGA_AGGREGATE_TARGET:此参数用来指定所有的session总计可以使用的最大PGA内存,这个参数可以被动态更改,取值范围从10M~(4096G-1)bytes

WORKAREA_SIZE_POLICY:此参数用于开关PGA内存自动管理功能,该参数有两个选项AUTOMANUAL,当设置为AUTO时,数据库使用Oracle 9i提供的自动PGA管理功能,当设置为MANUAL时,则仍然使用Oracle 9i前手工管理的方式。

需要注意的是,在9i中,PGA_AGGREGATE_TARGET参数仅对专用服务器模式下的专属连接有效,但是对共享服务器连接无效;从Oracle10g开始,PGA_AGGREGATE_TARGET对专用服务器和共享服务器连接同时生效。

PGA_AGGREGATE_TARGET参数同时限制全局PGA分配和私有工作区内存分配:

对于串行操作,单个SQL操作能够使用的PGA内存按照以下原则分配:

MIN(5%PGA_AGGREGATE_TARGET,100M)

对于并行操作:

30%PGA_AGGREGATE_TARGET/DOP    (DOP=Degree Of Parallelism 并行度)

要理解PGA的自动调整,还要区分可调整内存(TUNABLE MEMORY SIZE)与不可调整内存(UNTUNABLE MEMORY SIZE)。可调整内存是由SQL工作区使用的,其余部分都是不可调整内存。

启用了自动PGA调整之后,Oracle仍然需要遵循以下原则:

UNTUNABLE MEMORY SIZE+ TUNABLE MEMORY SIZE<=PGA_AGGREGATE_TARGET

PGA_AGGREGATE_TARGET参数在CBO优化器模式下,对于SQL执行计划会产生影响。Oracle在评估执行计划时会根据PGA_AGGREGATE_TARGET参数评估在sorthash_joinbitmap操作时能使用的最大或最小内存,从而选择最优的执行计划。

V$PROCESS视图增加了相应字段用来记录进程的PGA耗用:

 

SQL在工作区中以3种方式执行:

Optimal(优化方式):指所有处理可以在内存中完成;

Onepass:大部分操作可以在内存中完成,但是需要使用到磁盘排序;

Multipass:大量操作需要产生磁盘交互,性能极差。

通常对于PGA的优化目标,就是使得Optimal的执行尽量高,也就是尽量在内存中完成所有排序等操作,同时使Multipass操作尽量低,也就是要磁盘交互尽量低。

也就是尽量实现如下目标:

Workarea execution-optimal>=90%

Workarea execution-multipass=0%

SQL> select name,value from v$sysstat

 2 where name like 'workarea executions%';

 

NAME                                                                 VALUE

---------------------------------------------------------------- ----------

workarea executions - optimal                                          766

workarea executions - onepass                                            0

workarea executions - multipass                                          0

 

 

Oracle的内存分配和使用

Oracle数据库在系统占用的内存分为两个部分:SGAPGA。根据Oracle的建议,Oracle最多可以使用80%的物理内存,其余20%保留给操作系统使用,在这80%的内存中,对于OLTP系统,Oracle建议分配20%PGA使用;对于DSS系统,可以分配50%PGA使用。

在为Oracle规划内存使用时,必须清楚,如果Oracle耗用的内存过高,设置超过了系统的物理内存,那么系统的性能就会受到严重的影响,当系统执行任务时,如果没有足够的内存,那么系统就会进行分页或交换,以完成当前活动事务。

当系统执行分页时,会将当前没有使用的信息从内存转移到硬盘上,这样就可以为当前需要内存的程序分配内存。如果频繁发生分页,系统性能就会严重下降,从而导致很多程序的执行时间变长。

当系统执行交换时,会将某些进程所分配的不活跃内存页(根据LRU算法)从内存转移到硬盘上,这样另一个活动进程就可以得到需要的内存。交换基于系统循环时间,如果交换过于频繁,系统甚至会出现当机。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多