Linux 2.6 カーネルで ext4 を使用しています。数百から 16MB のバイト配列のレコードがあります。X MB をバッファリングしてから X MB で write() を使用するのではなく、すべてのレコードに対して write() を使用するアプリケーションに利点はありますか?
バッファリングに利点があるとすれば、ext4 の適切な値は何でしょうか。この質問は、ext4 でのマルチブロック アロケーターの動作をプロファイルした人向けです。
私の理解では、ファイルシステムはページサイズの倍数でバッファリングし、それらをディスクにフラッシュしようとします。write() に提供されたバッファがファイルシステムのバッファよりも大きい場合はどうなりますか? これは、ファイルシステムを強制的に disk() にフラッシュする粗雑な方法ですか?
質問する
1268 次
1 に答える
1
「正しい」答えは、データで本当に何をしたいかによって異なります。
write(2)は、カーネル空間へのシングル トリップとして設計されており、I/O を適切に制御します。ただし、ファイルが O_SYNC で開かれていない限り、データはカーネルのキャッシュにのみ入れられ、ディスクには入れられません。O_SYNC は、ファイルがディスクに確実に同期されるように変更します。ディスクへの実際の書き込みはカーネル キャッシュによって発行され、ext4 は断片化を最小限に抑えるために書き込み用に大きなバッファーを割り当てようとします (iirc)。一般に、バッファリングされたファイルまたは O_SYNC ファイルを使用したwrite(2)は、データがカーネルに送られるか、それともアプリケーションのキャッシュに残っているかを制御する良い方法です。
ただし、大量のレコードを書き込む場合は、バッファのリストからデータを書き込むwritev(2)に興味があるかもしれません。write(2)と同様に、これはアトミックな呼び出しです (もちろん、これは OS セマンティクスのみであり、実際にはディスク上ではありません。ただし、やはり Direct I/O が使用されている場合を除きます)。
于 2012-06-16T14:17:26.377 に答える