Red Hat Training

A Red Hat training course is available for RHEL 8

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 类型的含义。

表 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 锁定被解锁)。