B.4. glock debugfs インターフェイス
glock
debugfs
インターフェイスを使用すると、glock とホルダーの内部の状態を視覚化でき、場合によってはロックされたオブジェクトの概要情報も含まれます。ファイルの各行は、インデントなしで G: を開始する (glock 自体を参照する) か、シングルスペースでインデントされた別の文字で開始し、ファイル内の直前の glock に関連する構造を参照します (H: はホルダー、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 のコマンドによって生成された (約 18 MB のファイルからの) 抜粋です。この図の glock は、glock ダンプのより興味深い機能のいくつかを示すために選択されています。
glock の状態は、EX (排他的)、DF (据え置き)、SH (共有)、または UN (ロック解除) になります。この状態は、DLM null ロック状態を表す可能性がある UN を除いて、または GFS2 が DLM ロックを保持しないことを除いて、DLM ロックモードに直接対応します (上記の I フラグにより異なります)。glock の s: フィールドはロックの現在の状態を示し、ホルダーの同じフィールドは要求されたモードを示します。ロックが許可されると、ホルダーのフラグに H ビットが設定されます (f: フィールド)。設定されていない場合は、W wait ビットが設定されます。
N: フィールド (数値) は、各項目に関連付けられた番号を示します。glock の場合、タイプ番号の後に glock 番号が続くため、上記の例では最初の glock は n:5/75320 となり、inode 75320 に関連する
iopen
glock を示します。inode と iopen
glock の場合、glock 番号は常に inode のディスクブロック番号と同じになります。
注記
debugfs glock ファイルの glock 番号 (n: フィールド) は 16 進法ですが、トレースポイントの出力には 16 進法で表示されます。これは、glock 番号がかつてから常に 16 進法 で記述されてきたためですが、トレースポイントの出力は、別のトレースポイント出力 (例: blktrace) および stat(1) からの出力と数値を容易に比較できるようにするために 10 進法 が選択されました。
ホルダーと glock の全フラグのリストは、表B.4「glock フラグ」 と 表B.5「glock ホルダーフラグ」 に記載されています。ロック値のブロックの内容は、現在
debugfs
インターフェイスからは利用できません。
表B.3「glock の種類」 は、さまざまな glock タイプの意味を示しています。
タイプ番号 | ロックタイプ | 使用方法 |
---|---|---|
1 | trans | トランザクションのロック |
2 | inode | inode のメタデータとデータ |
3 | rgrp | リソースグループのメタデータ |
4 | meta | スーパーブロック |
5 | iopen | 最後に閉じた inode の検出 |
6 | flock | flock(2) syscall |
8 | quota | クォータ操作 |
9 | journal | ジャーナルミューテックス |
重要な glock フラグの 1 つは、l (locked) フラグです。これは、状態変更が行われるときに glock 状態へのアクセスを調整するのに使用されるビットロックです。これは、ステートマシンが DLM を介してリモートロック要求を送信するときに設定され、完全な操作が実行された場合にのみ消去されます。これは、複数のロック要求が送信され、その間にさまざまな無効化が発生することを意味します。
表B.4「glock フラグ」 は、さまざまな 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 | Object | glock がオブジェクトに関連付けられている (つまり、タイプ 2 の glock の場合は inode、タイプ 3 の glock の場合はリソースグループ) ときに設定されます。 |
p | Demote in progress | glock は、降格要求に応答中です。 |
q | Queued | ホルダーが glock にキューイングされると設定され、glock が保持されるとクリアされますが、残りのホルダーはありません。アルゴリズムの一部として使用され、glock の最小保持時間を計算します。 |
r | Reply pending | リモートノードから受信した返信の処理を待機中です。 |
y | Dirty | この glock を解放する前にデータをディスクにフラッシュする必要があります。 |
ローカルノードで保持されているノードと競合するモードでロックを取得する必要のあるノードからリモートコールバックを受け取ると、D (降格) または d (降格保留) のフラグのいずれかが設定されます。特定のロックの競合が発生した場合の枯渇状態を防ぐために、各ロックには最小保持時間が割り当てられます。最小保持時間の間にロックされていないノードは、その期間が経過するまでロックを保持できます。
期間が過ぎると、D (降格) フラグが設定され、必要な状態が記録されます。この場合、次にホルダーキューに許可されたロックがなくなると、ロックが降格になります。期間が過ぎていない場合は、代わりに d (降格保留) フラグが設定されます。また、これによりステートマシンが d (降格保留) を消去し、最小保持期間が過ぎた場合に D (降格) を設定します。
glock に DLM ロックが割り当てられている場合は、I (初期) フラグが設定されます。これは、glock が最初に使用され、最終的に glock が解放されるまで (DLM ロックが解除されるまで)I フラグが設定された状態が続く場合に発生します。