9.4. glock debugfs 接口
glock debugfs
接口允许 glocks 的内部状态和持有者的视觉化,并包括了在一些情况下被锁定的对象的一些概述详情。文件的每一行要么以 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 基准过程中,命令 cat /sys/kernel/debug/gfs2/unity:myfs/glocks >my.locks >my.locks >my.lock
所产生的一系列摘录(大约 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,它与 inode 75320 相关。对于 inode 和 iopen
glocks,glock 号始终与内节点的磁盘块号相同。
debugfs glocks 文件中的 glock 号(n: field)以十六进制表示,而追踪点输出以十进制表示。这是因为历史原因;glock 号总是写成十六进制,但追踪点会选择十进制,因此号可以轻松地与其他追踪点输出(例如,来自 blktrace
)和来自 stat
(1)的输出进行比较。
持有者和 glock 的所有标记的完整列表都在以下 "Glock Flags" 表和 Glock 持有者 中的 "Glock Holder Flags"表中设置。目前无法通过 glock debugfs
接口获取锁值块的内容。下表显示了不同 glock 类型的含义。
类型号 | 锁定类型 | 使用 |
---|---|---|
1 | trans | 事务锁定 |
2 | inode | 内节点元数据和数据 |
3 | rgrp | 源组群元数据 |
4 | meta | 超级块 |
5 | iopen | 内节点最近探测 |
6 | flock |
|
8 | quota | 配额操作 |
9 | journal | Journal mutex |
更重要的 glock 标记之一就是 l (locked) 标记。这是执行状态更改时用于识别对 glock 状态的访问的位锁定。当状态机器要通过 DLM 发送远程锁定请求时设置它,只有在执行完操作时才会清除它。有时这意味着已发送了多个锁定请求,不同时间发生各种无效请求。
下表显示了不同的 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 锁定被解锁)。