仕事でVB(.NETでなく、VB6)を久々にやっている。
思わぬ障害があり、手こずりやっと対策できたので、それを書き留めておく。
1アプリで、秒間2ファイルを書き出す処理を行う。
(それと並行して、秒間3ファイルを削除する処理場合がある。削除処理は1時間のうちに最初の40分くらいで完了する。)
このアプリを16個起動すると、ファイルの書出しが、5~10分毎に5~15秒ほど行われないことがある。16アプリケーションの書出ししない不具合の発生タイミングはほぼ同じ。
まず、VBの標準的なファイル操作系の命令をAPIにした。
①書出すファイルが存在時は削除(Kill → DeleteFile API)
②ファイルの生成(Open For Output → CreateFile API)
③データ出力(Put → WriteFile API)
④ファイルクローズ(Close → CloseHandle API)
状況はほんのちょっと改善されたが、まだまだ。
思わぬ障害があり、手こずりやっと対策できたので、それを書き留めておく。
1アプリで、秒間2ファイルを書き出す処理を行う。
(それと並行して、秒間3ファイルを削除する処理場合がある。削除処理は1時間のうちに最初の40分くらいで完了する。)
このアプリを16個起動すると、ファイルの書出しが、5~10分毎に5~15秒ほど行われないことがある。16アプリケーションの書出ししない不具合の発生タイミングはほぼ同じ。
まず、VBの標準的なファイル操作系の命令をAPIにした。
①書出すファイルが存在時は削除(Kill → DeleteFile API)
②ファイルの生成(Open For Output → CreateFile API)
③データ出力(Put → WriteFile API)
④ファイルクローズ(Close → CloseHandle API)
状況はほんのちょっと改善されたが、まだまだ。
そこで、書込み後にバッファフラッシュ(FlushFileBuffers)をする。これは、簡単に言うとキャッシュ(メモリ)に溜まった(ファイルとして書出す)データをディスクに強制的に書き込ませる。
③④の間にFlushFileBuffersをする。すると、なんとあれほど出ていた障害がなくなっているでは・・・すごい
おそらくの見解だが、キャッシュデータに溜まったデータはOSが暇なときにディスクに出力する。
しかし、今回のように大量のファイル操作を行うと暇なときはなくキャッシュにデータが溜まり続ける。キャッシュがヤバイ状況になった時にOSはアプリを止めて?というか優先度を落としてディスクにデータを書き出す処理をする。んで、障害発生!
フラッシュ命令を書込み後毎回やるとパフォーマンス低下になるという情報もどっかのHPにも書いてあったけど、問題なさそうなのでこのままGoだね
ヤレヤレ これって元バグじゃん orz
③④の間にFlushFileBuffersをする。すると、なんとあれほど出ていた障害がなくなっているでは・・・すごい
おそらくの見解だが、キャッシュデータに溜まったデータはOSが暇なときにディスクに出力する。
しかし、今回のように大量のファイル操作を行うと暇なときはなくキャッシュにデータが溜まり続ける。キャッシュがヤバイ状況になった時にOSはアプリを止めて?というか優先度を落としてディスクにデータを書き出す処理をする。んで、障害発生!
フラッシュ命令を書込み後毎回やるとパフォーマンス低下になるという情報もどっかのHPにも書いてあったけど、問題なさそうなのでこのままGoだね
ヤレヤレ これって元バグじゃん orz
Trackback: 0
- TrackBack URL for this entry
- http://www.furuken.net/blog/action.php?action=plugin&name=TrackBack&tb_id=137
- Listed below are links to weblogs that reference
- ディスク書込みにおけるバッファフラッシュ from ぼそぼそ













