2017-01-19 6 views
0

非常に高速な10TB RAID 0jbodに接続されたデータキャプチャシステムがあります。fwriteはMemFreeをすべて消費していますが、fflushは機能しません。

約1.25GB/sで4つのMiBデータバッファを受信し、fopenで開かれたシーケンシャルファイルに書き込まれ、10 GiBがfallocateされ、fwriteで書き込まれます。毎回10 GiBを落としてから10 GiBを得る。最後に、キャプチャがfcloseで完了したら閉じます。

問題は、キャプチャが進行中に、/ proc/meminfo MemFreeドロップが表示され、キャッシュされていることがわかります。つまり、fflushは何もしないようです。これは、システムに約200 MiB MemFreeが入るまで続きます。データレートが非常に急上昇し、キャプチャが失敗する原因になります。

私たちがfflushを呼び出したときにスパイクが10 GiBの周りに落ちることを期待していましたが、何もしていないようです。ファイルはfcloseを呼び出すまでフラッシュされません。

この現象が発生する理由は何ですか? setvbuf(hFile、NULL、_IONBF、0)を使用しても効果がないようです。

+0

私は特定の問題が何であるか分かりませんが、下位レベルの呼び出しで 'open'と' write'を使用したいと思うかもしれません。 'fopen'と' fwrite'を使う必要がある特別な理由はありますか?また、 'fallocate'はどのようなメリットをもたらしますか?スペースは、ファイルに書き込むときに割り当てられます。 –

+0

AndySchweig動作は、open/write/closeを使用しても発生します。 (私は脱退者の背後にある考えはパフォーマンスを向上させることだったと思う) – Piotr

+0

明白な質問:あなたのディスクアレイは1.25GB /秒を書き込むことはできますか? – duskwuff

答えて

2

無料のメモリドロップが表示されたら、OSはそのバッファキャッシュ(基本的には使用可能なすべてのメモリ)に書き込みます。さらに、stdioのfwrite()は単独でバッファリングしています。このため、リソースの競合が進行中です。お使いのOSが使用可能なメモリの上限に達すると、このリソースの競合は書き込みが遅くなり、メモリの使用率が高くなります。ボトルネックはデータキャプチャを見逃してしまいます。

独自のバッファを管理しているので、write()O_DIRECTを使用して、このバッファリングをすべて回避することができます。

関連する問題