我一直在寻找,每个人都解释了 /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 gendisk
add_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 中。