Closed7

WSL2 メモリ不足の対策

TakahiroTakahiro

概要

WSL2を長時間使用するとメモリの使用率が100%近くなりPCが動かなくなる問題の対処。
Ryzen CPUを使用している場合、iGPUが悪さをしておりメモリーリークが発生する模様。
BIOSからiGPUを無効化すれば解決する (勿論CPUのGPU機能は使えなくなるので、dGPUが必要になる)

尚、Intel製のCPUで検証できる環境を持ち合わせていなかったため同様の事象が発生するかは不明。

TakahiroTakahiro

事象

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
TakahiroTakahiro

対策1

メモリ使用量の制限

WSL2ではメモリの使用量の上限はデフォルトでシステム全体の半分もしくは8GBのうち小さい値が割り当てられる。
タスクマネージャーで見たところ16GB以上のメモリが使用されていそうだったので、.wslconfigに以下の設定を追加して、メモリのサイズを固定化した。メモリが不足した時に備えてスワップ領域の指定も行った。
.wslconfigC:\Users\<UserName>\内にある(ない場合は作成する)。

[wsl2]
memory=16GB
swap=32GB
TakahiroTakahiro

原因

メモリ使用量の制限の対策をしてもメモリの使用率が100%近くなりPCが動かなくなる。
タスクマネージャーをよく見ると、プロセスのメモリ使用量を合計しても全体のメモリと乖離していた。

メモリの使用量を詳細に調査するため、RAMMapを用いた。
https://learn.microsoft.com/ja-jp/sysinternals/downloads/rammap

確認したところUnusedでActiveになっている領域が13GB以上あることが分かった。

WSL側でfree -hを入力してメモリ使用量を確認しても、空き領域があったためメモリーリークしていることが判明した。

TakahiroTakahiro

対策2

メモリ解放の実行

WSL2のメモリーリークについて調べてみると、GitHubのWSLリポジトリに以下のようなissueがあった。
https://github.com/microsoft/WSL/issues/8725

解決方法としてメモリを解放するための手段についてコメントが2つあった。

1. コマンドで実行

https://github.com/microsoft/WSL/issues/8725#issuecomment-1560199065

以下のコマンドを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の試験機能で実行

https://github.com/microsoft/WSL/issues/8725#issuecomment-1726528619

.wslconfigautoMemoryReclaimオプションを設定する。
オプションの設定値は以下の参照した。
https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config

.wslconfigを以下の設定で起動してメモリの使用量を調査。

[wsl2]
memory=8GB
swap=0
localhostForwarding=true

[experimental]
autoMemoryReclaim=dropCache

検証にはEclipse eCALのサンプルを実行した。
https://eclipse-ecal.github.io/ecal/getting_started/samples.html

結果、RAMMapのUnused Activeの領域は増えるが、増加量は改善され長時間の動作ができるようになった。
通常は1日でPCが動かなくなるが、2日以上経ってもPCは一応動く。

1日後

2日後

TakahiroTakahiro

元も子もない方法だが、WSL2を使用しないで環境構築すれば解決する。
Windwos proライセンスを持っているなら、ハイパーバイザーにHyper-Vを使えば上記事象は発生しなかった。

Hyper-Vのインストール方法
https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v

Docker DesktopのバックエンドをWSL2からHyper-Vに変えるには、設定画面のUse the WSL 2 based engineのチェックボックスを外す。

TakahiroTakahiro

例のIssueで質問してみたら以下のような回答が返ってきた。

https://github.com/microsoft/WSL/issues/8725#issuecomment-2128772463

どうやらRyzenのiGPUが悪さをしているらしいので、BIOSから無効化する。
ASRosk製のマザボを使用しているので、以下を参考にしてiGPU Configrationの設定をiGPU Disabledにした。
https://support.ask-corp.jp/hc/ja/articles/25228099629081--ASRockマザーボード全般-グラフィックカード接続時に内蔵グラフィック機能を併用したい

iGPUを無効化した後、WSLを5日以上動かし続けてもメモリの使用量は増加さず安定して動作した。

このスクラップは2024/06/20にクローズされました