2016-07-19 32 views
2

Windows用のコマンドラインCアプリケーションでは、fwrite()を使用して受信データをSSDドライブ上の1GBファイルに連続的にダンプします。データは、約16 KBのチャンクのPCIeカードから得られます。これは、fwrite()を呼び出すときに使用したデータ数です。これらの状況では、各fwrite()コールは通常、(Windowsパフォーマンスカウンタを使用して測定した)を100μs未満としますが、を完了するのに2秒以上かかる外れ値があり、PCIeカードにバッファオーバーフローが発生します。これらの散発的な性能低下の原因は何ですか?私は彼らが起こることを防ぐために何ができるのですか?fwrite()パフォーマンス低下

アップデート#1:この問題の一部は、SSDドライブが原因であるようです。通常の機械的なHDDにダンプする場合、異常値は(1000msecではなく)100msecのオーダである。

更新#2:fwrite()の減速は、最初の1.5 GBのデータを書き込んだ後に発生するようです。 1 GBファイルにダンプすると、2番目のファイルの途中で減速が発生します。 512 MBのファイルを使用する場合は、3番目のファイルの後です。 256 MBのファイルを使用する場合は、6番目のファイルの後になります。

+2

これらの異常値はどれくらいの頻度で確認できますか?それは常にどちらか一方ですが、中間値はありません。 –

+0

私にはバッファリング効果のような音がします。それぞれの 'fwrite()'の後に 'fflush()'を追加してみてください。異常値がなくなった場合、速い 'fwrite()'呼び出しは単にメモリ内のバッファに書き込み、長い 'fwrite()'呼び出しはバッファ全体をあなたのドライブに書き込みます。 –

+0

ファイルをバイナリモード( '' wb "')で正しくオープンしたことを確認してください。テキストモードのIOは奇妙な動作を示すことがあります。 – ElderBug

答えて

1

somethingを盗む:

フラッシュメモリは、消去・書き込みサイクルを使用しています。基本的に消去は、 のメモリをすべて1に設定します。書き込みはビットを0に設定し、既存の1が0に変更されている限り、 異なるデータを書き込むことは可能です。フラッシュファイル システムでは、長時間で電気的に高価な の消去サイクルなしに、 の操作を実行できるため、この機能を利用することができます。

SSDでは、おそらくフラッシュファイルシステムを使用していません。私の推測では、SSDコントローラがいくつかのセクタを消去してスペースを解放している間、定期的に書き込みを一時停止する必要があるということです。

+0

SSDが問題の一部であるようです。通常のハードディスクドライブにファイルをダンプすると、100ミリ秒の範囲内に異常値が表示されていますが、SSDには1000ミリ秒の範囲がありません。 – geschema

関連する問題