当前位置:首页 期刊杂志

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

时间:2024-05-04

王文娟,王润中

(1.广州南洋理工职业学院,广州510900;2.Northern Alberta Institute of Technology,加拿大)

0 引言

以Oracle 数据库产品享誉全球的Oracle 公司,在2013 年后成为继Microsoft 后全球第二大软件公司,而其中的数据库产品Oracle 11g,又以其自动内存管理被认为是内存走向智能化的重要管理阶段,是数据库软件发展的一个里程碑。Oracle 从可占OS 系统内存的1/3 到1/2,直到占用80%的内存,如此高占比物理内存促使我们有必要在校企合作实训实验中探讨Oracle 的内存管理。根据工作负载情况,通过对SGA 和PGA 监测,在多种内存管理方式下选择不同的内存管理方式并进行各种参数进行设置,并充分利用其智能化内存管理特性,使得数据库性能达到最优。

1 Oracle的内存概览

在装有Oracle 数据库的计算机上,其内存主要由SGA、PGA 和UGA 组成,如图1 所示,通常讲的Oracle的内存管理,主要是对SGA 和PGA 这两部分区域进行管理。

当Oracle 启动时,首先使用的是静态内存管理,此时的内存是按照SGA 内预先配置好参数进行内在分配;当实例启动时,Oracle 会自动分配SGA,当关闭例程时,Oracle 会自动释放SGA 所占用的空间;PGA 是在服务器进程启动或创建时分配,并为服务器进程所专用;UGA 则是为用户进程存储会话状态的。

图1 Oracle内存结构

自动管理模式是在Oracle 9i 开始引入的,先是PGA 自动管理,SGA 仍为手动管理;在10g 时Oracle 推出了ASMM,实现了SGA 和PGA 内部结构的自调节,即PGA 和SGA 均为自动管理;进入11g 之后,自动内存管理AMM 实现对SGA 和PGA 的规划全部统筹,因而AMM 成为数据库发展中的重要部分,这种对PGA和SGA 统一进行自动管理,从某种程度上来说内存管理逐渐的走向智能化。

1.1 系统全局区SGA的管理

SGA(System Global Area)是用于加载数据、对象并保存运行状态和数据库控制信息的一块内存区域,在数据库实例启动时进行分配,大小通常SGA 与操作系统、内存大小、CPU、同时登录的用户数有关;在数据库运行过程中,内存大小可以在线修改与自动配置,这便是动态内存管理。

SGA 是一个共享的内存结构,每个实例都有自己的SGA 区。当多个用户并发地连接到同一个实例后,这些用户将共享此实例SGA 中的数据。图2 是SGA的基本内存结构,除了数据高速缓冲区(Data Buffer Cache)、重做日志缓冲区(Redo Log Buffer)、共享池(Shared Pool)、Java 池(Java Pool)、大型池(Large Pool)外,还包括三个子缓冲区:保留缓冲区、循环缓冲区和非标准大小块缓冲区。

图2 SGA内存结构

Oracle 支持动态SGA 特性,无需关闭实例,在无DBA 的干预的情况下,根据系统上的工作负载,就可以自动调整数据高速缓冲区、共享池和大型池的大小。池可以进行扩展也可以进行缩小,前者是为满足自身增长需求,后者则是满足其他池的扩展需求。

1.2 管理方法

Oracle 从Oracle 9i 开始支持动态SGA 特性。ASMM(Automatic Shared Memory Management)的主要工作是让DBA 不再需要手工设置shared pool、buffer pool 等若干内存池的大小,而AMM 的引入,则使得Oracle 内存管理更加灵活多样,组合出来有5 种内存管理形式,即自动内存管理,自动共享内存管理,手工共享内存管理,自动PGA(Program Global Area)管理,手动PGA 管理方式。单击“自动内存管理”禁用按钮,并选择“启用自动共享内存管理”,DBA 可以在此页中使数据库自动设置下的各SGA 组件的内存达到最佳分配方式。如此实现AMM 和ASMM 的切换,从而实现内存多种管理方式,具体内存管理方式设置见表1 内存管理方式设置表。

如果指定了MEMORY_TARGET 没有指定MEMORY_MAX_TARGET,重启后MEMORY_MAX_TARGET=MEMORY_TARGET。如果指定了MEMORY_MAX_TARGET 而没有指定MEMORY_TARGET,重启后MEMORY_TARGET 为0。

表1 内存管理方式设置表

1.3 参数设置

Oracle 10g 引入sga_target,可以自动对SGA 进行调整,且SGA 的总大小不能超过初始化参数SGA_MAX_SIZE 的设置,具体命令如下:

SQL>ALTERSYSTEMSETSGA_MAX_SIZE=***MSCOPE=SPFILE;

SQL>ALTER SYSTEM SET SGA_TARGET=***MSCOPE=SPFILE;

Oracle 11g 则对这SGA 和PGA 两部分进行综合,引入memory_target,可以自动调整所有的内存,即自动内存管理。11g 里面引入了两个成对的新参数——memory_target 和memory_max_target,这两个参数让SGA 和PGA 在总的内存量内灵活自动调整,在默认情况下,sga_target 和pga_aggreargate,target 设置为零,也就是说采用了新的自动调整参数方式。MEMORY_TARGET 可被动态调整,但要注意不可超过MEMORY_MAX_TARGET 的值。

