ASM Physically addressed metadata-Free space table和Allocation table

 

Allocation Table(AT)和Free space table(FST)都属于Physically addressed metadata,我们在介绍它们之前,先介绍一下asm磁盘的Stride的概念,每个asm磁盘根据不同的磁盘大小,可以分成多个Stride,Stride的大小定义在磁盘头kfdhdb.mfact(单位AU)

[grid@rac1 ~]$ kfed read /dev/asmdisk-data1 |grep -E "mfact|ausi- ze"
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80

并且不同的AU_SIZE,Stride的大小也不相同,在11.2.0.4版本上的验证结果:

Allocation Unit Size

Stride size

1M

113792

2M

228480

>=4M

454272

每个Stride都有自己的Allocation Table和Free space table,用于管理该Stride内AU的分配情况和空闲情况。以AU_SIZE=1M为例,假设asm磁盘大小为500G,那么第一个Stride上的AU由AU号为0上的Allocation Table和Free space table管理,第二个Stride上的AU由AU号为113792上的Allocation Table和Free space table管理,以此类推。
磁盘头定义了第一个Stride的Allocation Table和Free space table的位置,第一个Stride的Free space table位于AU号为0的第2个block(块号从0开始),第一个Stride的第一个Allocation Table block位于AU号为0的第3个block。

[grid@rac1 ~]$ kfed read /dev/asmdisk-data1 |grep -E "tlocn"
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002

下面解析FST block的内容

kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            2 ; 0x002: KFBTYP_FREESPC
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       1 ; 0x004: blk=1
kfbh.block.obj:              2147483649 ; 0x008: disk=1
kfbh.check:                  2977477924 ; 0x00c: 0xb178b524
kfbh.fcn.base:                    16603 ; 0x010: 0x000040db
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdfsb.aunum:                         0 ; 0x000: 0x00000000
kfdfsb.max:                         254 ; 0x004: 0x00fe
kfdfsb.cnt:                          12 ; 0x006: 0x000c
kfdfsb.bound:                         0 ; 0x008: 0x0000
kfdfsb.flag:                          1 ; 0x00a: B=1
kfdfsb.ub1spare:                      0 ; 0x00b: 0x00
kfdfsb.spare[0]:                      0 ; 0x00c: 0x00000000
kfdfsb.spare[1]:                      0 ; 0x010: 0x00000000
kfdfsb.spare[2]:                      0 ; 0x014: 0x00000000
kfdfse[0].fse:                        0 ; 0x018: FREE=0x0 FRAG=0x0
kfdfse[1].fse:                        0 ; 0x019: FREE=0x0 FRAG=0x0
kfdfse[2].fse:                        0 ; 0x01a: FREE=0x0 FRAG=0x0
kfdfse[3].fse:                        0 ; 0x01b: FREE=0x0 FRAG=0x0
kfdfse[4].fse:                        0 ; 0x01c: FREE=0x0 FRAG=0x0
kfdfse[5].fse:                        0 ; 0x01d: FREE=0x0 FRAG=0x0
kfdfse[6].fse:                        0 ; 0x01e: FREE=0x0 FRAG=0x0
kfdfse[7].fse:                        0 ; 0x01f: FREE=0x0 FRAG=0x0
kfdfse[8].fse:                        0 ; 0x020: FREE=0x0 FRAG=0x0
kfdfse[9].fse:                      119 ; 0x021: FREE=0x7 FRAG=0x7
kfdfse[10].fse:                     119 ; 0x022: FREE=0x7 FRAG=0x7
kfdfse[11].fse:                      51 ; 0x023: FREE=0x3 FRAG=0x3
kfdfse[12].fse:                       0 ; 0x024: FREE=0x0 FRAG=0x0
kfdfse[13].fse:                       0 ; 0x025: FREE=0x0 FRAG=0x0
kfdfse[14].fse:                       0 ; 0x026: FREE=0x0 FRAG=0x0
kfdfse[15].fse:                       0 ; 0x027: FREE=0x0 FRAG=0x0
kfdfse[16].fse:                       0 ; 0x028: FREE=0x0 FRAG=0x0
。。。

Free space table记录了该Stride总共有多少个Allocation Table block,以及每个Allocation Table block所管理的AU是否存在空闲,类似数据文件的文件位图块。
kfdfsb可以看作free space block的块头部分,占据24个字节。

  • max:该Stride总共有多少个Allocation Table block来管理AU,该例中1M的AU大小总共有256个元数据块,除去磁盘头和FST,总共254个Allocation Table block,不同的AU大小,kfdfsb.max也不相同
  • cnt:该磁盘目前已经使用到了第几个Allocation Table block所管理的AU
  • kfdfse:为fst条目,一个fst条目对应一个Allocation Table block,描述了每一个Allocation Table block所管理的AU是否存在空闲。

Allocation Unit Size

kfdfsb.max

1M

254

2M

510

>=4M

1014

第一个Allocation Table block的内容

kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       2 ; 0x004: blk=2
kfbh.block.obj:              2147483649 ; 0x008: disk=1
kfbh.check:                  2187822785 ; 0x00c: 0x826786c1
kfbh.fcn.base:                     1108 ; 0x010: 0x00000454
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdatb.aunum:                         0 ; 0x000: 0x00000000
kfdatb.shrink:                      448 ; 0x004: 0x01c0
kfdatb.ub2pad:                        0 ; 0x006: 0x0000
kfdatb.auinfo[0].link.next:           8 ; 0x008: 0x0008
kfdatb.auinfo[0].link.prev:           8 ; 0x00a: 0x0008
kfdatb.auinfo[1].link.next:          12 ; 0x00c: 0x000c
kfdatb.auinfo[1].link.prev:          12 ; 0x00e: 0x000c
kfdatb.auinfo[2].link.next:          16 ; 0x010: 0x0010
kfdatb.auinfo[2].link.prev:          16 ; 0x012: 0x0010
kfdatb.auinfo[3].link.next:          20 ; 0x014: 0x0014
kfdatb.auinfo[3].link.prev:          20 ; 0x016: 0x0014
kfdatb.auinfo[4].link.next:          24 ; 0x018: 0x0018
kfdatb.auinfo[4].link.prev:          24 ; 0x01a: 0x0018
kfdatb.auinfo[5].link.next:          28 ; 0x01c: 0x001c
kfdatb.auinfo[5].link.prev:          28 ; 0x01e: 0x001c
kfdatb.auinfo[6].link.next:          32 ; 0x020: 0x0020
kfdatb.auinfo[6].link.prev:          32 ; 0x022: 0x0020
kfdatb.spare:                         0 ; 0x024: 0x00000000
kfdate[0].discriminator:              1 ; 0x028: 0x00000001
kfdate[0].allo.lo:                    0 ; 0x028: XNUM=0x0
kfdate[0].allo.hi:              8388608 ; 0x02c: V=1 I=0 H=0 FNUM=0x0
kfdate[1].discriminator:              1 ; 0x030: 0x00000001
kfdate[1].allo.lo:                    0 ; 0x030: XNUM=0x0
kfdate[1].allo.hi:              8388608 ; 0x034: V=1 I=0 H=0 FNUM=0x0
kfdate[2].discriminator:              1 ; 0x038: 0x00000001
kfdate[2].allo.lo:                    2 ; 0x038: XNUM=0x2
kfdate[2].allo.hi:              8388609 ; 0x03c: V=1 I=0 H=0 FNUM=0x1
kfdate[3].discriminator:              1 ; 0x040: 0x00000001
kfdate[3].allo.lo:                    0 ; 0x040: XNUM=0x0
kfdate[3].allo.hi:              8388610 ; 0x044: V=1 I=0 H=0 FNUM=0x2
kfdate[4].discriminator:              1 ; 0x048: 0x00000001
kfdate[4].allo.lo:                    2 ; 0x048: XNUM=0x2
kfdate[4].allo.hi:              8388611 ; 0x04c: V=1 I=0 H=0 FNUM=0x3
...

Allocation Table在AT条目(kfdate)中记录了磁盘Stride的每一个AU的分配情况(V=1为分配,V=0为未分配)

  • aunum:该AT block的第一条at条目对应的au编号
  • shrink:一个AT block记录448个at条目
  • kfdate[n]记录的本磁盘第(n+1+kfdatb.aunum)个au分配给了FNUM(16进制)号asm文件的第(XNUM+1)个物理extent,以上面的kfdate[4]为例,该AT条目记录了本磁盘第5个AU分配给了3号asm文件的第3个物理extent

通过x$kfdat也可以查询某块asm磁盘AU分配情况

Column Name

Description

GROUP_KFDAT

Diskgroup number, join with v$asm_diskgroup

NUMBER_KFDAT

Disk number, join with v$asm_disk

COMPOUND_KFDAT

Disk compund_index, join with v$asm_disk

AUNUM_KFDAT

Disk allocation unit (relative position from the beginning of the disk), join with x$kffxp.au_kffxp

V_KFDAT

Flag: V=this Allocation Unit is used; F=AU is free

FNUM_KFDAT

File number, join with v$asm_file

XNUM_KFDAT

Progressive file extent number join with x$kffxp.pxn_kffxp

总结一下,asm磁盘根据磁盘大小可以分为多个Stride,每个Stride都有的FST和AT位于各自Stride的第一个AU上用于管理AU分配和回收,Stride的大小记录在磁盘头kfdhdb.mfact,实际上也等于(Stride的AT block数量)(一个AT block可管理多少AT条目)=kfdfsb.maxkfdatb.shrink。当AU分配时,都会在对应的AT条目上记录该AU分配给了哪个asm文件(kfdate[n].allo.hi的FNUM)的哪个物理extent(kfdate[4].allo.lo的XNUM);当AU回收时,会清理对应的AT条目。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注