Linux

如何讓 linux 核心跟踪我在可載入模組中創建的塊設備的 io 統計資訊?

  • November 10, 2020

我一直在尋找和尋找,每個人都解釋了 /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 中?我認為核心會記錄這些資訊,因為它正在處理對核心模組的請求,但顯然不是。或者我在某處或某事處遺漏了一面旗幟。

有任何想法嗎?

所以我找到了它……似乎核心為你提供了幫助函式……

您需要 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 中。

stats 文件名為disk stats,而不是blkdev stats 或類似名稱。這是一個線索。統計資訊由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/

引用自:https://unix.stackexchange.com/questions/611980