ロード可能モジュールによって生成されたブロックデバイスのio統計をLinuxカーネルに追跡させるにはどうすればよいですか?

ロード可能モジュールによって生成されたブロックデバイスのio統計をLinuxカーネルに追跡させるにはどうすればよいですか?

私は探していて、誰もが/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/

しかし、基本的に私の問題は、ブロックデバイスを作成し、dmと同様に、blk_init_queueの代わりにblk_queue_make_requestによって設定されたリクエストハンドラを介してリクエストを処理するカーネルモジュールがあることです。そして、カーネルがリクエストをキューに追加したくありません。

すべてがうまくいきますが、/proc/diskstatsには何も表示されません。 iostatに表示されるように統計をそこに置くのに私が見逃しているのは何ですか?私はカーネルがカーネルモジュールに対する要求を処理しているので、この情報を計算していると仮定しましたが、明らかにそうではありませんでした。またはどこかにフラグがありません。

どんなアイデアがありますか?

答え1

統計ファイルの名前は次のとおりです。ディスク代わりに統計ブロック開発統計または類似のデータ。これは手がかりです。統計は、構造を情報ソースとして使用するdiskstats_show()inによって出力されます。block/genhd.cstruct gendisk

ブロックデバイスを作成しましたが、これは通常のディスクの最初のステップです。 s は通常、デバイスドライバが提供するすべてのマイナー番号に割り当てられ、alloc_disk()デバイスドライバが処理する各ディスクのデフォルト属性を指定した後に指定されます。struct gendiskadd_disk()

しかし、キューに入れたくないと言われたので、その部分をスキップして基本ブロックデバイスだけを受け取ったはずです。まあ、あなたは欲しいものを手に入れます。実際、基本ブロック装置は以下の通りである。だから凛と卑劣さ、あなたは統計を処理するのに時間を費やす必要さえありません。あなたモジュールにこれを行うようにしてください。

あなたのドライバは、/フレームワーク/proc/diskstatsに参加しているときにのみディスクを獲得しているようです。使用したくない場合は、統計を直接収集する必要があるようです。gendiskgenhd

詳細については、次のことが役立ちます。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に表示され始めます。

関連情報