天天看點

Oracle ASM 翻譯系列第二十九彈:ASM INTERNAL Free Space TableFree Space Table

在進行建立檔案或者檔案resize過程中,需要有一個快捷入口,可以迅速的知道目前磁盤有哪些可用的(free狀态的)au,asm free space table 簡稱fst表就是提供一個這樣的功能,通過它可以快速的知道哪些allocation table(at表)中繼資料塊中有空閑的au,它存儲的是一個個的at表中繼資料塊的号碼,fst表用來加速au的配置設定,避免讀取已經完全被占用殆盡的at塊,造成配置設定空間效率的低下。

fst表技術上說其實是屬于at表的一部分,位于at表的塊1,fst表和at表都被稱為實體中繼資料,它們經常位于asm磁盤的固定的位置。

fst塊存儲在asm磁盤頭,通過kfed工具可以檢視磁盤頭的資訊,其中kfdhdb.fstlocn的值代表了fst塊位于磁盤頭的第幾個塊。例如下面的輸出代表了,fst塊位于磁盤頭的塊1,也就是au 0的第二個塊。(塊從0開始編号)。

$ kfed read /dev/sdc1 | grep kfdhdb.fstlocn

kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001

我們通過kfed工具檢視一下fst表的内容:

$ kfed read /dev/sdc1 blkn=1 | more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                            2 ; 0x002: kfbtyp_freespc

...

kfdfsb.aunum:                         0 ; 0x000: 0x00000000

kfdfsb.max:                         254 ; 0x004: 0x00fe

kfdfsb.cnt:                         254 ; 0x006: 0x00fe

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:                      119 ; 0x018: free=0x7 frag=0x7

kfdfse[1].fse:                       16 ; 0x019: free=0x0 frag=0x1

kfdfse[2].fse:                       16 ; 0x01a: free=0x0 frag=0x1

kfdfse[3].fse:                       16 ; 0x01b: free=0x0 frag=0x1

kfdfse[4037].fse:                     0 ; 0xfdd: free=0x0 frag=0x0

kfdfse[4038].fse:                     0 ; 0xfde: free=0x0 frag=0x0

kfdfse[4039].fse:                     0 ; 0xfdf: free=0x0 frag=0x0

對于這個fst塊,第一個at表中繼資料塊位于au0:

這個fst塊最大數量的fst條目可以達到254個,雖然上面kfed的輸出中kfdfse[i]的編号到了4039,也就是有4039+1=4040個條目,但是有效條目隻有254個。

大的asm磁盤可能會有超過一個stride,asm磁盤頭的kfdhdb.mfact顯示了stride的大小(機關為au),每一個stride有它自己的實體中繼資料,這意味着會有它自己的fst表。

第二個stride的實體中繼資料位于這個stride的第一個au,我們通過kfed工具看一下:

$ kfed read /dev/sdc1 | grep mfact

kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80

以上顯示了stride的大小為113792個au,由于au是從0開始編号,是以第一個stride最後的au号是au 113791,我們可以推算出第二個stride的fst位置是,au 113792的第一個塊:

$ kfed read /dev/sdc1 aun=113792 blkn=1 | grep type

如預期,我們在au 113792上有另一個fts表,如果我們還有其他的stride,同樣會在stride的開始au處有fst表。如下面所示,一個大的asm磁盤,會有數個stride,這裡展示了在第三個stride的開始處的fst表:

$ kfed read /dev/sdc1 aun=227584 blkn=1 | grep type

一般fst表位于每一個asm磁盤的au0的塊1,如果磁盤比較大,就會有不止一個stride,每一個stride都會有它自己的fst表。

<b>本文來自雲栖社群合作夥伴“dbgeek”</b>