今回は前回「Windows Subsystem for Linuxガイド 第31回 WSL 2023年9月アップデート」の続きである。
このアップデートには、前回解説したような機能のほかに、実験的な機能として、「自動メモリ回収」、「スパースVHD」という2つの機能が搭載されている。
ただし、実験的とされていることから、日常的な利用に関してはリスクがあると理解されたい。評価などで利用する場合でも、最低限WSLを最新のプレビュー版として、ディストリビューションなども最新状態にしておく必要がある。
前回の記事執筆後、WSLのプレビュー版のバージョンが上がりVer.2.1.0となった(安定版のバージョンは変更がない)。今回の記事は、同バージョンのWSLをWindows 11 Ver.22H2(OSビルド 22631.3007)で検証を行っている。
自動メモリ回収
WSL2では、仮想マシンに空きメモリがあれば、これを回収して再利用できるようになっている。問題はLinuxで「空きメモリ」が生じるかどうかである。
Linuxカーネルは、ファイルを扱うときに利用するファイルバッファをメモリ上に確保し、メモリが不足し始めるまで解放しない。これには、ファイルに繰り返しアクセスが行われる場合に処理を高速化する効果がある。
しかし、ファイルバッファが大量に残り、空きメモリがない状態になってしまうことがある。このため、WSLの空きメモリを解放してWin32側に戻す機能があっても、WSL側でメモリが解放されないために戻すことができない。
自動メモリ回収は、Linux側の機能として、このファイルバッファの解放を行う機能だ。これにより、空きメモリが生じWSL/Windowsにより回収される。
設定は、[experimental]セクションのautoMemoryReclaimで行う。設定値は“gradual”、“dropcache”、“disabled”の3つ。
“disabled”を指定すると、自動メモリ回収は無効になり、これが省略値である。“gradual”、“dropcache”の場合、5分間のアイドル時間を検出したら、ファイルキャッシュの解放を開始する。“dropcache”では、即座にすべてのファイルキャッシュを解放する。“gradual”では、段階的に解放を行い、30分ですべてを解放するように動作する。
ただし、gradualを設定すると、WSLディストリビューション側では、cgroup v2が有効になり、cgroup v1が無効になる。cgroup(Control Group)とは、プロセスグループのリソース利用を制御し、グループ間を分離するカーネルの機能だ。
cgroupには、v1(バージョン1)とv2(同2)の2つがある。v2がカーネルに組み込まれたとき、v1のすべての機能をカバーしていなかったため、v1を有効とし、v2の一部の機能のみを利用する「Hybrid mode」が導入され、これが今でも続いている。
gradualではcgroup v2のmemory.reclaimを利用しており、これを動作させるためには、cgroup v1を停止しなければならない。このため、cgroup v1に依存しているプログラムで問題が生じる可能性がある。
スパースVHD
スパースVHDとはWSL2のネイティブファイルシステムを格納している仮想ハードディスク(Virtual Hard Disk。仮想ハードディスク)のサイズ圧縮を行う機能だ。なお、このVHDを格納するファイルにはVHDXという拡張子が付く。
もともと、WSLのVHDXファイルには、容量可変型が指定してある。しかし、一度利用されたセクタは、そのままVHDXファイル内に残るため、通常、そのサイズは時間経過により大きくなっていく。
一度アクセスが行われても、その後ファイル削除などにより未使用となるセクタもあるが、これを判定できるのは、仮想マシン内のオペレーティングシステムのみで、外部のプログラムからは判定ができないからだ。
スパースVHDでは、何らかの方法で未使用となった領域をWin32側のVHDドライバに伝達する。たとえば、ext4ファイルシステムはSSDで未使用ブロックをコントローラーに伝達するTrimコマンドに対応している。
ただし、詳細な動作が公開されておらず、圧縮が行われるタイミングなどは不明だ。
スパースVHDの設定は、新規にディストリビューションを作成する場合と、既存のディストリビューションに設定する場合で手順が異なる。
[experimental]セクションのsparseVhd設定は、新規に作成されるローカルファイルシステムをスパースVHDに設定するためのものだ。trueを設定することで以後作成されるディストリビューションがインストールされるVHDXファイルがスパースVHDになる。
既存のディストリビューションにスパースVHDを設定するには、wsl.exeに新設されたオプションを使う。具体的には、
wsl --manage --set-sparse true
とする。無効にしたい場合には、末尾の部分を“--set-sparse false”とする。表01に現在のwsl.exeのオプションを示す。
なお、実験的な機能であるせいか、GitHubにあるWSLのページでは、設定後にVHDXファイルアクセスでエラーが発生したことなどが報告されている。この機能に関しては、評価を含め、利用はしばらく控えた方がよさそうだ。
次回からは、WSL 2023年9月アップデートの各機能を実際に利用してみることにする。
> Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/