第四章 内存管理
Redo Buffers指日志缓冲区分配的内存大小,这个参数通常比log_buffers参数设置略大。这是因为Log Buffer并非按照数据块大小分配,在内存中通常需要设置保护页对Log Buffer进行保护。
当前SGA的分配和使用的具体信息还可以通过V$SGASTAT视图查询。
SQL> select * from v$sgastat;
可以看到,v$sgastat中显示的shared pool大小和shared_pool_size设置的不同,这是因为在共享池内存的分配和使用过程中会存在一定量的额外消耗,这部分内存在Oracle 10g中被单独列出:
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_.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 Statistics和Plan Execution Statistics信息不收集外,其他信息都被收集。其中Buffer Cache Advice受db_cache_advice参数独立控制,Timed Statistics受timed_statistics参数独立控制,其他统计信息的收集都受到STATISTICS_LEVEL参数的控制。
当修改STATISTICS_LEVEL为Basic时,可以看到除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,在修改系统参数时需要获取该锁定。
Oracle 10g自动共享内存管理
Oracle 10g使用一个新的初始化参数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_SIZE的cache
Keep/Recycle Buffer Cache
Redo Log Buffer
Stream Pool
自动共享内存管理引入了一个新的后台进程MMAN(Memory Manager)。该进程用于动态调整内存组件,动态调整的依据来自系统不间断收集的内存建议。
Select pid,spid,program from v$process;
操作系统上进程的PID号对应数据库中V$PROCESS的SPID,因此,V$PROCESS视图实际上是从操作系统到数据库的一个接口,可以通过V$PROCESS把操作系统合数据库联系起来。
如果不想使用自动共享内存管理的新特性,Oracle也允许使用手工管理,只需要简单地将SGA_TARGET参数设置为0,Oracle就会回到手工管理的模式,当前的各内存组件值会被计入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 内存自动管理功能,该参数有两个选项AUTO和MANUAL,当设置为AUTO时,数据库使用Oracle 9i提供的自动PGA管理功能,当设置为MANUAL时,则仍然使用Oracle 9i前手工管理的方式。
需要注意的是,在9i中,PGA_AGGREGATE_TARGET参数仅对专用服务器模式下的专属连接有效,但是对共享服务器连接无效;从Oracle 10g开始,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参数评估在sort、hash_join或bitmap操作时能使用的最大或最小内存,从而选择最优的执行计划。
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数据库在系统占用的内存分为两个部分:SGA和PGA。根据Oracle的建议,Oracle 最多可以使用80%的物理内存,其余20%保留给操作系统使用,在这80%的内存中,对于OLTP系统,Oracle建议分配20%给PGA使用;对于DSS系统,可以分配50%给PGA使用。
在为Oracle规划内存使用时,必须清楚,如果Oracle耗用的内存过高,设置超过了系统的物理内存,那么系统的性能就会受到严重的影响,当系统执行任务时,如果没有足够的内存,那么系统就会进行分页或交换,以完成当前活动事务。
当系统执行分页时,会将当前没有使用的信息从内存转移到硬盘上,这样就可以为当前需要内存的程序分配内存。如果频繁发生分页,系统性能就会严重下降,从而导致很多程序的执行时间变长。
当系统执行交换时,会将某些进程所分配的不活跃内存页(根据LRU算法)从内存转移到硬盘上,这样另一个活动进程就可以得到需要的内存。交换基于系统循环时间,如果交换过于频繁,系统甚至会出现当机。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15203236/viewspace-600399/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15203236/viewspace-600399/