1.この記事の内容
この記事では,WSL2に割り当てられるメモリ量とパソコンに搭載しているメモリ量がデフォルトで異なることを失念していたことに対する筆者の反省です.
本記事を執筆時点の下記バージョンでは,パソコンに搭載しているメモリ量の半分がWSL2に割り当てられるようです.
エディション Windows 11 Home
バージョン 22H2
インストール日 2022/05/15
OS ビルド 22631.1972
エクスペリエンス Windows Feature Experience Pack 1000.22658.1000.0
2.背景
WSL2上でJupyter NotebookをDockerで動かしている際に,大きなサイズのデータ処理をしていると,Jupyter Notebookが頻繁にクラッシュしました.
タスクマネージャーでメモリ使用量を見ても70%~80%程度しか使用していない状況でこの現象が発生し,ハマっていたのですが,WSL2に割り当てられたメモリ量をオーバーしていました.
3.反省と対策
ちゃんとDockerコンテナが使用しているメモリ量を計測せねばならないという反省をふまえ,docker stats
で使用中のメモリ量をログに残す対策を丁寧にやろうと思います.
#! /bin/bash
while true; do
docker stats --no-stream | tee --append docker_stats.log
sleep 1
done
docker stats
でデフォルトでは下記のように,1行目に項目名,2行目以降で動かしているDockerコンテナのプロファイルが出力されます.
$ docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
e477720561df 20230708_sake_name_searching_env_1 18.40% 4.562GiB / 15.55GiB 29.33% 146MB / 172MB 0B / 0B 71
--format
オプションで出力形式を指定することができ,例えばコンマ区切りで出力するとcsv形式でログを残すことができます.
$ docker stats --no-stream --format "{{.Name}}, {{.MemUsage}}"
20230708_sake_name_searching_env_1, 4.582GiB / 15.55GiB
出力形式を指定する際にも,先頭にtable
指定をすることで,1行目に項目名を出力することもできます.
$ docker stats --no-stream --format "table{{.Name}}, {{.MemUsage}}"
NAME, MEM USAGE / LIMIT
20230708_sake_name_searching_env_1, 4.587GiB / 15.55GiB
4.関連リンク
- docker statsについて
- docker stats
- フォーマット(表示形式) - WSL2でのメモリ割り当てサイズについて
-
Docker Desktop 環境のメモリ上限を変更するには?
Docker Desktop は WSL2 のメモリ制限に影響を受けます。 Windows10のデフォルトだと WSL2 に割り当てられるメモリは ホスト側のメモリの80%となるようです。
-
Windows Subsystem for Linux 2のメモリ管理を詳しく見る
デフォルトでは、PC側のメモリの75%をWSL2の上限として割り当てているようだ。 たとえば、物理メモリ4GBのマシンならば3GBが、8GBのマシンなら6GBが実装メモリとしてWSL2内からは見えている。
-
WSL2 に割り当てるメモリサイズを手動で固定値を設定する方法
Microsoft のリリースノートのビルド 20175に以下の記載があります。 WSL2 VM の既定のメモリ割り当てを、ホスト メモリの 50% または 8 GB のどちらか少ない方になるように調整します
-
WSL2/Ubuntu/Raspberry Piでのメモリ不足を解消する
WSL2では、デフォルトだとメインメモリの半分しかメモリが割り当てられません。
-
Docker Desktop 環境のメモリ上限を変更するには?