注意,当处在ASMM 状态时,设置SGA 各部分内存参数的最小值限制;在处在AMM 状态时,若此时的数据库使用了SPFILE,由于数据库关闭后,系统会将上一次数据库关闭时的内存分配状态记录下来,建议使用SPFILE。具体命令如下:

SQL>ALTER SYSTEM SET MEMORY_MAX_TARGET=***M SCOPE=SPFILE;

从一般意义上讲SGA 越大系统的性能越好,但这两个参数不宜设置过高,不应超过系统实际内存的1/2,否则在实例启动时可能会出现错误。

2 程序全局区PGA的管理

与多个进程共享的SGA 相反,PGA(Program Global Area)是只为一个用户进程服务的,其作用是保护会话信息、排序信息以及用户的私有数据信息。只有该用户的服务进程能够访问它自己的PGA 区。当用户进程连接到Oracle 数据库时,创建一个会话并通过C语言的运行时调用malloc()或memmap()来分配内存,会话结束时,PGA 被释放。

2.1 PGA的内存结构

对于这种只有操作系统进程或线程专用的内存,PGA 包含了工作区(SQL Work Areas)、会话区(Session Memory)和私有SQL 区,而SQL Work Areas 又由sort area、hash area、bitmap merge area 组成如图3 所示。

图3 PGA内存结构

这些组件分工各有不同,Session Memory 主要存储一些登录的信息。Private SQL Area 分为永久区域(Persistent Area)和时区域(Runtime Area)。永久区域存储绑定变量等信息,在游标关闭时释放;运行时区域存放了SQL 语句运行时的信息,如执行查询的状态信息、查询工作区(SQL Work Areas)等。不过对于共享服务器模式,Session 这部分内存在SGA 中分配。

2.2 参数设置

PGA 分两种管理模式,一是手动PGA 内存管理,用于为用户指定排序区和散列区所使用的内存,且每个连接使用相同的内存。二是自动PGA 内存管理,即只设置Oracle 可以使用的PGA 的总量,由Oracle 根据系统负载决定具体分配,可以动态扩大也可以回收。

根据表1,在11g 中要进行手动内存管理时,先关闭自动内存管理AMM,然后才能设置PGA 具体命令如下:

SQL>ALTER SYSTEM SET MEMORY_TARGET=0;

若PGA 设为自动内存管理,PGA_AGGREGATE_TARGET 设置为非0 值,具体命令如下:

SQL>ALTER SYSTEM SET PGA_AGGREGATE_TARGET=***M;

如果设置workarea_size_policy 为auto 则sort_area_size,hash_area_size 等参数不用被忽略;如果workarea_size_policy 为manual,则进行sort_area_size,hash_area_size 等参数设置生效。

3 工作任务与配置选择

我们可以对图2 所示的SGA 的各个组件均可进行监测,可以根据监测的情况调整各个组件参数的值,也可以直接根据工作任务进行配置。

3.1 联机事务处理情况

在进行联机事务处理时,对于物理内存16GB,根据Oracle 官方提供的使用经验,一般Oracle 所占物理内存的80%分配给SGA,只给PGA 内存设置20%,命令如下:

SQL>ALTER SYSTEM SET SGA_MAX_SIZE=10g SCOPE=SPFILE;

SQL>ALTER SYSTEM SET SGA_TARGET=10g SCOPE=SPFILE;

SQL>ALTER SYSTEM SET WORKAREA_SIZE_POLICY=AUTO SCOPE=BOYH;

SQL>ALTER SYSTEM SET PGA_AGGREGATE_TARGET=2000M SCOPE=BOYH;

但是通过对内存监测,最后师生们普遍认为SGA与PGA 的总和不宜超过总内存的70%。

3.2 大型池的调整

我们要做备份,需要使用大型池,此时数据缓冲区没有大量的数据,在自动内存管理模式下,自动将缩小数据缓冲区并抽调该内存为大型池服务。

不过,此时SGA 中的有些池不受动态大小调整的影响,例如非标准块大小的缓冲池,以及KEEP 池或RECYCLE 池的非默认块大小。再有,就是日志缓冲区、数据高速缓冲区同样可以不受内存调整的影响。

在手工管理方式下,做备份一般对大型池设置较大一些,具体命令如下:

SQL>ALTER SYSTEM SET LARGE_POOL_SIZE=128M;

3.3 数据缓冲区的调整

数据缓冲区用于缓存从数据文件中检索出来的数据块,它与查询效率和更新数据的性能紧密相关,通过使用如下命令查看情况:

SQL>SHOW PARAMETER db_cache_size;

如果db_cache_size 显示为0,这并不意味着Oracle 没有给实例分配了数据库高速缓冲区,而是在SGA在自动管理模式。使用以下命令查看命中率:

SQL>select 1-((physical.value-direct.value-lobs.value)/logical.value)

2"Buffer Cache Hit Ratio"

3 from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstatlogical

4 where physical.name='physical reads'

5 anddirect.name='physical reads direct'

6 andlobs.name='physical reads direct(lob)'

7 andlogical.name='session logical reads';

如果此时显示命中率低于90%,要适度调整db_cache_size 的大小,命令下:

SQL>ALTER SYSTEM SET db_cache-size=1120M;

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!