2012-01-10 9 views
3

は、のは、私が上のファイルへのデータの1ギガバイトを書きたいとしましょうwrite(2)システムコールを使用してext3 Linuxファイルシステムを言うと、これは非常に忙しい環境(多くの同様のI/Oの中で起こりますconcurently)。区間内の最適なバッファサイズはどのようなものです、と言う、[4 kB, 4 MB]最適なバッファサイズ(2)

  1. O_DIRECTオープンフラグ、または
  2. O_DIRECTを使用してを使用しない場合があることを行うには?

「自分で確認してください」という回答はしないでください。「ファイルシステム」の人から回答を得たいと思います。

+0

自分自身をベンチマークするようにしてください。私はサイズが少なくとも[16kb、1MB]の範囲では大したことではないと信じています...そして、サイズには非常に敏感ではないと私は考えています...(実際のボトルネックはディスクハードウェアです) –

+0

ファイルシステムのブロックサイズを得るには、ファイル(例えば 'stat("。 ")')上で 'stat'を呼び出します。私は、結果が良いバッファサイズになると思うだろう。 –

+0

@BasileStarynkevitch:1通話あたり数キロバイトを読んでみてください。大きなブロックを読むときのパフォーマンスの向上は巨大です。しかし、もう一度、あなたが与えた範囲ではおそらく正しいでしょう。 – ThiefMaster

答えて

5

コメントで述べたように、私は正確なサイズを信じて、それがあると仮定すると、それほど重要ではありません。

  • ファイルシステムサイズの小さな倍数(ヨアヒムPileborgによってコメントがstat(".")を示唆などを参照してください)
  • 2の電源(コンピュータやカーネル彼らのようなので)
  • ない大きすぎる(あなたのプロセッサ内のいくつかのキャッシュにフィッティング例えば、例えばL2キャッシュ)
  • がメモリに整列(例えばposix_memalignを使用してページサイズには) 。

したがって、16kバイトから数メガバイトの間の2のべき乗は、おそらく適合するはずです。ほとんどの場合、ディスクの読み取りに費やされます。ファイルシステムとディスクのベンチマークは、その範囲でかなり平坦です。

4Kbytesはページサイズとディスクチャンクサイズであることが多いようです。

もちろん、ファイルシステムをmke2fsとすると、調整することもできますが、ファイルシステムのブロックサイズです。

そして最適なのはあなたのハードウェア(SSD、ハードディスク)とシステム(およびその負荷)に本当に依存していると思います。

8

答えは私の経験では、ファイルシステムそのものではなく、基本的なデバイスやハードウェアに依存しています。つまり、デバイスのバッファキャッシュと、小さなブロックなどで書き込むデバイスの機能です。あなたのファイルシステムのブロックサイズ(stat(.) - 約4 KB)のように小さいサイズで書くべきではありません - 同様に、多くの場合、低い可能性があるCPUのL2/L3キャッシュサイズを超えてはいけません512kbとして。また、持つものとして、私の経験的な経験に対応している - の操作の単位としてSSDデバイスと同様ののような64キロバイトが、その後、私は64キロバイト、128キロバイトのバッファサイズが最も最適であることを示唆していることを考えると

最高のスループット。

0

stdio.hを含めると、システムの最適サイズとしてBUFSIZを定義する必要があります。これは決して保証されるものではありませんが、広範なベンチマークを実行する能力がなければ、適切な価値があります。ベンチマークの出発点です。

+1

' 'で定義されている' BUFSIZ'はそこで提供されている 'FILE'抽象化に関係していると思います。オリジナルのポスターは、 'FILE'抽象化なしでLinux上の' write(2) 'システムコールについて話しています。なぜ私はBUFSIZがそれに関連するのか理解していません。 –

+1

AFAIK、BUFSIZは、setvbufに渡されるバッファのサイズです。 FILE抽象化は効率的な入出力を行うように設計されており、一般にバッファサイズはその点を考慮して選択されます。 –

+0

合意しましたが、なぜ 'setvbuf'-edサイズのサイズが' write'サイズと同じであるべきですか? –

関連する問題