9.4. glock debugfs 接口

glock debugfs 接口允许视觉化 glocks 的内部状态和拥有者,并包括了在一些情况下被锁定的对象的一些概述详情。文件的每一行都以 G: 开头,没有缩进(代表 glock 本身),或者以不同的字母开始,使用单个空格缩进,代表在文件中立即与 glock 关联的结构(H: 是拥有者、I: 是一个内节点、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]

上面的例子是一系列摘录(来自由命令 cat /sys/kernel/debug/gfs2/unity:myfs/glocks >my.locks >my.locks >my.lock 在单一节点 GFS2 文件系统运行基准的大约 18MB 文件)图中的 glocks 已选择,以便显示一些更值得关注的 glock 转储特性。

glock 状态是 EX(专用)、DF(推迟)、SH(共享)或 UN(未锁定)。这些状态与 DLM 锁定模式直接对应,但 UN 可能代表 DLM null 锁定状态,或者 GFS2 没有包含 DLM 锁定(取决于上面解释的 I 标记)。glock 的 s: 字段显示锁定的当前状态,拥有者中的同一字段指示请求的模式。如果准许了锁定,则拥有者将在标记(f: field)中带有 H 位。否则,它将设置 W wait 位。

n: 字段(数字)表示与每个项目关联的数字。对于 glocks,这是类型号后接 glock 号,在上例中第一个 glock 是 n:5/75320;,它代表了一个 iopen glock,它与内节点 75320 相关。在内节点和 iopen glocks 中,glock 号始终与内节点的磁盘块号相同。

注意

debugfs glocks 文件中的 glock 号(n: field)以十六进制表示,而追踪点输出以十进制表示。这是因为历史原因造成的;glock 数字使用十六进制,但追踪点使用十进制数字以便可轻松地与其他追踪点输出(例如 blktrace)和来自 stat(1 的输出进行比较。

holder 和 glock 标记的完整列表包括在以下的 "Glock Flags" 表中,以及 Glock holders 的 "Glock Holder Flags" 表中。目前无法通过 glock debugfs 接口获取锁定值块的内容。

下表显示了不同 glock 类型的含义。

表 9.3. Glock 类型

类型号锁定类型使用

1

trans

事务锁定

2

inode

内节点元数据和数据

3

rgrp

源组群元数据

4

meta

超级块

5

iopen

内节点最近探测

6

flock

flock(2)syscall

8

quota

配额操作

9

journal

Journal mutex

更重要的 glock 标记之一就是 l (locked) 标记。这是执行状态更改时用于识别对 glock 状态的访问的位锁定。当状态机器要通过 DLM 发送远程锁定请求时设置它,只有在执行完操作时才会清除它。有时这意味着已发送了多个锁定请求,不同时间发生各种无效请求。

下表显示了不同 glock 标记的含义。

表 9.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

Object

设置 glock 何时与对象关联(即类型为 2 glocks 的内节点,以及类型为 3 的 glock 的资源组)

p

Demote in progress

glock 正在响应降级请求

q

Queued

设定当拥有者排队到 glock 时,并在 glock 保留时清除,但没有剩余所有者。作为算法的一部分使用,计算 glock 的最小保留时间。

r

Reply pending

从远程节点接收的回复正在等待过程中

y

Dirty

释放这个 glock 前需要冲刷到磁盘中的数据

当从节点收到远程回调时,希望获得锁定时,与本地节点上保留的冲突,然后设置两个标志 D(降级)或 d(降级待处理)冲突。为了防止在特定锁定竞争时出现不足的情况,可以为每个锁定分配一个最少的时间。在时间间隔到期前,允许最小保留锁定的节点保留这个锁定。

如果时间间隔已过期,那么将设置 D(demote)标志,并记录所需状态。在这种情况下,在拥有者队列中没有允许的锁定,锁定将被降级。如果时间间隔没有过期,则将设置 d(降级待处理)标记。这也会调度状态机器清除 d(降级待处理)并在最小的静默时间已过期时设置 D(降级)。

当为 glock 分配 DLM 锁定时,会设定 I(初始)标记。当 glock 首次被使用,而且 I 标签将会一直被设置,直到 glock 最终被释放(DLM 锁定被解锁)。