介紹free lists及shared pool lru list.
1、shared pool中的chunk的大小是不一樣的,但是是連續的
2、因為chunk是分配的最小單元,因此session需要給對象分配空間的時候,會以chunk為單位進行申請
3、可用的chunk(free)會形成一個鏈表 feee lists,便於進行分配的時候,可以通過遍曆鏈表尋找到可用的適合的chunk,鏈表是chunk進行組織和管理的一種方式
4、一個可用的chunk鏈表是一個bucket,shared pool中會有很多的bucket,不同的bucket中的chunk的大小不同,一般是隨著bucket編號的增加而增長的
5.當需要從shared pool中尋找chunk的時候,首先會定位一個bucket,然後遍曆bucket,尋找最合適的chunk, 如果chunk的空間比需要的空間大,那麼這個chunk就拆分成兩個,一個被分配、一個成為free,重新掛接到相應大小的bucket上。
6、在尋找chunk的過程中,如果一個bucket中沒有合適的chunk,接著尋找另外一個非空的bucket,如果所有的bucket中都沒有合適的chunk,那麼就從rec類型的鏈表中釋放一部分的空間,為free,或將free做適當合并 。。注意:只有rec類型的chunk能夠被釋放空間,即使釋放了空間,這些空間可能都不是連續的,都是一些很小的chunk,這樣可能形成這樣一種情況,shared pool中有空間但是是大量的非常小的chunk,這樣在尋找chunk的時候,也很難尋找到合適的chunk--共用池片段
7、shared pool中所有類型的chunk都是以鏈表的方式進行管理的
##############
按bucket劃分,共有255個,bucket 0---bucket 254
每個bucket上掛有一個 chunk list;
free lists上Bucket大小的分布情況: --環境LINUX 32位/ORACLE 11.2.0.4
之前 Bucket size以4bytes遞增
這一段的Bucket size以64bytes遞增
Bucket 240--254的Bucket size增長看起來沒太大規律,總之是遞增了哈哈。
因為free chunk數量非常的多,這樣劃分每個Bucket容納的chunk數量減少,尋找效率提高,對shared pool latch的爭用也大大減少。注意:如果在shared pool中出現了大量的小的free chunk,就會出現share pool latch爭用的情況,即使增加共用池的大小,這個問題隨著時間還是會出現的。
RESERVED FREE LISTS:
RESERVED FREE LISTS上的bucket個數我DUMP出來的是15個。
保留FREE LISTS,在SQL語句所需CHUNK大於4400bytes時,會在RESERVED FREE LISTS中尋找空閑CHUNK。
如果SQL語句所需CHUNK不大於4400bytes時,只會在free list 中尋找CHUNK。
這個是由隱含參數控制的:_shared_pool_reserved_min_alloc minimum allocation size in bytes for reserved area ,預設值4400
###################
DUMP 共用池查看free lists/bucket/RESERVED FREE LISTS結構:--用建立會話來做
alter session set events 'immediate trace name heapdump level 2';
select value from v$diag_info where name like 'De%';
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_7876.trc
Chunk 2bffa844 sz= 22460 freeable "character set m"
Total heap size =146798680 -- 146798680/1024/1024 --139.99813 初始化參數:shared_pool_size--140M
Bucket 0 size=
Chunk 2bc00048 sz= 0 kghdsx
Chunk 23a60468 sz= free " "
Chunk的地址、大小、狀態
Chunk 23ceb498 sz= 20 free " "
Chunk 237fcde4 sz= 20 free " "
--24位元組,也就是Bucket 2的 size範圍在20-24位元組。。
Chunk 245b13e4 free " "
Chunk 23ace7c0 sz= 24 free " "
Chunk 239c5a28 sz= 24 free " "
Bucket 3 size=28
Chunk 24540e9c free " "
Chunk 2521209c sz= 28 free " "
Chunk 23483448 sz= 28 free " "
………………
Bucket 199 size=1452
Chunk 2347d2ac sz= 1492 free " "
Chunk 24b28a94 sz= 1548 free " "
Chunk 2433bb14 sz= 1620 free " "
Chunk 2463a89c sz= 1620 free " "
Chunk 24b829c4 sz= 1620 free " "
Chunk 23498518 sz= 1704 free " "
Chunk 23de90d0 sz= 1696 free " "
………………
Bucket 236 size=3820
Bucket 237 size=3884
Bucket 241 size=4100
Bucket 242 size=4108
Bucket 243 size=8204
Bucket 244 size=8460
Bucket 245 size=8464
Bucket 246 size=8468
Bucket 247 size=8472
Bucket 248 size=9296
Bucket 249 size=9300
Bucket 250 size=12320
Bucket 251 size=12324
Bucket 252 size=16396
Bucket 253 size=32780
Bucket 254 size=65548
Total free space = 518232
Reserved bucket 0 size=16
Chunk 23420320 sz= 676 R-free " "
Chunk 23427b94 sz= 3420 R-free " "
Chunk 2342618c sz= 952 R-free " "
Chunk 23800050 sz= 1040 R-free " "
Chunk 23400050 sz= 2824 R-free " "
Chunk 25bff028 sz= 4032 R-free " "
Chunk 293ff788 sz= 2144 R-free " "
Chunk 23430a40 sz= 4564 R-free " "
Reserved bucket 3 size=8460
Reserved bucket 4 size=8464
Reserved bucket 5 size=8468
Reserved bucket 6 size=8472
Chunk 2342b988 sz= 9136 R-free " "
Reserved bucket 7 size=9296
Reserved bucket 8 size=9300
Reserved bucket 9 size=12320
Reserved bucket 10 size=12324
Reserved bucket 11 size=16396
Chunk 234161f8 sz= 16448 R-free " "
Reserved bucket 12 size=32780
Reserved bucket 13 size=65548
Chunk 23401d50 sz= 72296 R-free " "
Chunk 23815668 sz= 125312 R-free " "
Chunk 23c00050 sz= 180380 R-free " "
Reserved bucket 14 size=1990652
,用了0.6M
######################
shared pool LRU鏈上掛的都是recreate、freeabl狀態的chunk,一個SQL語句可能需要多個CHUNK,在LRU鏈上找到recreate狀態的chunk,然後在recreate狀態的chunk下再下掛freeabl狀態的CHUNK,--避免全部CHUNK在LRU鏈上導致LRU鏈太長。
TRACE檔案中找到關於(lru first)的一段,方法同上:
Reserved bucket 14 size=1990652
Total reserved free space = 6712468
--狀態為空白, SIZE是348位元組,狀態,
Chunk 237cb10c sz= 4096 recreate "KGLH0^b9197c6e " latch=(nil)
Chunk 24bb5df0 sz= 364 recreate "KGLHD " latch=(nil)
Chunk 241aa1b8 sz= 4096 recreate "KGLH0^59449e50 " latch=(nil)
Chunk 252640a0 sz= 364 recreate "KGLHD " latch=(nil)
Chunk 23a619a0 sz= 4096 recreate "KGLH0^d5f1e0d7 " latch=(nil)
Chunk 23465600 sz= 348 recreate "KGLHD " latch=(nil)
Chunk 2346575c sz= 1036 recreate "KGLHD " latch=(nil)
Chunk 23465b68 sz= 4096 recreate "KGLH0^c6e0d102 " latch=(nil) recreate狀態CHUNK下的多個freeable狀態CHUNK
ds 24bdecb0 sz= 4096 ct= 1
"SQLA^1536bb77 " ds=0x23db5bd8
"KGLDA "
"KGLH0^ba3f9b05 " ds=0x2425e238