2012-04-21 4 views
2
  1. 私はLinux 2.6カーネルでext4を使用しています。私は数百から16メガバイトの範囲であることができるバイト配列でレコードを持っています。アプリケーションには、X MBのバッファリングとX MBのwrite()の使用とを対比して、すべてのレコードに対してwrite()を使用する利点がありますか?Linux ext4ファイルシステムにデータを書き込むためにバッファリングを使用していますか?

  2. バッファリングにメリットがある場合、ext4にはどのような価値がありますか。この質問は、ext4のマルチブロックアロケータの動作をプロファイリングした人のためのものです。

  3. 私の理解では、ファイルシステムはページサイズの倍数でバッファし、ディスク上でそれらをフラッシュしようとします。 write()に提供されたバッファがファイルシステムバッファよりも大きければどうなりますか?これは、ファイルシステムをディスクに強制的にフラッシュするための粗末な方法ですか?

+3

バッファリングされていても、カーネルコールの数が異なることがあります。ここで問題になる可能性は低いですが、1k×1byteの書き込みは、一般に1×1kbytesより悪くなります...もちろん、極端なものを選んだのです。 –

答えて

0

"正しい"答えは、実際にデータで何をしたいかによって決まります。

write(2)は、カーネル空間へのシングルトリップとして設計されており、I/Oを適切に制御します。ただし、ファイルがO_SYNCで開かれていない限り、データはカーネルのキャッシュにのみ格納され、ディスクには格納されません。 O_SYNCはファイルをディスクに同期させるためにそれを変更します。ディスクへの実際の書き込みはカーネルキャッシュによって発行され、ext4はフラグメンテーションを最小化するための書き込み用の大きなバッファiircを割り当てようとします。一般に、write(2)は、データをカーネルに送るかアプリケーションのキャッシュに残すかを制御するのに適しています。

しかし、多くのレコードを書き込む場合は、writev(2)に興味があり、バッファのリストからデータを書き込みます。 write(2)と同様に、それはアトミックな呼び出しです(もちろん、直接的な入出力が使用されていない限り、実際にはディスク上ではなく、OSのセマンティクスにのみあります)。

関連する問題