阿里云Linux如何优化IO Hang检测机制?
阿里云Linux 2及3通过扩展核心数据结构改进了检测IO Hang的能力。文中介绍了几个关键接口,如查看和调整IO Hang阈值、查询超出阈值的I/O数量以及获取详细的IO Hang信息等,这些接口有助于快速定位并解决系统因长时间I/O操作导致的不稳定问题。
概述
IO Hang 是指在系统运行过程中,由于某些 I/O 操作耗时过长而导致的系统不稳定或宕机现象。为了准确检测 IO Hang,Alibaba Cloud Linux 2 和 Alibaba Cloud Linux 3 扩展了核心数据结构,增强了在较低系统开销下快速定位并检测 IO Hang 的能力。本文主要介绍实现此功能的接口及其使用示例。
接口说明
接口列表
接口 | 描述 |
---|---|
/sys/block/<device>/queue/hang_threshold |
查看和修改用于检测 IO Hang 的阈值(单位:毫秒,默认值:5000)。 |
/sys/block/<device>/hang |
输出对应设备上超过 IO Hang 阈值的读写 I/O 数量。 |
/sys/kernel/debug/block/<device>/rq_hang |
获取 IO Hang 的详细信息。 |
/proc/<pid>/wait_res |
获取进程正在等待的资源信息。 |
/proc/<pid>/task/<tid>/wait_res |
获取线程正在等待的资源信息。 |
变量说明
变量名 | 说明 |
---|---|
<device> |
块存储设备名。 |
<pid> |
进程 ID。 |
<tid> |
线程 ID。 |
使用示例
示例一: 修改 IO Hang 阈值
您可以通过调用接口 /sys/block/<device>/queue/hang_threshold
来修改用于检测 IO Hang 的阈值。以下示例将默认阈值 5000 ms 修改为 10000 ms:
-
修改磁盘
vdb
下用于检测 IO Hang 的阈值为 10000 ms:echo 10000 > /sys/block/vdb/queue/hang_threshold
-
查看修改后的阈值:
cat /sys/block/vdb/queue/hang_threshold
返回结果示例:
10000
示例二: 查询 IO Hang 的读写 I/O 数量
通过调用接口 /sys/block/<device>/hang
可以查询磁盘上产生 IO Hang 的读写 I/O 数量。以下示例查询的是磁盘 vdb
:
cat /sys/block/vdb/hang
返回结果示例:
0 1
其中,左边参数表示产生 IO Hang 的读 I/O 数量,右边参数表示产生 IO Hang 的写 I/O 数量。
示例三: 获取 IO Hang 的详细信息
调用接口 /sys/kernel/debug/block/<device>/rq_hang
可以获取产生 IO Hang 的详细信息。以下示例中的磁盘为 vdb
:
cat /sys/kernel/debug/block/vdb/rq_hang
返回结果示例:
ffff9e50162fc600 {.op=WRITE, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=118, .internal_tag=67, .start_time_ns=1260981417094, .io_start_time_ns=1260981436160, .current_time=1268458297417, .bio = ffff9e4907c31c00, .bio_pages = { ffffc85960686740 }, .bio = ffff9e4907c31500, .bio_pages = { ffffc85960639000 }, .bio = ffff9e4907c30300, .bio_pages = { ffffc85960651700 }, .bio = ffff9e4907c31900, .bio_pages = { ffffc85960608b00 }}
上述示例显示了 IO 请求的详细信息,从信息中可以获取到 IO 请求开始时间 io_start_time_ns
已被赋值,表明该 IO 请求未被及时处理,从而导致 IO 耗时过长。
示例四: 获取进程正在等待的资源信息
调用接口 /proc/<pid>/wait_res
可以获取进程正在等待的资源信息。以下示例查询的进程 ID 为 577
:
cat /proc/577/wait_res
返回结果示例:
1 0000000000000000 4310058496 4310061448
返回结果中参数说明如下:
- Field 1: 等待的资源类型。1 表示文件系统中的缓存页(page),2 表示块层 bio。
- Field 2: 等待的资源(page/bio)地址。
- Field 3: 等待资源开始时间。
- Field 4: 读取该文件的当前时间,与 Field 3 的差值即为在该资源上等待的耗时。