結論:すぐに上限を下げず、3層に分けて確認する

タスクマネージャーでWSL2関連プロセスの使用量が大きくても、Dockerコンテナだけが原因とは限りません。 WSL2のLinux VMは複数のディストリビューションで共有され、アプリケーションの使用量だけでなくファイルキャッシュも含みます。

次の順で確認すると、必要な対策を選びやすくなります。

  1. Windows全体で本当にメモリ不足が起きているか確認する
  2. WSL2内のプロセス、キャッシュ、スワップを確認する
  3. コンテナごとの使用量を確認する
  4. WSLとDocker Desktopを更新する
  5. 必要な場合だけ.wslconfigで上限を設定する
  6. 同じ作業を再現し、改善と副作用を確認する
先に確認:数字が大きいだけでなく、Windows側の空きメモリ低下、スワップ、操作の引っかかり、ビルド失敗などが同時に起きているかを見ます。使えるRAMをキャッシュに使っているだけなら、必ずしも障害ではありません。

手順1:Windows全体の状態を確認する

タスクマネージャーの「パフォーマンス」からメモリを開き、使用中、利用可能、コミット済みを確認します。 次に「プロセス」でWSL2、Docker Desktop、IDE、ブラウザーなどを比較します。

WSL2関連だけを見て判断しないことが重要です。ブラウザー、IDE、言語サーバー、オンライン会議が大きく使っている場合、WSL2の上限を下げてもWindows全体の不足は解決しません。

PowerShellでは、WSLの状態とバージョンを次のコマンドで確認できます。

wsl --status
wsl --version
wsl --list --verbose

古いWSLには既知の問題や挙動差があるため、更新可能な環境では更新後に再確認します。

wsl --update

手順2:WSL2内の使用量を確認する

WSL2のシェルを開き、メモリとスワップを確認します。

free -h
ps -eo pid,comm,%mem,rss --sort=-rss | head -20
確認項目判断
availableWSL2内で新しい処理に利用できる見込みのメモリ
Swap used重い処理中に増え続ける場合は割り当て不足の可能性がある
buff/cache再利用可能なキャッシュをアプリの実使用量と混同しない
上位プロセスDB、Java、Node.jsなど、調整対象となる実プロセスを探す

一度スワップされたデータが残っているだけの場合もあります。一時点の値ではなく、ビルドやテストを行いながら増減と操作感を確認してください。

手順3:コンテナごとの使用量を確認する

実行中のコンテナを1回測るには、次のコマンドを使います。

docker stats --no-stream \
  --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

特定のコンテナだけが大きい場合は、WSL2全体を制限する前に、そのサービスの設定を確認します。 Javaヒープ、データベースのバッファ、検索エンジン、開発時に不要なサービスなどが候補です。

コンテナ単位で暴走を防ぎたい場合は、Composeのメモリ設定やdocker run --memoryを検討します。 WSL2の上限はすべてのディストリビューションとDockerへ影響するため、問題の範囲より大きな制限になり得ます。

メモリがWindowsへ戻らない場合

新しいWSLには、使われなくなったキャッシュをWindowsへ戻す自動メモリ再利用の仕組みがあります。 Microsoftの現行資料ではautoMemoryReclaimdisabledgradualdropCacheがあり、既定値も記載されています。 ただし、利用できる機能や既定値はWSLのバージョンで異なる可能性があるため、古い設定例をそのまま追加する前にwsl --versionと公式資料を確認します。

Docker DesktopのResource Saverは、WindowsのWSL2モードでは主にDocker Engineを一時停止してCPU使用量を抑えます。 Docker公式は、WSL2のメモリ削減には自動メモリ再利用を案内しています。Resource Saverだけでメモリが必ず減るとは考えないようにします。

原因確認のため一度だけWSL2 VMを完全停止する場合は、作業を保存してからPowerShellで実行します。

wsl --shutdown

これでメモリが戻っても、根本原因が解決したとは限りません。再び同じ作業を行い、どの操作で増えるかを確認します。

.wslconfigでメモリ上限を設定する

実測して上限が必要と判断したら、Windowsの%UserProfile%\.wslconfigを設定します。 このファイルは、WSL2で動くすべてのディストリビューションへ共通して適用されます。

[wsl2]
memory=12GB
swap=4GB

これは書式を示す例であり、32GB PCへの固定推奨値ではありません。Microsoftの現行資料では、memoryを指定しない場合の既定値はWindows搭載メモリの50%です。 Windows側のIDE、ブラウザー、会議アプリに必要な量を残し、WSL2側の最大負荷を満たす値を選びます。

保存後、作業中のWSL2環境を終了してから設定を反映します。

wsl --shutdown

WSL2とDocker Desktopを再起動し、設定値と同じ負荷を再現して確認します。

free -h
docker stats --no-stream

上限を小さくしすぎたときの症状

症状が出た場合は上限を段階的に戻します。PC全体のメモリが不足しているのにWSL2へ小さな上限を付けると、Windows側の見かけの空きは増えても、開発作業の待ち時間が長くなる場合があります。

設定前後のチェックリスト

  • Windows全体の利用可能メモリと操作感を確認した
  • WSLとDocker Desktopのバージョンを記録した
  • free -hでavailableとスワップを確認した
  • docker statsで大きなコンテナを確認した
  • 通常作業と最大負荷時の数字を記録した
  • 変更した設定値と理由を記録した
  • 設定後に同じ負荷を再現し、速度と安定性を比較した

よくある質問

Resource Saverを有効にすればメモリも減りますか?

WindowsのWSL2モードでは、Resource Saverは主にCPU使用量を減らします。メモリが戻らない場合は、WSLの更新状況、自動メモリ再利用、実際のプロセス使用量を確認します。

32GBのPCではWSL2へ何GB割り当てればよいですか?

固定の正解はありません。Windows側に残す量と、WSL2内で同時起動するサービスの両方で決まります。まず既定状態で最大負荷を測り、必要な場合だけ少しずつ調整します。

参考資料と関連記事

Amazon.co.jpで32GBメモリ搭載PCを確認する

著者について

intrajp。Linux、クラウドインフラ、Kubernetesなどの技術情報を発信しています。 この記事はMicrosoftとDockerの公式資料を基に、設定前後を比較できる診断手順としてまとめました。

運営者情報と記事の方針を見る