Windowsはどうも大きなファイルを操作するより、たくさんのファイルを一括操作する方が苦手なようです。
サーバ障害が発生し、状況確認するとexeplorer.exeのメモリ使用量が1.8GBを越えていました。
メモリリークの適切な調査方法は…と調べていた時に見つけたサイト。
こちらの情報が役立つでしょうか。
パフォーマンス モニターを使用したユーザーモード メモリ リークの検出
Windowsのプロセスメモリの見方
色々と再現テストを実施してみた結果、インパクトが大きかったのが以下のテストでした。
1.出力先のフォルダをエクスプローラで開いたままコマンドプロンプトでファイルを大量に作成。
for /L %i in (1,1,99999) do echo %DATE% %TIME>testfile_%i.txt
適当なファイルをザザっと作って、その間ファイルリストをエクスプローラで表示させ続けると…
面白い程ぐんぐん伸びていきます。
2.開いていたフォルダを閉じてみる
メモリ使用量が少し下がります。
3.もう一度フォルダを開く→更にCtrl+Aでファイルを全選択してみる
都度都度でググっとメモリ使用量が上がります。
4.全選択状態からDELキーで削除→途中でキャンセル
処理を始めた瞬間に猛烈に上がり、止めると急激に戻る。
元に戻った感じを表現したくて、グラフの時間軸が右端から左端に戻ってます。
5.削除したファイルをゴミ箱から削除
ゴミ箱から削除、としただけならそんなにメモリを消費しないのですが、
「これらのファイルを削除しますか」のダイアログで”はい”を選択すると…
すごく…大きいです…(メモリ消費が)
ここまでの作業はメモリ8GBのWin10端末で実施したのですが、削除完了まで1時間掛かりました。
という訳で、特に「大量ファイルが入ったゴミ箱の削除」はヤバいなと思いました。
障害が発生したサーバのゴミ箱サイズは12GBでカスタムサイズ指定されていたし、
サーバ上には数百のプログラムが乗っていて日々ログを吐いているのに、
ログローテーションの仕掛けがないのです。
ディスク容量が不足してきたら手作業で消す、という対応を数年に渡って続けているので、
ゴミ箱の中は相当な事になっていたと思います。