内存结构

内存结构


Oracle的三个主要内存结构:系统全局区(System Global Area,SGA),进程全局区(Process Global Area,PGA),用户全局区(User Global Area,UGA)。


  1. 进程全局区和用户全局区

  1. 定义:

1. 进程全局区(PGA):特定于进程的一段内存,是一个操作系统进程或线程专用的内存,不允许系统中的其他进程或线程访问。一般通过C语言的运行时调用malloc()memmap()来分配,而且可以在运行时动态扩大(甚至可以收缩)。PGA绝对不会在SGA中分配,而总是由进程和线程在本地分配。

2. 用户全局区(UGA):就是你的会话状态。你的会话总能访问这部分内存。如果通过一个共享服务器连接,UGA肯定存储在每个共享服务器进程都能访问的一个内存结构中,即SGA中;如果使用专用服务器连接,则不再需要大家都能访问你的会话状态,UGA就包含在专用服务器的PGA中。

3. PGA包含进程内存,还可能包含UGA(专用服务器连接)。

2)两种管理PGA中非UGA内存的方法:手动PGA内存管理和自动PGA内存管理

1. 参数WORKAREA_SIZE_POLICY控制管理方式,可以在会话级修改。AUTO表示自动PGA内存管理,MANUAL表示手动PGA内存管理。

2. 手动PGA内存管理

三个重要参数:

    1. SORT_AREA_SIZE:在信息换出到磁盘之前,用于对信息排序的RAM总量。

    2. SORT_AREA_RETAINED_SIZE:排序完成后用于保存已排序数据的内存总 量。

    3. HASH_AREA_SIZE:服务器进程在内存中存储散列表所用的内存量。

注意点:

  1. 这些参数控制着SORTHASHBITMAP MERGE操作所用的最大内存量;

  2. 这些设置并非是对会话的限制:它们只是对一个操作的限制,在会话中,一个查询可以有多个排序,或者多个查询需要一个排序。

  3. 这些内存区都是根据需要来分配的:如果将排序区设为1GB,并不是说你要分配1GBRAM,而是你允许Oracle进程为一个排序/散列操作最多分配1GB的内存。

3)自动PGA内存管理

1. 两个参数

1WORKAREA_SIZE_POLICY:设置为AUTO(默认);

2PGA_AGGREGATE_TARGET:控制实例为完成数据排序/散列的所用工作区(即排序区和散列区)总共应分配多少内存。(应显式设置)

2. 目标

自动PGA内存管理的总目标就是尽可能充分地使用RAM,而且不会超出可用的RAM

3. 确定如何分配内存

1PGA_AGGREGATE_TARGET是一个上限目标,而不是启动数据库时预分配的内存大小。可以把PGA_AGGREGATE_TARGET设置为一个超大的值(远远大于服务器上实际可用的物理内存量),你会看到,并不会因此分配很大的内存。

2)串行(非并行查询)会话会使用PGA_AGGREGATE_TARGET中很少的一部分,大约5%或者更少。

3)一个并行查询最多可以使用PGA_AGGREGATE_TARGET30%,每个并行查询进程会在这30%中得到自己的一部分。即每个并行进程能使用的内存量大约是0.3*PGA_AGGREGATE_TARGET/(并行进程数)。

4. PGA内存主要分为两部分:

Untunable Memory Size(不可调整内存)+ Tunable Memory Size(可调整内存)

Oracle遵循以下原则:

Untunable Memory Size + Tunable Memory Size <= PGA_AGGREGATE_TARGET

注:Oracle只能控制可调整部分的内存分配,如果PGA_AGGREGATE_TARGET的设置不足以供不可调整部分使用,就会扩展,只有当操作系统报告称再没有更多可用内存时我们的请求才会失败。虽然Oracle不能控制不可调整部分的内存分配,但它不会忽略这部分内存,而是会识别已经使用的内存,并相应的减少为可调整部分分配的内存大小。

5. 注:在Oracle9i中,PGA_AGGREGATE_TARGET参数仅对专用服务器模式下(Dedicated Server)的专属连接有效,对共享服务器Shared Server)连接无效;从Oracle10g开始PGA_AGGREGATE_TARGET对专用服务器连接和共享服务器连接同时生效。


2. 系统全局区

