shared pool的物理结构和逻辑结构
从物理角度上看Oracle shared pool,它是由多个内存块组成。这里的内存块相当于数据文件中的数据块,是最小的分配单位。这个最小分配单位称为chunk,它里面的内存字节是连续的。但每个chunk的大小是不固定的。shared pool的内存分配由heap(堆)来实现。heap的个数由隐含参数”_kghdsidx_count “来决定。
每个heap下又有多个sub-heap,他们之间的关系称为高级堆和副堆。他们的结构大致相同。
heap由一个或多个extent和heap header组成,而extent又由若干个chunk和extent header组成,而chunk由chunk header和chunk body组成。
每个extent的体积是若干个granule(有文档说是一个,但dump出来看不只一个)。granule是shared pool逻辑角度上的组成单位。这个granule是固定值,不同的SGA下大小不同,如10g中SGA_MAX_SIZE<=1024MB,则granule 的值为4MB ;SGA_MAX_SIZE>1024MB ,则granule 的值为16MB。可以通过v$sgainfo去查证。
从视图select ksmchcls,count(*) from x$ksmsp group by ksmchcls;中可以看到shared pool的每个chunk的类型。
KSMCHCLS
COUNT(*)
free
3299
freeabl
13634
no acce
17
perm
43
R-free
31
R-freea
76
recr
18519
free:这种类型的chunk不包含有效的对象,可以不受限制地被分配。
recr:意味着recreatable,这种类型的chunk里包含的对象可以在需要的时候被临时移走,并且在需要的时候重新创建。比如对于很多有关共享SQL语句的chunk就是recreatable的。
freeabl:这种类型的chunk包含的对象都是曾经被session使用过的,并且随后会被完全或部分释放。这种类型的chunk不能临时从内存移走,因为它们是在处理过程中间产生的,如果移走的话就无法被重建。
perm:意味着permanent,这种类型的chunk包含永久的对象,大型的permanent类型的chunk也可能含有可用空间,这部分可用空间可以在需要的时候释放回shared pool里。
(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1667933)
使用”heapdump at level 2”将shared pool空间dump出来,可以看到heap的组成。
使用的SQL如下:
alter session set events 'immediate trace name heapdump level 2';
dump出来的结果如下:
******************************************************HEAP DUMP heap name="sga heap" desc=0x2000002c extent sz=0x32c8 alt=108 het=32767 rec=9 flg=-126 opc=0 parent=(nil) owner=(nil) nex=(nil) xsz=0x0******************************************************HEAP DUMP heap name="sga heap(1,1)" desc=0x2001b598 extent sz=0xfc4 alt=108 het=32767 rec=9 flg=-126 opc=0 parent=(nil) owner=(nil) nex=(nil) xsz=0x1000000EXTENT 0 addr=0x9d000000 Chunk 9d000038 sz= 24 R-freeable "reserved stoppe" Chunk 9d000050 sz= 839576 R-free " "Chunk 9d0ccfe8 sz= 24 R-freeable "reserved stoppe" Chunk 9d0cd000 sz= 10274952 free " " Chunk 9da99888 sz= 796 recreate "KGL handles " latch=(nil) Chunk 9da99ba4 sz= 1036 freeable "parameter table" Chunk 9da99fb0 sz= 96 freeable "library cache " Chunk 9da9a010 sz= 228 recreate "KGL handles " latch=(nil) Chunk 9da9a0f4 sz= 96 freeable "library cache " Chunk 9da9a154 sz= 284 recreate "KQR PO " latch=0x9baaf310 Chunk 9da9a270 sz= 284 recreate "KQR PO " latch=0x9baaf310 Chunk 9da9a38c sz= 540 recreate "KQR PO " latch=0x9baaf568 Chunk 9da9a5a8 sz= 96 freeable "library cache " Chunk 9da9a608 sz= 540 recreate "KGL handles " latch=(nil) Chunk 9da9a824 sz= 540 recreate "KGL handles " latch=(nil) Chunk 9da9aa40 sz= 540 recreate "KGL handles " latch=(nil) Chunk 9da9ac5c sz= 540 recreate "KGL handles " latch=(nil) Chunk 9da9ae78 sz= 540 recreate "KGL handles " latch=(nil)
在chunk的 header中,有一个16字节的固定区域,保存分配该heap内存的原因或者说是注释,如”KGL handles”、”KQR PO”等等。
Oracle shared pool中这些物理内存的分配、管理都是由一个叫做KGH Heap Manager的C程序来实现的。Heap Manager预先分配所有的shared pool所定义的内存空间。Heap Manager还管理PGA内存,但这个操作需要经常同操作系统交互来分配和回收内存。
从逻辑角度看Oracle shared pool,它主要分为library cache、dictionary cache和control structure三个部分。
Shared pool的library cache主要保存了已执行的SQL语句和PL/SQL对象,以及它们的执行计划等等。
采用hash table对这些对象进行管理。例如一个SQL在经过hash算法分析后得到一个hash值。hash table下由若干个hash bucket,hash bucket下又有若干个library cache handle组成。这些handle的组成部分包括name,namespace,lock owners,lock waiters,pin owners,pin waiters,flags,heap 0(object)。其中heap 0保存的是指向object的指针。因此这个heap 0也称为object。如下图所示:
http://dl.iteye.com/upload/picture/pic/117407/409cfee7-5b16-392b-9bc3-13ff0d2ac771.gif
根据library cache的结构,延伸到heap 0这个级别上。heap 0的组成部分包括object type,object name,flags,tables,data blocks。其中tables和data blocks又进一步延伸。
tables的组成部分包括dependency table,child table,translation table,authorization table,access table,r-o dependency table,schema name table。
data blocks的组成部分包括object, source,diana,pcode,mcode,errors,sql context。其中source也称为heap 1用于存储sql文本,sql context称为heap 6用于存储SQL执行计划。如下图所示:
http://dl.iteye.com/upload/picture/pic/117411/cd711ea8-cd44-35af-a7ab-ba12eac57e1e.gif
library cache中不同bucket的library cache object handle是有不同类型的。可以根据object handle中的namespace进行区别。不同object handle之间可能采用双向链表的形式相互关联。
如namespace为CRSR的,有parent cursor和child cursor,分别在不同的bucket中的object handle里。
使用”library_cache level 11“将library cache的内存dump出来。
使用的SQL如下:
alter session set events 'immediate trace name library_cache level 11';
dump出来的结果如下:
BUCKET 5944: LIBRARY OBJECT HANDLE: handle=1895899e8 mtx=0x189589b18(1) cdp=1 name=select* from sys.obj$ where obj#=:x hash=8cd0bd4dbb09ea7c3d007f1ce9b01738 timestamp=08-21-2012 10:02:35 namespace= CRSRflags=RON/KGHP/TIM/PN0/SML/KST/DBN/MTX/ kkkk-dddd-llll=0000-0001-0001 lock=N pin=0 latch#=6 hpc=0002 hlc=0002 lwt=0x189589a90 ltm=0x189589aa0 pwt=0x189589a58 ptm=0x189589a68 ref=0x189589ac0 lnd=0x189589ad8 LOCK OWNERS: lock user session count mode flags -------- -------- -------- ----- ---- ------------------------ 17f72e938 1852c9890 1852c9890 1 N LIBRARY OBJECT: object=1786e6168 type=CRSR flags=EXS pflags= status=VALD load=0 CHILDREN: size=16 child# table reference handle ------ -------- --------- -------- 0 17816fa10 17816f680 144768330 DATA BLOCKS: data# heap pointer status pins change whr ----- -------- -------- --------- ---- ------ --- 0 144773248 1786e6280 I/P/A/-/- 0 NONE 00 BUCKET 5944 total object count=1
LIBRARY OBJECT HANDLE: handle=144768330 mtx=0x144768460(0) cdp=0 namespace=CRSR flags=RON/KGHP/PN0/EXP/ kkkk-dddd-llll=0000-0001-0001 lock=N pin=0 latch#=6 hpc=fffe hlc=fffe lwt=0x1447683d8 ltm=0x1447683e8 pwt=0x1447683a0 ptm=0x1447683b0 ref=0x144768408 lnd=0x144768420 CHILD REFERENCES: reference latch flags --------- ----- ------------------- 17816f680 11 CHL LOCK OWNERS: lock user session count mode flags -------- -------- -------- ----- ---- ------------------------ 17f72f1d8 1852c9890 1852c9890 1 N LIBRARY OBJECT: object=178161a10 type=CRSR flags=EXS pflags= status=VALD load=0 DEPENDENCIES: count=1 size=16 dependency# table reference handle position flags ----------- -------- --------- -------- -------- ------------------- 0 17837dae8 17837d828 189addbb8 17 DEP AUTHORIZATIONS: count=1 size=16 minimum entrysize=16 00000000 00000000 00020000 00000000 ACCESSES: count=1 size=16 dependency# types ----------- ----- 0 0009 SCHEMA: count=1 size=262144 00000000 DATA BLOCKS: data# heap pointer status pins change whr ----- -------- -------- --------- ---- ------ --- 0 144e55298 178161b28 I/P/A/-/- 0 NONE 00 6 1786cd5a0 16ece5dc0 I/-/A/-/E 0 NONE 00
页:
[1]