Windowsの仮想メモリは減らしてはいけない
仮想メモリは、実メモリが不足したときに外部ストレージ(HDD、SSD)にメモリの一部を退避し、見かけ上のメモリを増やす仕組みになる。
したがって十分なメモリを用意すれば仮想メモリは不要になるはずである(Linux環境の場合仮想メモリを使うと挙動がおかしくなるためわざと割当ないケースもある)。
ところがWindowsではそうならない。問題をつきつめるとメモリマップトファイルの仕様に問題があるらしい。何故か知らないがWindowsはメモリマップトファイルに仮想メモリを使っている様だ。アクティブの場合は、メモリ上にファイルをキャッシュし、スタンバイの場合はファイル上に退避する挙動をしていた。そしてメモリマップトファイルを使っているアプリを仮想メモリ環境が存在しない環境で動かすとそれだけで挙動がおかしくなる。
しかもこのメモリマップトファイルの使用量は、タスクマネージャーからは分からない。つまりプロセスの消費メモリの合計よりメモリが少ない場合は、メモリマップトファイルが消費している可能性が高い。実際のプロセスの合計より消費メモリが余り多いのでrammapと言うツールで確認した結果、メモリマップトファイルが4GBも消費していた……(そんなに要らないはずだが……何をマップしているのやら、そもそもWebからダウンロードし終えたファイルとかメモリにマップしておく必要ないだろ)
相変わらずWindowsには意味不明な実装が多い。このおかしな仕様の所為で16GBの環境でもOSを起動しただけで8GBも使用する。64GBの環境でも32GB持っていかれた(概ねAIのモデルだが)。しかもこのファイル、なかなか仮想メモリに退避しないから、OSを起動してメモリ食いで有名なブラウザ起動して4GB使うアプリを起動しようとするとメモリ不足で起動しないとかアホかよ。仕方無いので確認したらdocker for desktopのisoファイルがそのままメモリに常駐していたと言う(docker落としていたはずなのだが……)
設定を詰めた結果、すべてのドライブのページングファイルのサイズを自動的に管理するにセットすると良い感じになったが、HDDやUSBメモリをつないでいる場合は、また変わるかも知れない。謎が多い仕様である。
結局、メモリマップトファイルの不具合があるAutomatic1111版WebUIからforgeに切り替えたら消費メモリが激減したけど。
この問題は32bit時代は余り関係なかったような。


コメント