1 典型的SGA如下图所示:

  1. 几个重要参数:

    1. JAVA_POOL_SIZE:控制JAVA池的大小。

    2. SHARED_POOL_SIZE:控制共享池的大小。

    3. LARGE_POOL_SIZE:控制大池的大小

    4. DB_*_CACHE_SIZE:共有8CACHE_SIZE参数,控制各个可用缓冲区缓存的大小。

    5. LOG_BUFFER:控制重做缓冲区的大小。

    6. SGA_TARGETOracle 10g及以上版本中用于自动SGA内存管理。(为0则表示通过手动SGA内存管理;否则为自动SGA内存管理)

    7. SGA_MAX_SIZE:控制数据库启动并运行时SGA可以达到的最大大小。

  2. 各个池的内存以一种称为颗粒(granule,也称区组)的单位来分配。一个颗粒的大小为4MB8MB、或16MB的内存区。颗粒是最小的分配单位,其大小由SGA的大小确定。可通过查询V$SGA_DYNAMIC_COMPONENTS查看各个池所用的颗粒大小。

  3. 固定SGAfixed SGA

安装时,固定SGA会“编译到”Oracle二进制可执行文件本身当中,在固定SGA中,有一组指向SGA中其他组件的变量,还有一些变量中包含了各个参数的值。我们无法控制固定SGA的大小,但固定SGA通常都很小。是SGA中的“自启”区,Oracle在内部要使用这个区来找到SGA的其他区。

  1. 重做缓冲区(redo buffer

    1. LGWR会在一下某个情况发生时启动对重做缓冲区的刷新输出:

      1. 3秒一次

      2. 无论何时有人提交请求

      3. 要求LGWR切换日志文件

      4. 重做缓冲区1/3满,或者包含了1MB的缓存重做日志数据

3. 一般如果重做缓冲区的大小超过几MB,通常对系统就没有什么意义了。对于一个有大量并发事务的大型系统或者一个长时间运行的事务,大的重做日志缓冲区会有利。

2. 重做缓冲区的默认大小由LOG_BUFFER参数控制,取值为512KB和(128*CPU个数)KB中的较大者。该区的最小大小取决于操作系统。

6)块缓冲区缓存

1. 块缓冲区包括3个池:

1)默认池(default pool):

2)保持池(keep pool):放置访问相当频繁的段。

3)回收池(recycle pool):放置访问很随机的段。

注:X$BH表显示了快缓冲区缓存块的有关信息(如接触计数)。

2. 9i开始,还可以设置db_nk_cache,同一个数据库可以使用多种块大小(2KB,4KB,8KB,16KB,32KB)。每个不同的块大小都必须有其自己的缓冲区缓存。默认池、保持池和回收池只缓存具有默认大小的块。为了在数据库中使用非默认的块大小,需要配置一个缓冲区池来保存这些块。

注:多个块大小主要用于从一个数据库向另一个数据库传输数据。

  1. 共享池

    1. 共享池是SGA中最重要的内存段之一,共享池太大或太小都会严重影响性能。

    2. SQLPL/SQL的解析计划和代码,数据字典缓存等等都在共享池中缓存。

    3. 共享池的特点是有大量小的内存块,一般为4KB或更小。使用小块的内存可以避免碎片问题。

    4. 不使用绑定变量的缺点:1)系统要花大量CPU时间解析查询;2)系统使用大量资源来管理共享池中的对象,因为从来不重用查询。

    5. 查询共享池的大小(两种方式)

      1. select sum(bytes)/1024/1024 from v$sgastat where pool = 'shared pool';

      2. show parameter shared_pool_size;

注:SHARED_POOL_SIZE参数在9i中控制共享池中占用最大的部分,10g以上控制共享池的总大小。

8)大池(large pool

1. 用于大块内存的分配(共享池不会处理这么大的块,共享池根据LRU管理内存, 这对于缓存和重用数据很合适;但大块内存分配则是得到一块内存后加以使用, 然后就到此为止,没有必要缓存这个内存)

2. 大池专用于以下情况:

1)共享服务器连接,用于在SGA中分配UGA区。

2)语句的并行执行,允许分配进程间的消息缓冲区,这些缓冲区用于协调并行查 询服务器。

3)备份,在某些情况下用于RMAN磁盘I/O缓冲区。

9Java池(Java pool

1. 目的:支持在数据库中运行Java。如果用Java编写一个存储过程,Oracle会在处理 代码时使用Java池的内存。参数JAVA_POOL_SIZE用于确定为会话特有的所有 Java代码和数据分配多大的Java池内存量。

2. Java池包含内容

1)如果采用专用服务器模式,则包括每个Java类的共享部分,由每个会话使用。 (这些实质上是只读部分,如执行向量、方法等)。此时Java池所需的总内存相当 少,因为每个会话的状态不会存储在SGA中,而是存储在UGA中,而此时UGA 包括在PGA中。

2)如果采用共享服务器模式,则包括以下部分:

1. 每个Java类的共享部分。

2. UGA中用于各会话状态的部分,这是从SGAJAVA_POOL分配。UGA 余下的部分在共享池中分配,或者如果配置了大池,就会在大池中分配。

