Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
C.4. glock debugfs 介面
glock
debugfs
介面顯示了 glock 與 holder 的內部狀態,並且它亦包含了一些在某些情況下被鎖定的物件之概要資訊。篩選器的各行皆以 G: 為起始,並無縮排(代表 glock 本身),或以不同字母以及一個空格縮排作為起始,代表與在檔案中,其正上方之 glock 相聯的結構(H: 代表 holder、I: 代表 inode,R: 則代表資源群組)。以下為此檔案的範例內容:
G: s:SH n:5/75320 f:I t:SH d:EX/0 a:0 r:3 H: s:SH f:EH e:0 p:4466 [postmark] gfs2_inode_lookup+0x14e/0x260 [gfs2] G: s:EX n:3/258028 f:yI t:EX d:EX/0 a:3 r:4 H: s:EX f:tH e:0 p:4466 [postmark] gfs2_inplace_reserve_i+0x177/0x780 [gfs2] R: n:258028 f:05 b:22256/22256 i:16800 G: s:EX n:2/219916 f:yfI t:EX d:EX/0 a:0 r:3 I: n:75661/219916 t:8 f:0x10 d:0x00000000 s:7522/7522 G: s:SH n:5/127205 f:I t:SH d:EX/0 a:0 r:3 H: s:SH f:EH e:0 p:4466 [postmark] gfs2_inode_lookup+0x14e/0x260 [gfs2] G: s:EX n:2/50382 f:yfI t:EX d:EX/0 a:0 r:2 G: s:SH n:5/302519 f:I t:SH d:EX/0 a:0 r:3 H: s:SH f:EH e:0 p:4466 [postmark] gfs2_inode_lookup+0x14e/0x260 [gfs2] G: s:SH n:5/313874 f:I t:SH d:EX/0 a:0 r:3 H: s:SH f:EH e:0 p:4466 [postmark] gfs2_inode_lookup+0x14e/0x260 [gfs2] G: s:SH n:5/271916 f:I t:SH d:EX/0 a:0 r:3 H: s:SH f:EH e:0 p:4466 [postmark] gfs2_inode_lookup+0x14e/0x260 [gfs2] G: s:SH n:5/312732 f:I t:SH d:EX/0 a:0 r:3 H: s:SH f:EH e:0 p:4466 [postmark] gfs2_inode_lookup+0x14e/0x260 [gfs2]
以上範例乃在一個單獨節點的 GFS2 檔案系統上執行 postmark benchmark 時,透過
cat /sys/kernel/debug/gfs2/unity:myfs/glocks >my.lock
指令而產生的部分內容。選用了圖形中的 glock,乃為了顯示某些較有意義的 glock 傾印功能。
glock 的狀態會是 EX(exclusive)、DF(deferred)、SH(shared)或是 UN(unlocked)。除了 UN 之外,這些狀態直接與 DLM 鎖定模式相應,UN 可能代表 DLM null 鎖定模式或是 GFS2 並未持有 DLM 鎖定(取決於以上詳述的 I 旗標)。glock 的 s: 欄位表示鎖定的目前狀態,而 holder 中的相同欄位則代表請求的模式。若授與了鎖定,holder 的旗標(f: 欄位)中將會被設置 H 位元。否則,它將會被設置 W wait 位元。
n: 欄位(number)代表與各項項目相聯的編號。對於 glock 來說,此乃 glock 編號後的類型編號,因此在以上範例中,第一個 glock 乃 n:5/75320;這代表與 inode 75320 相關的
iopen
glock。以 inode 和 iopen
glock 來說,glock 編號總是會與 inode 的磁碟區塊號碼相同。
注意
debugfs glock 檔案中的 glock 編號(n: 欄位)乃十六進位,而 tracepoint 輸出則會將它們以小數點列出。這其實是可追溯的,因為 glock 編號原本總是以十六進位來寫出,然而對於 tracepoint 則使用了小數點,以便輕易地與其它 tracepoint 輸出(比方說來自於
blktrace
的輸出)進行比較,以及和來自於 stat
(1) 的輸出進行比較。
holder 與 glock 的完整旗標清單設置於 表格 C.4, “Glock 旗標” 和 表格 C.5, “Glock holder 旗標” 中。鎖定值區塊的內容目前無法透過 glock
debugfs
介面取得。
表格 C.3, “Glock 類型” 顯示了不同 glock 類型的意義。
表格 C.3. Glock 類型
類型編號 | 鎖定類型 | 使用 |
---|---|---|
1 | trans | 交易鎖定 |
2 | inode | Inode metadata 與資料 |
3 | rgrp | 資源群組 metadata |
4 | meta | superblock |
5 | iopen | Inode 最後偵測 |
6 | flock | flock (2) syscall |
8 | quota | 配額作業 |
9 | journal | 日誌 mutex |
glock 最重要的旗標之一為 l(locked)旗標。此乃在進行狀態變更時,使用來針對於 glock 狀態存取進行調停的 bit lock。當狀態機器準備要透過 DLM 傳送遠端鎖定請求時,它便會被設置,並且僅會在作業全部進行完成後才會被清除掉。這有時亦代表將會傳送超過一項鎖定請求,而發生各種無效化的情況。
表格 C.4, “Glock 旗標” 顯示了不同 glock 旗標的意義。
表格 C.4. Glock 旗標
旗標 | 名稱 | 意義 |
---|---|---|
d | 尚未解決的降階(Pending demote) | 延後的(遠端)降階請求 |
D | 降階(demote) | 降階請求(本機或遠端) |
f | 日誌清除(Log flush) | 釋放此 glock 前,必須先提交日誌 |
F | 凍結(Frozen) | 來自於遠端節點的回應已被忽略 - 正在進行復原。 |
i | 正在無效化(Invalidate in progress) | 正在無效化此 glock 下的分頁 |
I | 初始(Initial) | 當 DLM 鎖定與此 glock 相聯時,進行設置 |
l | 已鎖定(Locked) | glock 正在改變狀態 |
L | LRU | glock 在 LRU 清單上時,進行設置 |
o | 物件 | glock 與物件相關連時,進行設置(亦即 inode 為類型 2 的 glock;資源群組為類型 3 的 glock) |
p | 正在降階(Demote in progress) | glock 正在回應一項降階請求 |
q | 已排程 | holder 已經排程至 glock 進行設置,並在取得 glock、但沒有更多 holder 時清除。用於計算 glock 的最短 hold 時間的演算法則中。 |
r | 正在處理回應(Reply pending) | 來自於遠端節點的回應正等待處理 |
y | Dirty(已修改) | 釋放此 glock 前,資料必須 flush 至磁碟 |
當由一個節點收到遠端 callback,並且該節點希望取得與本機節點上持有之鎖定模式產生衝突的鎖定模式時,D(demote)和 d(demote pending)這兩個旗標之一將會被設置。當特定鎖定上發生競用情況時,為了避免發生資源不足的問題,各個鎖定皆會被分配一段最短的 hold 時間。持有鎖定的時間尚未超過這段最短時間的節點,可繼續保有該鎖定,直到超過時間間隔。
若超過時間間隔,那麼 D(demote)旗標便會被設置,並且所需的狀態將會被紀錄下來。在此情況下,若下次 holder 的排程中無授與的鎖定時,鎖定便會降階。若尚未超過時間間隔,則 d(demote pending)旗標將會被設置。這同時亦會在最短 hold 時間超過時,使狀態機器進行清除 d(demote pending)的排程,並設置 D(demote)。
當 glock 被分配了 DLM 鎖定時,I(initial)旗標將會被設置。這會在 glock 第一次被使用時發生,並且 I 旗標將會保留設置,直到 glock 最後被釋出(並且 DLM 鎖定已解鎖)。