C.4. glock debugfs 界面
glock
debugfs
界面允许 glock 和 holder 内部状态的虚拟化,同时还包含一些在某些情况下被锁定的对象详情小结。文件的每一行都以 G 打头:无缩进(代表 glock 本身)或者以不同字母打头,缩进一个空格,代表文件中紧挨着它的 glock 关联的结构(H:代表 holder,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]
The above example is a series of excerpts (from an approximately 18MB file) generated by the command
cat /sys/kernel/debug/gfs2/unity:myfs/glocks >my.lock
during a run of the postmark benchmark on a single node GFS2 file system. The glocks in the figure have been selected in order to show some of the more interesting features of the glock dumps.
glock 状态可以是 EX(独家,exclusive)、DF(延迟,deferred)、SH(共享,shared)或者 UN(解锁)。这些状态都直接与 DLM 所模式对应,UN 除外,因为它可能表示 DLM null 锁状态,或者 GFS2 没有 DLM 锁(请参考上面的具体 I 标签解释)。 glock 的 s: 字段表示请求的模式。如果有锁定,则 holder 会在其标签(f: 字段)中有 H 字节。否则它就会有 W(等待)字节。
The n: field (number) indicates the number associated with each item. For glocks, that is the type number followed by the glock number so that in the above example, the first glock is n:5/75320; that is, an
iopen
glock which relates to inode 75320. In the case of inode and iopen
glocks, the glock number is always identical to the inode's disk block number.
注意
debugfs glock 文件中的 glock 数(n: 字段)是十六进制,但跟踪点输出则以十进制列出它们。这是有历史原因:glock 数一直是以十六进制编写,但为跟踪点选择的是十进制数,这样是为了方便与其它跟踪点输出(例如
blktrace
的输出)和 stat
(1) 的输出进行比较。
表 C.3 “Glock 类型” 演示了不同 glock 类型的含义。
类型数 | 锁类型 | 用法 |
---|---|---|
1 | trans | 事务锁 |
2 | inode | 内节点元数据和数据 |
3 | rgrp | 资源组元数据 |
4 | meta | 超级块 |
5 | iopen | 内节点最后一次探测 |
6 | flock | flock (2) syscall |
8 | quota | 配额操作 |
9 | journal | 日志互斥 |
最重要的 glock 标签之一是 I(锁定)标签。这是字节锁,是用来在执行状态更改时对 glock 状态进行仲裁访问。在状态机器要通过 DLM 发送远程锁请求时会设置该标签,且只有在完成操作后才会清除。有时这可以意味着已发出一个以上锁请求,在间隔间出现各种无效。
表 C.4 “Glock 标签” 演示了不同 glock 标签的含义。
标签 | 名称 | 含义 |
---|---|---|
d | 等待降级 | 递延(远程)降级请求 |
D | 降级 | 降级请求(本地或者远程) |
f | 清除日志 | 释放这个 glock 前需要提交该日志 |
F | 冻结 | 回复忽略的远程节点 -- 恢复进行中。 |
i | 失效进行中 | 正在让这个 glock 中的页面失效 |
I | Initial | 设定什么时候 DLM 锁与这个 glock 关联 |
l | Locked | glock 正在更改状态的过程中 |
L | LRU | 当 glock 在 LRU 列表中时设置 |
o | 对象 | glock 与某个对象关联时设定(即用于类型 2 glock 的内节点以及用于类型 3 glock 的资源组) |
p | 降级中 | glock 正在与降级请求响应 |
q | 排队的 | 拥有者排队等待 glock 时设定,并在持有 glock 但没有拥有者时清除。是用于计算 glock 最小拥有时间的算法的一部分。 |
r | 回复等待 | 从远程节点中接收的回复正在等待过程中 |
y | 脏数据 | 释放这个 glock 前要刷新到磁盘的数据 |
当从以与本地节点冲突的模式获得锁定的某个节点收到远程 callback 时,会设定标签 D(降级)或者 d(降级等待)标签。要防止在竞争具体锁时出现匮乏情况,为每个锁都分配了最小保留时间。如果某个节点的锁没有最小保留时间,则允许保留该锁直到时间间隔过期。
如果时间间隔过期,则会设定 D(demote,降级)标签,并记录请求的状态。这样,下次就不会在 holder 队列中设置锁,该锁就会被降级。如果时间间隔没有过期,那么就会设置 d(降级等待)标签,并在超过最短保留时间时设定 D(降级)标签。
将为 glock 分配 DLM 锁时会为其设置 I(initial)标签。这种情况会在第一次使用 glock 时发生,然后这个 I 标签会一直保留到最终释放 glock(即解开 DLM 锁)为止。