10)流池(stream pool

1. 作用:流池(或者如果没有配置流池,则是共享池中至多10%的空间)会用于流 进程在数据库间移动/复制数据时使用的队列消息。流使用的是内存中的队列,而 不是基于磁盘的队列(磁盘队列有一些附加的开销)

2. 在使用了流数据库特性的系统中,必须设置流池,以避免因为这个特性从共享池 窃取”10%的空间。


3. 自动内存管理

1 Oracle9i 及以前版本中,只能用手动 SGA 内存管理,不存在参数 SGA_TARGET, 且参数SGA_MAX_SIZE 只是一个上限,而不是动态目标。 Auto Memory Management Oracle10g提出来的一个新特性,在最新的Oracle11g数据库中又得到了进一步的发展。2 oracle10g的数据库中,只有SHARED_POOL_SIZEDB_CACHE_SIZELARGE_P OOL_SIZEJAVA_POOL_SIZESTREAMS_POOL_SIZE五个SGA组件可以被自动调 整,其中PGA的最大值由初始化参数 PGA_AGGREGATE_TARGET决定,SGA的最 大值由初始化参数SGA_TARGET决定。

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

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

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

如果使用的是 pfile,设定了 MEMORY_TARGET 而没有指定MEMORY_MAX_TAR GET 的值,则实例启动后 MEMORY_MAX_TARGET 的值与MEMORY_TARGET 等。如果 pfile 中指定了MEMORY_MAX_TARGET 而没有指定MEMORY_TARGET ,实例启动后 MEMORY_TARGET 0

AMM 在后台会启动一个内存管理(Memory Manager, mman)进程。

4 因为 AMM 的引入,Oracle 内存管理更加灵活多样。 组合出来有 5 种内存管理形式.

  • 自动内存管理

  • 自动共享内存管理

  • 手工共享内存管理

  • 自动 PGA 管理

  • 手动 PGA 管理

1 自动内存管理

默认安装的实例即是 AMM 方式。如下

		SQL> show parameters target 
		NAME                                 TYPE                   VALUE
		------------------------------------ ---------------------- 				------------------------------
		archive_lag_target                   integer                0
		db_flashback_retention_target        integer                1440
		fast_start_io_target                 integer                0
		fast_start_mttr_target               integer                0
		memory_max_target               big integer        1216M
		memory_target                   big integer        1216M
		pga_aggregate_target                 big integer            0
		sga_target                           big integer            0

要注意到 SGA_TARGET pga_aggregate_target 都为 0

2. 自动共享内存管理 (Automatic Shared Memory Management, ASMM)

这是 10g 引入的管理方式,要使用这种方式,需要设置初始化参数 MEMORY_TARGET=0 ,然后显式的指定 SGA_TARGET 的值。

	SQL> alter system set sga_target=1024m scope=both;
	alter system set sga_target=1024m scope=both
	*
	ERROR at line 1:
	ORA-02097: parameter cannot be modified because specified value is invalid
	ORA-00839: SGA_TARGET cannot be modified to the specified value
	SQL> alter system set memory_target=0 scope=both;
	System altered.
	SQL> alter system set sga_target=1024m scope=both;
	System altered.

这两个参数的修改是有严格顺序的,如果不遵守倒也没问题--Oracle 会报告错误。

3. 手工共享内存管理

这个又更加原始了一些。因为原始,所以新的初始化参数 SGA_TARGET MEMORY_TARGET 都要设置为 0. 然后手工设定 share_pool_size db_cache_size s ga 参数。要注意 RESULT_CACHE_SIZE 参数是 11g 新引入的,用来缓存 SQL 结果。

4. 自动 PGA 内存管理

如果使用 AMM , 则对 PGA 不用操心。如果要做到精细控制而切换到自动 PGA 内 存管理模式,需要设定WORKAREA_SIZE_POLICY AUTO(默认即为 AUTO),然 后需要指定 PGA_AGGREGATE_TARGET 的值。如需要精确控制PGA,则 WORKAREA_SIZE_POLICY MANUAL

5. 手动 PGA 管理

前提是 WORKAREA_SIZE_POLICY = manual ,然后分别指定 SORT_AREA_SIZE PGA 相关的参数。估计现在没有人干这个吃力不讨好的事情了。这个模式大可以忽略。

5 AMM 的限制

如果初始化参数 LOCK_SGA true ,则 AMM 是不可用的。

6 相关动态视图

V$MEMORY_DYNAMIC_COMPONENTS
V$MEMORY_RESIZE_OPS



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17014649/viewspace-608489/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17014649/viewspace-608489/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值