デバイスブロックサイズは通常512バイト、ファイルシステムブロックサイズは通常4096バイトです。なぜ違うの?デバイスとファイルシステムのブロックサイズに512Bと4KBを選択するのが良い理由は何ですか?ユーザー空間ライブラリからディスク読み取りをキャッシュするのに最適なブロックサイズは何ですか?
答え1
デバイスブロックサイズは、システムがHDDコントローラと通信するために使用するブロックサイズです。ハードドライブを読み書きする場合は、次のことが発生します。
読む:
- CPU - > HDDコントローラ:「43623626ブロックのデータを送信してください」
- HDD コントローラー->CPU: "完了、ここにあります: 0xfce2c0deebed..."
書く:
- CPU -> HDDコントローラ:「このデータをブロック3452345:0xfce2c0deebed ...に書き込んでください。」
- HDDコントローラ - > CPU:「完了」
ここで、ブロック番号は、2354242番目の512バイトブロックの名前を表します。
理論的には、すべてのブロックサイズを使用できます。ほとんどのデバイスは512バイトブロックを使用し、一部(特に大きなHDD)は4096バイトブロックを使用します。一部の光メディアは2304バイトのブロックを使用します。
重要:ブロックデバイスコントローラは、そのファイルシステムについて何も知りません。ブロックサイズだけメディアにブロックを読み書きできます。これは、ブロックデバイスドライバがカーネルにブロックデバイスを提供するために使用するものです。本質的に大きなバイト配列です。パーティションがどのように分割されているか、どのファイルシステムがそれを使用しているかは重要ではありません。
ファイルシステムブロックサイズは、ファイルシステムデータ構造が構成されるファイルシステムのブロックサイズである。ファイルシステムの内部特性であり、ブロック指向のデータ構造を使用する必要さえなく、一部のファイルシステムではそうしません。。
Ext4は最も一般的に4096バイトのブロックを使用します。
さらに、ディスクIOデータは通常、プロセスで直接処理されるのではなく、オペレーティングシステムの仮想メモリで処理される。ページネーションを広く使用します。 VMページサイズは通常4096バイト(x86以外のCPUによって異なる場合があります)で、CPUアーキテクチャによって決まります。 (たとえば、最新のamd64 CPUは2MBページを処理できます。またはdec alphaは8192バイトページを使用します。)
データIOを最適化するには、互いに乗算するのが最善です。これは通常4096バイトのfsブロックを使用することを意味します。
同様に重要なことは次のとおりです。ブロックデバイスが分割されている場合、パーティションは正しいページサイズで開始/終了する必要があります。。そうしないと、たとえば、sda1がsdaのブロック17で始まると、物理ブロックとファイルシステムブロックが重複するため、CPUはすべてのページ読み取り/書き込み操作に対して2つの読み取り/書き込みコマンドを実行する必要があります。
最も一般的な場合、これは次のことを意味します。すべてのパーティションは、8で割ることができるセクタ(4096 / 512 = 8)で開始または開始する必要があります。
一般に、低レベルのブロックIOは単一ブロックの読み取り/書き込み操作では発生しませんが、単一のコマンドで複数のブロックを送信/受信します。メモリIOは通常ブロックデバイスIOよりはるかに高速であるため、データ再構成は通常大きなオーバーヘッドではありません。したがって、これに従わなくても、かなりのオーバーヘッドは発生しません。