非常に高速な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)を使用しても効果がないようです。
私は特定の問題が何であるか分かりませんが、下位レベルの呼び出しで 'open'と' write'を使用したいと思うかもしれません。 'fopen'と' fwrite'を使う必要がある特別な理由はありますか?また、 'fallocate'はどのようなメリットをもたらしますか?スペースは、ファイルに書き込むときに割り当てられます。 –
AndySchweig動作は、open/write/closeを使用しても発生します。 (私は脱退者の背後にある考えはパフォーマンスを向上させることだったと思う) – Piotr
明白な質問:あなたのディスクアレイは1.25GB /秒を書き込むことはできますか? – duskwuff