web-dev-qa-db-ja.com

Linuxでのファイルキャッシュの適切なブロックサイズはいくつですか?

デバイスのブロックサイズは通常512バイトですが、ファイルシステムのブロックサイズは通常4096バイトです。なぜ違うのですか?デバイスとファイルシステムのブロックサイズに512Bと4KBが適しているのはなぜですか?ユーザー空間ライブラリでディスク読み取りをキャッシュするのに最適なブロックサイズはどれですか。

5
Cyker

デバイスブロックサイズは、システムがHDDコントローラーと通信するブロックサイズです。 HDDを読み書きしたい場合は、次のようになります。

  1. 読んだ:

    1. CPU-> HDDコントローラ:「ブロック43623626のデータを送ってください」
    2. HDDコントローラー-> CPU:「完了、ここにあります:0xfce2c0deebed ...」
  2. 書く:

    1. CPU-> HDDコントローラ:「このデータをブロック3452345に書き込んでください:0xfce2c0deebed ...」
    2. HDDコントローラ-> CPU:「完了」

ここで、ブロック番号は2354242番目の512バイトブロックの名前を意味します。

理論的には、任意のブロックサイズを使用できる可能性があります。ほとんどのデバイスは512バイトのブロックを使用しており、一部のデバイス、特に大容量のHDDは4096バイトのブロックを使用しています。一部の光メディアは2304バイトのブロックを使用しています。

重要なことは、ブロックデバイスコントローラーは、その上のファイルシステムから何も認識しないことです。それは、そのブロックサイズのメディアの読み取りと書き込みのみが可能です。これは、ブロックデバイスドライバーが使用するものです。カーネルのブロックデバイスを提供します。基本的には単一の大きなバイト配列です。どのように分割されているか、どのfsがそれを使用しているかは関係ありません。

ファイルシステムのブロックサイズは、ファイルシステムのデータ構造がファイルシステムで編成されるブロックサイズです。これはファイルシステムの内部機能ですブロック指向のデータ構造を使用する必要すらなく、一部のファイルシステムはそれを実行しません

Ext4は、最も一般的には4096バイトのブロックを使用します。

さらに、ディスクIOデータは通常、プロセスによって直接処理されるのではなく、OSの仮想メモリによって処理されます。広範囲のページングを使用します。VMページサイズ通常は4096バイト(x86以外のCPUでは異なる場合があります)であり、CPUアーキテクチャによって決定されます(たとえば、新しいAMD64 CPUは2MBページを処理でき、decアルファは8192バイトページを使用できます)。

データIOを最適化するには、それらすべてが相互の乗算である場合が最適ですが、等しい場合はさらに優れています。これは通常、4096バイトのfsブロックを使用することを意味します。

それも重要です:ブロックデバイスがパーティション化されている場合、パーティションは正確なページサイズの開始/終了でなければなりません。それを行わない場合、たとえば、sda1がsdaの17.ブロックで開始する場合、物理ブロックとファイルシステムブロックがオーバーラップするため、CPUはすべてのページ読み取り/書き込み操作に対して2つの読み取り/書き込みコマンドを発行する必要があります。 。

最も一般的なシナリオでは、すべてのパーティションは8で割り切れるセクター(4096/512 = 8)で開始または開始する必要があります。

通常、低レベルブロックIOは単一ブロックの読み取り/書き込み操作では発生せず、代わりに単一のコマンドで複数のブロックが送受信されます。通常、データの再編成はそれほど大きくありませんなぜなら、メモリIOは通常、デバイスIOをブロックするよりもはるかに速いためです。したがって、これらに従わないことは大きなオーバーヘッドにはなりません。