Introduction

備忘録。

Windows Subsystem for Linux 2 で Docker for Windows を動かしている。

1
2
3
4
5
>wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
docker-desktop Running 2
docker-desktop-data Running 2

それはそれとして、この WSL2 は一体どれほどのメモリを使っているのか?というのを知りたくなった。
なぜかというと、 Sentry というアプリケーションで発生したエラーを追跡し、管理してくれるソフトウェアを docker で使いたくなったのだが、要求仕様に

  • 4 CPU Cores
  • 8 GB RAM

なんて書かれていて、「はて、自分のマシンの WSL2 はどのくらいメモリを食っているのか?」と思った次第。

Resolution

まず、現時点で動ている WSL2 の、メモリ使用量は、タスクマネージャーから vmmem を見ることで確認。

vmmem

現状は、2 GB 少し。

では、これがどこまで増えるかというと、WSL の変遷によって変わってきた模様。
Windows Subsystem for Linux のリリース ノート に従えば

  • Build 20175
    • VM の既定のメモリ割り当てを、ホスト メモリの 50% または 8 GB のどちらか少ない方になるように調整します [GH 4166]。
  • Build 19028
    • Linux VM に割り当てられた既定のメモリ容量を、ホスト メモリの80% に調整します

とある。

なので、少なくとも、100% 使い切ることは、まぁ当然ないことはわかった。

最大メモリを調節したい

既定のメモリ割り当ての意味が正直よくわからないが、vmmem を見る限り、いきなり上の値に従ったメモリを割り当てるわけではないもよう。
最大量ということだろうか。VHD の動的割り当てみたいな。

逆に言えば、Build 20175 の場合、たくさん WSL2 に割り当てたい場合は 8 GB が最大になるし、Build 19028 の場合は、80% まで無制限に食いつくす。
なので、最大量を指定することで対処。

ちなみに、Linux シェルからメモリ量を確認したところ

1
2
3
4
$ free -h
total used free shared buff/cache available
Mem: 50G 464M 48G 363M 964M 48G
Swap: 13G 0B 13G

となっていた。
マシンのメモリは 64 GB なので、 64 * 0.8 = 51.2 なので、まぁ正しいと思える。

WSL2 の使用メモリを制御するには、

によれば、

%USERPROFILE%¥.wslconfig (存在しないならテキストとして作成) に下記のように記載することで対処できると。

1
2
[wsl2]
memory=1GB

サポートされている記述は Build 18945 を参考。

現状、50 GB を最大量として動いているので、1 GB を指定すれば、vmmem と free -h の値が変化するはず。

記載後、管理者権限のコマンドプロンプトから

1
> wsl --shutdown

または、管理者権限の Powershell から

1
$ Get-Service LxssManager | Restart-Service

を実行して、WSL2 を再起動。
(実行すると、起動している Linux シェル が勝手に終了するので注意)

その後、Linux シェル を開き、メモリを確認すると

1
2
3
4
$ free -h
total used free shared buff/cache available
Mem: 977M 64M 828M 76K 84M 791M
Swap: 1.0G 0B 1.0G

意図した値になっていた。
vmmem も

vmmem

と 1 GB に近似した値になっていることが確認できた。