`/dev/null`と`null_blk`によって駆動されるデバイスの違い

`/dev/null`と`null_blk`によって駆動されるデバイスの違い

最近触れた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/nullb0EOFは返されずに中断されます。
  • また、参考までにカーネル文書には設定パラメータが記載されていますが、同様の設定オプションは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/null0(読み取り用)または書き込みサイズ(書き込み用)を返すことがすべてであるため、非常に最適化されています。彼とは対照的に文書null_blk

さまざまなブロック層の実装をベンチマークするために

これは、要求が実際であるかのように、関連するI / O要求管理コードを実行することを意味します。その時実際に読み取り/書き込み操作を実行せずに要求を完了したとマークします。これは、要求ごとにより多くの作業を実行し/dev/nullfio結果を解釈する必要があることを意味します。

関連情報