如何让 Linux 内核跟踪我在可加载模块中创建的块设备的 io 统计信息?

如何让 Linux 内核跟踪我在可加载模块中创建的块设备的 io 统计信息?

我一直在寻找,每个人都解释了 /proc/diskstats 文件,但似乎没有人解释这些数据来自哪里。

我发现了这个评论:

Just remember that /proc/diskstats is tracking the kernel’s read requests–not yours.

在本页面:

https://kevinclosson.net/2018/10/09/no-proc-diskstats-does-not-track-your-physical-i-o-requests/

但基本上我的问题是,我有一个创建块设备的内核模块,并通过 blk_queue_make_request 而不是 blk_init_queue 设置的请求处理程序处理请求,就像 dm 一样,我不希望内核为我排队请求。

一切正常,但 /proc/diskstats 中没有显示任何内容 我缺少什么魔法才能将我的统计数据放在那里,以便它显示在 iostat 中?我假设内核会统计这些信息,因为它正在处理对内核模块的请求,但显然不是。或者我在某处缺少一面旗帜或其他东西。

有任何想法吗?

答案1

统计文件名为磁盘统计数据,而不是块开发统计数据或类似数据。这是一个线索。统计数据由diskstats_show()in输出block/genhd.c,它使用struct gendisk结构体作为其信息源。

您已经创建了一个块设备,但对于常规磁盘来说这只是第一步。之后,通常会为设备驱动程序提供的所有次要编号alloc_disk()分配s,并在指定设备驱动程序处理的每个磁盘的基本属性之后。struct gendiskadd_disk()

但是您说过您不想排队,因此您可能跳过了该部分而只获得基本的块设备。好吧,你得到了你想要的——事实上,基本的块设备是所以精简而平均,甚至不需要花时间来统计统计数据,除非让你的模块这样做。

看来您的驱动程序/proc/diskstats只有在参与gendisk/genhd框架时才会获取其磁盘。如果您不想使用它,那么您似乎必须收集自己的统计数据。

有关更多详细信息,这可能会有所帮助:https://olegkutkov.me/2020/02/10/linux-block-device-driver/

答案2

所以我找到了它......看来内核为你提供了帮助函数......

您需要 request_queue、bio 和 gendisk,在处理 io 之前和之后调用这些...

unsigned long start_time;
start_time = jiffies;
generic_start_io_acct(q, bio_op(bio), bio_sectors(bio), &gd->part0);

generic_end_io_acct(q, bio_op(bio), &gd->part0, start_time);

瞧,统计信息和您的块设备开始显示在 iostat 中。

相关内容