WSL2 メモリ不足の対策
概要
WSL2を長時間使用するとメモリの使用率が100%近くなりPCが動かなくなる問題の対処。
Ryzen CPUを使用している場合、iGPUが悪さをしておりメモリーリークが発生する模様。
BIOSからiGPUを無効化すれば解決する (勿論CPUのGPU機能は使えなくなるので、dGPUが必要になる)
尚、Intel製のCPUで検証できる環境を持ち合わせていなかったため同様の事象が発生するかは不明。
事象
WSL2を長時間使用するとメモリの使用率が100%近くなりPCが動かなくなる。
WSLの再起動をしても解消されず、根本の解決は再起動するしかない。
環境
HW
CPU: Ryzen 5 7600
RAM: DDR5 PC5-38400 16GBx2
GPU: Radeon RTX570 8GB
SW
OS
Windows 11 Home
バージョン 32H2 (OSビルド 22631.3447)
WSL
>wsl -v
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.3447
対策1
メモリ使用量の制限
WSL2ではメモリの使用量の上限はデフォルトでシステム全体の半分もしくは8GBのうち小さい値が割り当てられる。
タスクマネージャーで見たところ16GB以上のメモリが使用されていそうだったので、.wslconfig
に以下の設定を追加して、メモリのサイズを固定化した。メモリが不足した時に備えてスワップ領域の指定も行った。
.wslconfig
はC:\Users\<UserName>\
内にある(ない場合は作成する)。
[wsl2]
memory=16GB
swap=32GB
原因
メモリ使用量の制限の対策をしてもメモリの使用率が100%近くなりPCが動かなくなる。
タスクマネージャーをよく見ると、プロセスのメモリ使用量を合計しても全体のメモリと乖離していた。
メモリの使用量を詳細に調査するため、RAMMapを用いた。
確認したところUnusedでActiveになっている領域が13GB以上あることが分かった。
WSL側でfree -h
を入力してメモリ使用量を確認しても、空き領域があったためメモリーリークしていることが判明した。
対策2
メモリ解放の実行
WSL2のメモリーリークについて調べてみると、GitHubのWSLリポジトリに以下のようなissueがあった。
解決方法としてメモリを解放するための手段についてコメントが2つあった。
1. コマンドで実行
以下のコマンドをrootユーザーで実行する。
rootユーザーでログインするにはwsl -u root
でWSLを起動する。
sync; echo 1 > /proc/sys/vm/drop_caches
sync; echo 2 > /proc/sys/vm/drop_caches
sync; echo 3 > /proc/sys/vm/drop_caches
上記のコマンドを実行したが、RAMMapのUnused Activeになっている領域は削減されなかった。
2. WSLの試験機能で実行
.wslconfig
にautoMemoryReclaim
オプションを設定する。
オプションの設定値は以下の参照した。
.wslconfig
を以下の設定で起動してメモリの使用量を調査。
[wsl2]
memory=8GB
swap=0
localhostForwarding=true
[experimental]
autoMemoryReclaim=dropCache
検証にはEclipse eCALのサンプルを実行した。
結果、RAMMapのUnused Activeの領域は増えるが、増加量は改善され長時間の動作ができるようになった。
通常は1日でPCが動かなくなるが、2日以上経ってもPCは一応動く。
1日後
2日後
元も子もない方法だが、WSL2を使用しないで環境構築すれば解決する。
Windwos proライセンスを持っているなら、ハイパーバイザーにHyper-Vを使えば上記事象は発生しなかった。
Hyper-Vのインストール方法
Docker DesktopのバックエンドをWSL2からHyper-Vに変えるには、設定画面のUse the WSL 2 based engine
のチェックボックスを外す。
例のIssueで質問してみたら以下のような回答が返ってきた。
どうやらRyzenのiGPUが悪さをしているらしいので、BIOSから無効化する。
ASRosk製のマザボを使用しているので、以下を参考にしてiGPU Configration
の設定をiGPU Disabled
にした。
iGPUを無効化した後、WSLを5日以上動かし続けてもメモリの使用量は増加さず安定して動作した。