阿里云Linux如何优化IO Hang检测机制?

26阅读
0评论
0点赞

阿里云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:

  1. 修改磁盘 vdb 下用于检测 IO Hang 的阈值为 10000 ms:

    echo 10000 > /sys/block/vdb/queue/hang_threshold
  2. 查看修改后的阈值:

    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 的差值即为在该资源上等待的耗时。
评论(0)
暂无评论,期待您的发言...
发表评论