没有合适的资源?快使用搜索试试~ 我知道了~
Oracle内存全面分析 别人总结 转载
资源详情
资源评论
资源推荐
Oracle 内存
内存内存
内存全面
全面全面
全面分析
分析分析
分析
作者
作者作者
作者:
::
:fuyuncat
来源
来源来源
来源:
::
:http://WWW.HelloDBA.COM
作者简介
作者简介作者简介
作者简介
黄玮,男,99 年开始从事 DBA 工作,有多年的水利、军工、电信及航
运行业大型数据库 Oracle 开发、设计和维护经验。
曾供职于南方某著名电信设备制造商——H 公司。期间,作为 DB 组
长,负责设计、开发和维护彩铃业务的数据库系统。目前,H 公司的彩铃系
统是世界上终端用户最多的彩铃系统。最终用户数过亿。
目前供职于某世界著名物流公司,负责公司的电子物流系统的数据库开
发、维护工作。
msn: fuyuncat@hotmail.com
Email:fuyuncat@gmail.com
Oracle 的内存配置与 oracle 性能息息相关。而且关于内存的错误(如 4030、4031 错
误)都是十分令人头疼的问题。可以说,关于内存的配置,是最影响 Oracle 性能的配
置。内存还直接影响到其他两个重要资源的消耗:CPU 和 IO。
首先,看看 Oracle 内存存储的主要内容是什么:
• 程序代码(PLSQL、Java);
• 关于已经连接的会话的信息,包括当前所有活动和非活动会话;
• 程序运行时必须的相关信息,例如查询计划;
• Oracle 进程之间共享的信息和相互交流的信息,例如锁;
• 那些被永久存储在外围存储介质上,被 cache 在内存中的数据(如 redo log 条
目,数据块)。
此外,需要记住的一点是,Oracle 的内存是与实例对应的。也就是说,一个实例就有
一个独立的内存结构。
先从 Oracle 内存的组成架构介绍。
1. Oracle 的内存架构组成
的内存架构组成的内存架构组成
的内存架构组成
Oracle 的内存,从总体上讲,可以分为两大块:共享部分(主要是 SGA)和进程独享
部分(主要是 PGA 和 UGA)。而这两部分内存里面,根据功能不同,还分为不同内存池
(Pool)和内存区(Area)。下面就是 Oracle 内存构成框架图:
SGA
Share Pool
Buffer Cache
Redo Log Buffer
Java Pool
Stream Pool(10g)
Large Pool
PGA*n
Bitmap merge area Sort Area Hash Area
UGA*n
CUA*n
下面分别介绍这两块内存区。
1.1. SGA
(
((
(
System Global Area
)
))
)
SGA(System Global Area 系统全局区域)是一组包含一个 Oracle 实例的数据和控制
信息的共享内存结构。这句话可以说是 SGA 的定义。虽然简单,但其中阐述了 SGA 几个很
重要的特性:1、SGA 的构成——数据和控制信息,我们下面会详细介绍;2、SGA 是共享
的,即当有多个用户同时登录了这个实例,SGA 中的信息可以被它们同时访问(当涉及到
互斥的问题时,由 latch 和 enquence 控制);3、一个 SGA 只服务于一个实例,也就是
说,当一台机器上有多个实例运行时,每个实例都有一个自己的 SGA,尽管 SGA 来自于 OS
的共享内存区,但实例之间不能相互访问对方的 SGA 区。
Oracle 进程和一个 SGA 就构成了一个 Oracle 实例。当实例启动时,Oracle 会自动从
系统中分配内存给 SGA,而实例关闭时,操作系统会回收这些内存。下面就是当实例启动
后,显示已经分配了 SGA:
SQL> startup
ORACLE instance started.
Total System Global Area 289406976 bytes
Fixed Size 1248576 bytes
Variable Size 117441216 bytes
Database Buffers 163577856 bytes
Redo Buffers 7139328 bytes
Database mounted.
Database opened.
SQL>
SGA 区是可读写的。所有登录到实例的用户都能读取 SGA 中的信息,而在 oracle 做执
行操作时,服务进程会将修改的信息写入 SGA 区。
SGA 主要包括了以下的数据结构:
• 数据缓冲(Buffer Cache)
• 重做日志缓冲(Redo Log Buffer)
• 共享池(Shared Pool)
• Java 池(Java Pool)
• 大池(Large Pool)
• 流池(Streams Pool --- 10g 以后才有)
• 数据字典缓存(Data Dictionary Cache)
• 其他信息(如数据库和实例的状态信息)
最后的两种内存信息会被实例的后台进程所访问,它们在实例启动后就固定在 SGA 中
了,而且不会改变,所以这部分又称为固定 SGA(Fixed SGA)。这部分区域的大小一般小
于 100K。
此外,用于并非进程控制的锁(latch)的信息也包含在 SGA 区中。
Shared Pool、Java Pool、Large Pool 和 Streams Pool 这几块内存区的大小是相应
系统参数设置而改变的,所以有通称为可变 SGA(Variable SGA)。
1.1.1. SGA 的重要
的重要的重要
的重要参数
参数参数
参数和特性
和特性和特性
和特性
在设置 SGA 时,有一些很重要的参数,它们设置正确与否,会直接影响到系统的整体
性能。下面一一介绍他们:
• SGA_MAX_SIZE
SGA 区包括了各种缓冲区和内存池,而大部分都可以通过特定的参数来指定他们的大
小。但是,作为一个昂贵的资源,一个系统的物理内存大小是有限。尽管对于 CPU 的内存
寻址来说,是无需关系实际的物理内存大小的(关于这一点,后面会做详细的介绍),但
是过多的使用虚拟内存导致 page in/out,会大大影响系统的性能,甚至可能会导致系统
crash。所以需要有一个参数来控制 SGA 使用虚拟内存的最大大小,这个参数就是
SGA_MAX_SIZE。
当实例启动后,各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再
根据需要扩展他们的大小,而他们的总和大小受到了 SGA_MAX_SIZE 的限制。
当试图增加一个内存的大小,并且如果这个值导致所有内存区大小总和大于
SGA_MAX_SIZE 时,oracle 会提示错误,不允许修改。
当然,如果在设置参数时,指定区域为 spfile 时(包括修改 SGA_MAX_SIZE 本身),
是不会受到这个限制的。这样就可能出现这样的情况,在 spfile 中,SGA 各个内存区设置
大小总和大于 SGA_MAX_SIZE。这时,oracle 会如下处理:当实例再次启动时,如果发现
SGA 各个内存总和大于 SGA_MAX_SIZE,它会将 SGA_MAX_SIZE 的值修改为 SGA 各个内存区
总和的值。
SGA 所分配的是虚拟内存,但是,在我们配置 SGA 时,一定要使整个 SGA 区都在物理
内存中,否则,会导致 SGA 频繁的页入/页出,会极大影响系统性能。
对于 OLTP 系统,我个人建议可以如下配置 SGA_MAX_SIZE(一般有经验的 DBA 都会有
自己的默认配置大小,你也可以通过一段时间的观察、调整自己的系统来得到适合本系统
的参数配置):
系统内存
系统内存系统内存
系统内存
SGA
SGASGA
SGA_MAX_SIZE
_MAX_SIZE_MAX_SIZE
_MAX_SIZE 值
值值
值
1G 400-500M
2G 1G
4G 2500M
8G 5G
SGA 的实际大小可以通过以下公式估算:
SGA 实际大小 = DB_CACHE_SIZE + DB_KEEP_CACHE_SIZE + DB_RECYCLE_CACHE_SIZE +
DB_nk_CACHE_SIZE + SHARED_POOL_SIZE + LARGE_POOL_SIZE + JAVA_POOL_SIZE +
STREAMS_POOL_SIZE(10g 中的新内存池) + LOG_BUFFERS+11K(Redo Log Buffer 的保护
页) + 1MB + 16M(SGA 内部内存消耗,适合于 9i 及之前版本)
公式种涉及到的参数在下面的内容种会一一介绍。
• PRE_PAGE_SGA
我们前面提到,oracle 实例启动时,会只载入各个内存区最小的大小。而其他 SGA 内
存只作为虚拟内存分配,只有当进程 touch 到相应的页时,才会置换到物理内存中。但我
们也许希望实例一启动后,所有 SGA 都分配到物理内存。这时就可以通过设置
PRE_PAGE_SGA 参数来达到目的了。
这个参数的默认值为 FALSE,即不将全部 SGA 置入物理内存中。当设置为 TRUE 时,实
例启动会将全部 SGA 置入物理内存中。它可以使实例启动达到它的最大性能状态,但是,
启动时间也会更长(因为为了使所有 SGA 都置入物理内存中,oracle 进程需要 touch 所有
的 SGA 页)。
我们可以通过 TopShow 工具(本站原创工具,可在
http://www.HelloDBA.com/Download/TopShow.html 中下载)来观察 windows(Unix 下的
内存监控比较复杂,这里暂不举例)下参数修改前后的对比。
PRE_PAGE_SGA 为 FALSE:
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------
--
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 276M
sga_target big integer 276M
SQL> startup force
ORACLE instance started.
Total System Global Area 289406976 bytes
Fixed Size 1248576 bytes
Variable Size 117441216 bytes
Database Buffers 163577856 bytes
Redo Buffers 7139328 bytes
Database mounted.
Database opened.
SQL>
启动后,Oracle 的内存情况
可以看到,实例启动后,oracle 占用的物理内存只有 168M,远小于 SGA 的最大值
288M(实际上,这部分物理内存中还有一部分进程的 PGA 和 Oracle Service 占用的内
存),而虚拟内存则为 340M。
将 PRE_PAGE_SGA 修改为 TRUE,重启实例:
SQL> alter system set pre_page_sga=true scope=spfile;
System altered.
SQL> startup force
ORACLE instance started.
Total System Global Area 289406976 bytes
Fixed Size 1248576 bytes
Variable Size 117441216 bytes
Database Buffers 163577856 bytes
Redo Buffers 7139328 bytes
Database mounted.
Database opened.
再观察启动后 Oracle 的内存分配情况:
剩余72页未读,继续阅读
xiongjin1983
- 粉丝: 1
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0