はじめに
開発業務でWSL2を使用し続けていると、Vmmemプロセスのメモリ使用量が増加し続け、Windowsホストのメモリが枯渇するという問題が発生します。
この問題は、正式リリース後も根本的に解決されておらず、多くのユーザーが影響を受けています。
本記事では、WSL2のメモリ枯渇問題の原因と、現時点での有効な暫定対処方法を紹介します!
WSL2メモリ枯渇の原因
WSL2におけるメモリ枯渇の主な原因は、Linuxのファイルキャッシュ機能とWSL2の動的メモリ管理の相互作用にあります。
1. Linuxのファイルキャッシュ特性
Linuxでは、ファイルを読み書きすると、そのデータをメモリ上にキャッシュします。このキャッシュは、メモリが不足するまで解放されません。そのため、大量のファイル操作を行うとメモリを圧迫することになります。
2. WSL2の動的メモリ管理
WSL2は、仮想マシン(VM)上でLinuxを動作させる仕組みです。このVMのメモリサイズは、Linuxのメモリ使用量に応じて動的に増加します。しかし、一度増加したメモリは、すぐには解放されません。そのため、Linuxのファイルキャッシュが増加すると、WSL2のメモリも増え続け、結果としてWindowsホストのメモリが枯渇するという悪循環が発生します。
WSL2のメモリ枯渇を防ぐ対処方法
方法1: WSL2のメモリ上限を設定する(おすすめ)
WSL2のメモリ使用量を制限することで、Windowsホストのメモリ枯渇を防ぐことができます。
設定手順
-
%USERPROFILE%\.wslconfig
(例:C:\Users\YourName\.wslconfig
)を作成または編集する -
以下の内容を記述する
[wsl2] memory=6GB swap=6GB
-
設定を反映するため、WSL2を再起動またはWindowsを再起動する
設定のポイント
-
memory=6GB
の値は、PCの搭載メモリとWSL2の使用用途に応じて調整可能 -
swap=0
に設定すると、スワップを無効化できるが、メモリ不足時にクラッシュする可能性がある - デフォルトでは、PCメモリの50%または8GBの少ない方がWSL2に割り当てられる(Build 20175以降)
ちなみに、私は、割り当てるmemoryを6GBぐらいにして、足りない分はswapで補っています。いろんなプロジェクトの開発を同時に進めるには、これぐらいちょうどよいと思います。swapが使われると、動作がちょっぴり重たくなりますが、クラッシュするよりはましですね!
方法2: キャッシュを手動で削除する
ちなみにメモリサイズを固定しない場合は、定期的にキャッシュを削除することで、メモリ枯渇を抑えることができます。
ただ私は面倒くさいのであまりやりません。そのため、cron化して実行するのがよいかと思います。WSLではcronの実行はデフォルトでできないので、今度紹介するとして、以下コマンドの紹介。
キャッシュ削除コマンド
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches && swapoff -a && swapon -a"
注意点
- このコマンドを定期的に実行する必要がある
-
systemd
やcron
が動作しないWSL2では、自動化には工夫が必要
方法3: WSL2を再起動する
WSL2を再起動すると、仮想マシンが再起動され、ファイルキャッシュなどがクリアされます。これが一番楽ですね。
WSL2の再起動手順
wsl --shutdown
wsl
本問題が発生しやすいケース
以下のようなケースでは、メモリ枯渇問題が特に発生しやすいです。
- Visual Studio Code + Remote WSLを使用
- Docker Desktop(WSL2バックエンド)を利用
- 大規模なコードベースの開発
- 機械学習やデータ解析などメモリを大量に消費する作業
特に、これらを組み合わせて使用している環境ではメモリ枯渇のリスクが高まるため、適切な対策を講じる必要があります。
いろんなプロジェクトに携わるとみるみるうちにメモリの枯渇のリスクが高まりますので、ぜひ参考にしてみてください。
まとめ
WSL2のメモリ枯渇問題は、Linuxのファイルキャッシュ管理とWSL2の動的メモリ割り当ての組み合わせによって発生します。
現時点での最も効果的な対策は、%USERPROFILE%\.wslconfig
を設定し、WSL2のメモリ使用量を制限することです。また、キャッシュを手動で削除したり、WSL2を定期的に再起動することも一時的な対処として有効です。
今後、WSL2のアップデートにより、より良いメモリ管理機能が提供される可能性はありますが、とりあえずのところそういう管理機能はないので、ぜひ参考にしてください。