最近触れたLinux空のブロックデバイスドライバまた、null_blk
特定のブロックデバイスのベンチマークではなく、I / Oスタックをベンチマークしています。このドライバで作成されたデバイス(/dev/nullb0
たとえば、デバイス名を使用)は非常に興味深いものです。特に、/dev/null
デバイス名が類似していることを考慮すると、さらにそうです。 Stackoverflowはこのトピックに関する既存の質問を見つけることができなかったので、説明を求めることにしました。
私の主な質問は次のとおりです。/dev/null
デバイスドライバで生成されたブロックデバイスとの違いは何ですかnull_blk
?
これまでにいくつかの違いを見つけました。
- まず、(私が理解している限り)空のデバイスは
/dev/null
ドライバを通過しません。ただし、その下に作成されたデバイスは、null_blk
データが通過する必要がある実際のブロックドライバです。また、fio
両方のデバイスで実行して、/dev/null
ランダム読み取りIOPSとコミット待ち時間の点でパフォーマンスが優れていることを確認しました。 /dev/null
第二に、読み取りはEOF(例:)が生成されることを知っていますが、cat /dev/null
試してみるとcat /dev/nullb0
EOFは返されずに中断されます。- また、参考までにカーネル文書には設定パラメータが記載されていますが、同様の設定オプションは
null_blk
表示されません。/dev/null
似た名前でも大きな違いがあるようです。これらの違いについてより正式な洞察力や説明を提供できる人はいますか?ありがとうございます!
答え1
/dev/null
はいデバイスドライバで処理されますが、これはとても簡単です。。
/dev/null
との主な違いは、null_blk
前者はキャラクターデバイスであり、後者はブロックデバイスであることです。以前のプロセス文字シーケンスデバイスを使用するシステム呼び出しと、ドライバでそのタスクを実装するコードとの間に、多くの間接的な操作なしで、それを使用するプログラムが呼び出すタスクを直接実装します。後者のより複雑、セクタ全体で実行され、コマンドキューなどをサポートします。単一の要求を処理するには、より多くの作業が必要です。
もちろん目的にも大きな違いがあります。/dev/null
実際の直接使用のためのものですが、null_blk
ブロックデバイス処理スタックの他の部分をベンチマークしたいカーネル開発者のためのサポート機能です。
答え2
/dev/null
「文字デバイス」なので、すべての読み取りはnullを返し、すべての書き込みは追加の副作用なしに完全に完了します。これは1974年のV5 UNIX以降の意味体系であり、POSIXによって施行されます。これをパラメータ化するパラメータはありません。
ドライバによって生成されたデバイスはnull_blk
「ブロックデバイス」です。つまり、サイズとキャッシュが固定されていることを意味します。提供されたデバイスはnull_blk
すべての書き込みを無視し、すべて0を返すので/dev/zero
。
/dev/null
提供されるデバイスと目的null_blk
は異なります。/dev/null
0(読み取り用)または書き込みサイズ(書き込み用)を返すことがすべてであるため、非常に最適化されています。彼とは対照的に文書、null_blk
さまざまなブロック層の実装をベンチマークするために
これは、要求が実際であるかのように、関連するI / O要求管理コードを実行することを意味します。その時実際に読み取り/書き込み操作を実行せずに要求を完了したとマークします。これは、要求ごとにより多くの作業を実行し/dev/null
、fio
結果を解釈する必要があることを意味します。