网站首页  词典首页

请输入您要查询的论文:

 

标题 Oracle数据库共享池空间管理调优
范文 胡晨光+徐楠楠



摘 要: Oracle数据库是当前使用最为广泛的大型数据库之一。共享池存储数据库所运行的可执行程序代码和相关数据字典提供,是Oracle数据库体系中最复杂的内存组件之一。由于缺乏对共享池内部运行机制的了解,当数据库在运行过程中显示共享池中空闲空间较多,报ORA?4031错误提示共享池空间不足时,往往束手无策。通过导出Oracle数据库共享池的内存数据的方法,总结并分析共享池空间管理的内部管理机制,找到空闲空间较多而报ORA?4031错误的原因,给出了错误检测方法和相对应的解决方法。
关键词: 共享池; 空间管理; 调优; Oracle数据库
中图分类号: TN919?34; TP311 文献标识码: A 文章编号: 1004?373X(2015)04?0069?04
0 引 言
内存管理是Oracle数据库体系结构中重要的组成部分,也是Oracle数据库性能优化的主要方面。共享池是Oracle数据库内存管理中最重要的组件之一,如果不了解共享池空间内部管理机制,就不能指导应用开发人员设计出高效的SQL语句,也不能设置正确解决ORA?0431问题。有些DBA当发现共享池出现性能问题时,只简单的把共享池设置的非常“大”。而共享池过大或过小都会降低性能,严重的情况下还会挂起数据库。因此,研究Oracle数据库共享池空间内部管理机制对于共享池调优是非常必要的。
1 共享池组成
共享池是SGA的一部分,用于缓存不同类型的程序数据,例如编译的SQL和PL/SQL代码、系统参数、数据字典等,包含Library Cache,Data Dictionary Cache,Reservered Pool,Server Result Cache等组件[1]。从10gR2版本之后,Oracle将共享池的组件分的更加详细,很多组件大小是固定的,并且在实例启动时就已经分配好空间。
使用V$SGASTAT视图查看共享池所包含的组件和各组件的大小:
尽管随着版本的发展,共享池提供更多的服务功能。功能越多,空间管理复杂度就越高。只有清楚共享池空间管理内部机制,才能理解空间不足报错的原因,进而真正解决问题,而不是一味地增加共享池的空间。
2 共享池结构
2.1 子池
为了避免shared pool latch竞争,从9i开始引入了共享池子池(Shared Pool Sub?pool),每个子池都有freelist和LRU list,这样减少了很多竞争。通过下面因素自动确定子池的个数:
每4颗CPU对应一个子池;
每个子池至少512 MB(10g以后的版本);
最多可以有7个子池。
可以通过查询X$KGHLU视图,查看子池个数。在11g中,Oracle又把每个子池分为4个子子池(sub?sub?pool),也叫Duration。根据不同类型的请求在相应Duration中分配空间,每个Duration由若干个extent(extent等于SGA基本单位granule)组成。使用下面的语句可以将共享池的结构导出到跟踪文件中:
Oradebug setmyid
Oradebug dump heapdump 2
跟踪文件显示结果为:
HEAP DUMP heap name="sga heap(1,0)" desc=380050c30
EXTENT 0 addr=3ae400000
EXTENT 1 addr=3ae800000
………………
HEAP DUMP heap name="sga heap(1,1)" desc=380052488
EXTENT 0 addr=3a5000000
EXTENT 1 addr=3a8000000
………………
sga heap(1,0)代表sub?pool 1的Duration 0,sga heap(1,1)代表sub?pool 1的Duration 1。Duaration地址空间是连续的,是granule的倍数。由此可以得到共享池中子池的结构图,如图2所示。
Duration 1缓存Data Dictionary Cache;Duration 2缓存游标的Heap 0;Duration 3缓存游标的执行计划;Duration 0比其他Duration都大,主要用户缓存数据库启动时所需缓存的固定组件,也会为其分配足够的extents,当其他Duration空间不足时,会从此Duration向其他Duration动态分配extent。每个Duration的大小会根据数据库负载动态调整,当Duration空闲空间不足时,可以向Duration 0申请。
2.2 Chunk
Extent是SGA向共享池分配内存空间的基本单位,而Chunk是共享池向申请者分配内存空间的基本单位Extent结构如图3所示。Chunk包括header和body,header存储Chunk的描述性信息,body存储Chunk数据。从跟踪文件中可以看到Chunk header的内容:
EXTENT 1 addr=3a8000000
Chunk 3a8000058 sz=48 R?freeable "reserved stoppe"
Chunk 3a8000088 sz=212808 R?free " "
Chunk 3a8033fd0 sz=48 R?freeable "reserved stoppe"
Chunk 3a8034000 sz=184 freeable "KGLOB "
Chunk 3a80340b8 sz=160 freeable "KGLOB "
Chunk 3a8034158 sz=64 free " "
Chunk 3a8034198 sz=160 freeable "KGLOB "
…………………………
Chunk header包含下面信息:
第1列:Chunk标记;
第2列:Chunk的起始地址;
第3列:Chunk大小;
第4列:Chunk类型;
第5列:Chunk注释,Chunk的用途。
3 换入和换出
共享池的换入和换出由FREE List和LRU List两个数据结构管理,每个Duration都有自己的FREE List,而每个子池有一个LRU List。因此,较10g版本之前,减少了对两个数据结构的竞争。Chunk分为permanent、recreatable、freeable和free四种类型,作用分别是:
Permanent:包含永久的对象,比如链表、hash表,不能被释放。
Recreatable:缓存程序数据,可以被交换出内存。
Freeable:不能单独使用,分配完recreatable类型Chunk之后,再次申请空间,将分配此类型Chunk。所对应的recreatable类型Chunk交换出内存之后,此类型Chunk也会交换出内存;否则,不会单独交换出内存。
Free:空闲Chunk。
3.1 FREE List
管理Free类型Chunk的数据结构。根据应用的类型,在不同Duration的FREE List中申请空闲空间。下面是跟踪文件中的一个Duration的FREE List结构:
FREE LISTS:
Bucket 0 size=32
Chunk 3adc00078 sz= 0 kghdsx
Bucket 1 size=40
Chunk 3a79d0f00 sz= 40 free
Chunk 3a6d5ad00 sz= 40 free
Bucket 2 size=48
…………………………
Bucket 6 size=80
Chunk 3a2d1ff78 sz= 80 free
…………………………
共享池功能较为复杂,应用在申请空闲空间时,申请的空间大小不固定。因此,在每个FREE List中按照空闲空间的大小,使用bucket将相应大小的空闲Chunk连接起来,共有255个bucket。如上面的FREE LIST所示,bucket 0代表所管理的空间为32~39 B的Chunk;如果Chunk超过65 560 B,将连接到bucket 254上。Free List结构如图4所示。
共享池空间分配算法:
(1) 搜索bucket列表,查找与申请空间大小相匹配的bucket n。
(2) 如果在bucket n中有空闲Chunk,并且“Chunk size – 申请空间”小于32 B,执行步骤(5);如果“Chunk size – 申请空间”大于32 B,执行(3);否则,执行(4)。
(3) 将“Chunk size – 申请空间”的剩余空间挂到相应的bucket中,执行步骤(5)。
(4) 如果bucket n中没有相应空间,执行换出算法;再次执行步骤(1),如果还没有分配到合适的Chunk,将报ORA?4031错误,异常退出。
(5) 将此Chunk分配给申请者,并正常退出。
3.2 LRU List
管理Creatable类型Chunk的数据结构,LRU的管理在子池级别上,LRU结构在子池的Duration 0中。下面是跟踪文件中LRU List结构:
UNPINNED RECREATABLE CHUNKS (lru first):
Chunk 3aad1db10 sz= 4096 recreate
"SQLA^27baa630 " latch=0
Chunk 3ab52bc30 sz= 4096 recreate
"CCUR^27baa630 " latch=0
Chunk 3ad1d3968 sz= 528 recreate
"KGLHD " latch=0
Chunk 3aad1fb10 sz= 4096 recreate
"SQLA^d55d9a7 " latch=0
Chunk 3ab52ec30 sz= 4096 recreate
"CCUR^d55d9a7 " latch=0
Chunk 3aae808c8 sz= 4096 recreate
"SQLA^c5417817 " latch=0
4 空间管理调优
在共享池空间管理中,最主要的错误就是ORA?4031。错误提示一般为:ORA?04031: "unable to allocate n bytes of shared memory ("shared pool", "object_name", "alloc type(2,0)" ...)。表示在subpool 2的Duration 0中分配所请求的N字节空间失败。
此时,可以查询V$SGASTAT视图,查看shared pool的free空间是否接近于0。查询语句是:select * from v$sgainfo where pool=′shared pool′ and name=′free memory′。
如果结果接近于0,表明分配给共享池的内存不足,需要增加内存。但是,更多时候结果显示有很多free空间,而仍然会报ORA?4031错误。主要有两个原因:共享池空闲空间碎片过多。有太多的碎片,当申请大空间Chunk时,每个碎片都不能满足应用请求空间分配的大小。即使从LRU List中释放Chunk也不能满足应用请求空间分配的大小。子池之间负载不均衡。有些子池空间耗尽,有些子池空闲空间较多。
4.1 共享池空闲空间碎片过多
4.1.1 测试方法
执行下面的查询检测空闲空间的碎片情况:
select ′sga heap(′||KSMCHIDX||′,0)′ sga_heap,
ksmchcom ChunkComment,
decode(round(ksmchsiz/1000),0,′0?1K′, 1,′1?2K′, 2,′2?3K′,
3,′3?4K′,4,′4?5K′,5,′5?6k′,6,′6?7k′,7,′7?8k′,8,′8?9k′, 9,′9?10k′,′> 10K′) Size,
count(*),
ksmchcls Status,
sum(ksmchsiz) Bytes
from x$ksmsp
where KSMCHCOM = ′free memory′
group by ′sga heap(′||KSMCHIDX||′,0)′, ksmchcom, ksmchcls,
decode(round(ksmchsiz/1000),0,′0?1K′, 1,′1?2K′, 2,′2?3K′,
3,′3?4K′,4,′4?5K′,5,′5?6k′,6,′6?7k′,7,′7?8k′,8,′8?9k′, 9,′9?10k′,′> 10K′);
如果1~4 KB的空闲空间数量较多,5 KB以上的空闲空间数量较少,说明共享池空闲空间碎片较多。共享池中会话之间游标不能共享,子游标较多,是造成此现象的主要原因。
4.1.2 解决方法
(1) 修改初始化参数SHARED_POOL_RESERVED_SIZE,此参数默认为5%,可以适当增大;
(2) 将初始化参数CURSOR_SHARING设置为EXACT,不能设置为SIMILAR或FORCE;
(3) 修改应用系统中的查询语句,尽量多的使用绑定变量。
4.2 子池负载不均衡
共享池中有多个子池,Oracle将进程分配到某个子池中,由于此子池中没有多于空闲空间,分配空间操作失败。虽然其他子池有很多空闲空间,也不会响应该进程的空间分配请求。当确定共享池空闲空间较多,并且碎片较少时,可以确定子池负载不均衡。每个进程都会存储大量的动态初始化参数设定。在数据库启动时,将进程分配到每个子池中。当PROCESSES参数值较大(允许连接数据库的进程较多),而实际的并发量不大,实际连接到数据库的进程分配的子池不均衡,会出现此现象。
可以通过下面的方法解决:
(1) 将初始化参数PROCESSES改小;
(2) 修改隐含参数_kghdsidx_count,适当增加子池数量。
参考文献
[1] CYRAN Michele. Oracle database concepts 10 g release 2 (10.2) [EB/OL]. [2014?07?09]. http://docs.Oracle.com/cd/E11882_01/server.112/e25789/memory.htm#CNCPT1226.
[2] BANSAL Amit. Simplified approach to resolve ORA?4031[EB/OL]. [2008?07?21]. http://askdba.org/weblog/2008/04/application?design?and?ora?4031.
[3] LEWIS Jonathan. Oracle core essential internals for DBA and developers [M]. [S.l.]: Springer Science+Business Media, 2011.
[4] SHAMSUDEEN Riyaj. A stroll through shared pool heaps [EB/OL]. [2009?01?15]. http://orainternals.wordpress.com/2009/01/15/a?stroll?through?shared?pool?heaps.
[5] GREEN Russell. Understanding shared pool memory structures [EB/OL]. [2005?09?22]. http://docs.Oracle.com.
[6] PODER Tanel. ORA?04031 errors and monitoring shared pool subpool memory utilization with Sgastatx SQL [EB/OL]. [2009?06?04]. http://www.blog.tanelpoder.com.
随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/3/15 16:31:38