VmmemがRAMを食う理由と.wslconfigの役割
WSL2は、Linuxが解放したメモリをWindowsに返さずページキャッシュとして保持します。そのため、ディストリビューション内のプログラムをすべて閉じても、大きなビルドの後のVmmemは巨大なままです。これはカーネルの正常な動作であってリークではありませんが、ディストリビューションがブラウザーやIDE、他のVMとマシンを共有するなら、上限は明文化しておくべきです。デフォルトの50%はマシンが空だった時代の理屈で、5つの強欲なアプリが同居する16 GBのマシンでは単純に多すぎます。
ハンドルは%UserProfile%\.wslconfigで、VMの起動時に一度だけ読み込まれます。編集のたびにwsl --shutdownが必要なのはこのためです。制限はすべてのディストリビューションに一括で適用され、このファイルではディストリビューションごとの上限は設定できません。対象はWSL2だけです。第1世代はLinuxのシステムコールをWindows自身の中で処理するため、VMもVmmemも存在せず、制限するものがありません。
- memory=6GB — VM全体、つまり全ディストリビューション合計のRAM上限
- processors=4 — WSL2に見せる論理CPUコアの数
- swap=4GB — WSL2が頼れるLinuxスワップファイルのサイズ(既定:RAMの25%、上限8 GB)
- autoMemoryReclaim=gradual — 解放されたLinuxメモリをWindowsに返す実験的オプション(WSL 1.3.10以降)
- sparseVhd=true — ファイル削除時にext4.vhdxディスクが縮小できるようになる実験的オプション
上限を設定する手順
メモ帳を開き、セクション見出しの[wsl2]を貼り付け、その下にmemory=6GB、processors=4、swap=4GBの各行を書いて、%UserProfile%\.wslconfigという名前で保存します。保存ダイアログでは「ファイルの種類」を「すべてのファイル (*.*)」に、エンコードをUTF-8にしてください。この設定をしないと、Windowsは黙って.wslconfig.txtを作り、WSLはそれを永遠に読みません。memory=6のように単位のない値はバイトとして解釈されるため、GBの接尾辞は飾りではなく必須です。
PowerShellかWindowsターミナルを開いてwsl --shutdownを実行し、10秒ほど待ってからディストリビューションを起動し直します。Linux内でfree -hを実行すると、物理RAMの全体ではなく上限値が表示され、nprocは許可したコア数を出力します。wsl --versionが1.3.10以降を示すなら、[wsl2]ブロックの下にautoMemoryReclaim=gradualとsparseVhd=trueを書いた[experimental]セクションを追加して、もう一度シャットダウンします。古いWSLでは、まず管理者権限のプロンプトからwsl --updateを実行してください。
数値を見直すタイミング
いつもの作業を1週間、タスク マネージャーでVmmemを観察しましょう。ブラウジングや軽いコンテナーなら4〜6 GBで十分ですが、重いDockerビルドや大規模なJavaScriptツールチェーンは8 GB以上を正直に要求します。memory=は一気にではなく2 GB刻みで動かし、RAMが16 GB以下のマシンでは物理メモリの少なくとも半分はWindowsに残してください。ディストリビューションを置いたディスクが増え続けるなら、sparseVhd=trueでext4.vhdxの一方的な肥大化を止められます。Windowsの機能更新のたびに再確認を。WSLパッケージが置き換えられ、挙動が変わることがあるからです。
よくある質問
WSL2にどれだけのメモリを与えるべきですか?
16 GBのマシンなら、日常の開発は6 GBで余裕を持ってカバーできます。合計8 GBのRAMなら4 GBにとどめ、Windowsがスワップし始めないようにしましょう。上限は少しずつ、ビルドが実際にメモリ不足で失敗するときにだけ引き上げます。
Linux内のすべてを閉じてもVmmemが大きいままなのはなぜですか?
カーネルは解放されたメモリをページキャッシュとして保持し、自発的にはWindowsに返さないためです。1日の終わりにwsl --shutdownを実行するか、WSL 1.3.10以降でautoMemoryReclaim=gradualを有効にすれば、未使用のメモリが自動的に戻ります。
.wslconfigはWSL1のディストリビューションにも効きますか?
効きません。WSL1はLinuxのシステムコールをWindows自身の中で変換するため、VMもVmmemも制限対象も存在しません。上限を付けたいなら、まずwsl --set-version <name> 2でディストリビューションを変換してください。
購入前にライセンスの内容をご確認ください。
一度限りの 30 分試用では基本ツールを利用できます。PRO 機能は有料ライセンスを有効にするまでロックされています。
次に読む記事
お問い合わせ: [email protected]