ASSM采用3级位图,第一个extent至少有3个元数据块,L1 – L2 – header(包含L3)
段头 & L3
Extent control: 存储HHWM信息
Header control: 记录三级位图的基本信息,其中L2 hint for insert为搜索可用空间的起始位置
Extent table/Auxillary extent map: 维护extent map信息
buffer tsn: 115 rdba: 0x11227ca3 (68/2260131)
scn: 0x0860.07f11dac seq: 0x01 flg: 0x04 tail: 0x1dac2301
frmt: 0x02 chkval: 0x7157 type: 0x23=PAGETABLE SEGMENT HEADER
Hex dump of block: st=0, typ_found=1
Extent Control Header
--------------------描述HHWM---------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 23 #blocks: 1024
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x113a3e09 ext#: 22 blk#: 128 ext size: 128 --高水位线块号/所在extent/该extent块数
#blocks in seg. hdr's freelists: 0
#blocks below: 1000
mapblk 0x00000000 offset: 22
Unlocked
-------------------描述LHWM-------------------------------------
Low HighWater Mark :
Highwater:: 0x113a3e09 ext#: 22 blk#: 128 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 1024
mapblk 0x00000000 offset: 22
Level 1 BMB for High HWM block: 0x113a3d8a
Level 1 BMB for Low HWM block: 0x113a3d8a
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x11227ca2 – 搜索L2 BMB的起始位置,insert需要使用
Last Level 1 BMB: 0x113a3d8a
Last Level II BMB: 0x11227ca2
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 23 obj#: 345420 flag: 0x20000000
Inc # 0
Extent Map--以(dba, len)形式存储extent基本信息,start DBA + length
-----------------------------------------------------------------
0x11227ca1 length: 8
0x11227ca9 length: 8
0x11227cb1 length: 8
.............
0x11400109 length: 128
0x113a3d09 length: 128
0x11400189 length: 128
0x113a3d89 length: 128
Auxillary Map:extent no + L1 BMB of first DBA + first DBA in extent(extent 0前3个块存储metadata)
--------------------------------------------------------
Extent 0 : L1 dba: 0x11227ca1 Data dba: 0x11227ca4
Extent 1 : L1 dba: 0x11227ca1 Data dba: 0x11227ca9
Extent 2 : L1 dba: 0x11227cb1 Data dba: 0x11227cb2
Extent 3 : L1 dba: 0x11227cb1 Data dba: 0x11227cb9
.............
Extent 19 : L1 dba: 0x11400109 Data dba: 0x1140010b
Extent 20 : L1 dba: 0x113a3d09 Data dba: 0x113a3d0b
Extent 21 : L1 dba: 0x11400189 Data dba: 0x1140018b
Extent 22 : L1 dba: 0x113a3d89 Data dba: 0x113a3d8b
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x11227ca2
注:Extent元信息存于段头块,包括start DBA + length + L1 BMB ,若头块空间不足则新分配extent map block专门存储extent map;
所有L3 BMB以单向链表组织在一起,由header control + L2 BMB array组成
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x11227ca2
L2 BMB
L1 BMB数组构成: L1 BMB DBA + max freeness + instance id
buffer tsn: 115 rdba: 0x11227ca2 (68/2260130)
scn: 0x0860.07f11d99 seq: 0x02 flg: 0x04 tail: 0x1d992102
frmt: 0x02 chkval: 0x4536 type: 0x21=SECOND LEVEL BITMAP BLOCK
Dump of Second Level Bitmap Block
number: 22 nfree: 1 ffree: 20 pdba: 0x11227ca3
Inc #: 0 Objd: 0
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x11227ca1 Free: 1 Inst: 1
0x11227cb1 Free: 1 Inst: 1
0x11227cc1 Free: 1 Inst: 1
.....
0x113a3d89 Free: 3 Inst: 1
0x113a3d8a Free: 1 Inst: 1
Free:从1-5依次为full和75%-100% free
--------------------------------------------------------
L1
由一系列DBA range组成,描述若干连续块(不可跨extent)的空间利用率,一个extent可由若干BMB描述;
buffer tsn: 115 rdba: 0x11227ca1 (68/2260129)
scn: 0x0860.07f11dac seq: 0x01 flg: 0x04 tail: 0x1dac2001
frmt: 0x02 chkval: 0x69fb type: 0x20=FIRST LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x11227ca2 poffset: 0
unformatted: 0 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at 02/26/2014 09:35:44
Last successful Search 02/26/2014 09:35:44
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 0
--------------------------------------------------------
DBA Ranges : --因为1个extent有8个块,而该L1描述了16个块,故包含2个range
--------------------------------------------------------
0x11227ca1 Length: 8 Offset: 0
0x11227ca9 Length: 8 Offset: 8
0:Metadata 1:Metadata 2:Metadata 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
由L1 BMB描述每个数据块的空间利用率;
如何搜索可用空间?
依次查询L3 – L2 – L1,最终定位到合适的DBA,处理L2/L1时需要PID哈希值;
1 L2-L1
根据段头L2 Hint for inserts定位L2,进程依据其PID哈希值定位L1 并根据L1.free判断是否有足够空间;
若满足条件跳转到该L1 BMB,否则尝试下一个L2 BMB;
2 L1-DBA
搜索L1 BMB,以进程pid哈希值作为start dba;
发现候选DBA时 进程以nowait模式尝试获取块,若此时块上有active进程则尝试下一个,5次尝试均失败后则释放L1 BMB进行buffer busy wait等待;
碰到unformatted块则一次性格式化N个块并更新HWM;
结论:
L3包含多个L2,L2包含多个L1,L1包含多个数据块。
在L3中选择L2,依赖L2 Hint for inserts。
在L2中选择L1,根据进程PID号的HASH值
在L1中选择数据块,也是根据进程PID号的HASH值。
若L2 BMB包含N个L1 ,L1 BMB又包含M个DBA,则理论上可支持N*M个并发插入进程;
但并未考虑到高水位线,进程只能访问HHWM之下的块,假如当前高水位线位于第M个块,则最大支持M个并发插入进程;
高水位线一次提升的块数= min(L1 BMB ranges, extent);
Vage有一个很经典的调优案例;
症状:
某ASSM表每天1分区,采用uniform extent每个1M;上午9:00开始并发插入,大约100多个进程;
每天9点左右开始出现buffer busy wait等待,十几分钟左右等待消失,然后压力高的时候,偶而出现竞争,但不如早高峰严重
分析:
通过试验发现新创建的表即便有两个L1 BMB, 可并发进程只选择其中1个,每个L1 BMB描述64个块;
这是由于高水位线的缘故,首次插入时 HHWM提升64个块,另1个L1 BMB描述的块均在HHWM之上故无法使用,此时并发度为64;
而当段大于64时,1个L1 BMB描述256个数据块,而高水位线以128块(extent)为单位增长,此时最高支持128个并发进程;
故过一段时间后症状消失,但偶尔会出现竞争;
解决方案:
作者采用两种措施
1 小于64M时,高水位线一次抬升64个块(受限于L1 BMB),人为提升高水位线到64M,理论上此时并发进程可插入到<64M的任何1个块中,并发度非常高;
2 大于64M时,高水位线一次抬升128个块(受限于extent size),故将其从1M改为4M(2M应该就可以了);
目的都是为了提升插入并发度,其实还有1种解决方案,假定能估算每天数据量,可直接将高水位线提升至此;
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。