Technology

WSLの使用メモリとスワップ、CPU数を制限する

WSLを使い続けていると、「メモリ使用量が大きくて他の作業でメモリが足りない」「他の作業も並行して行いたいけど、WSLがCPUコアを使い過ぎている」と思うときがあります。本記事では、WSL2が使うメモリとスワップ、CPU数の上限を設定する方法を解説します。

目次

設定ファイルの場所

設定ファイルの場所は%UserProfile%\.wslconfigC:\Users\<ユーザー名>\.wslconfig)です。デフォルトでは存在しないので、新規に作成します。

新規に作成する場合はエクスプローラーで、右クリック->新規作成->テキストドキュメントで.txtファイルを作成した後、.wslconfigに名前を変更することで作れます。

あるいは、CLIに慣れているのであれば、PowerShellで以下のコマンドを実行することでもファイルを開けます(ファイルがなければ新規作成されます)。

notepad "$env:USERPROFILE\.wslconfig"

ファイル名に関する注意

メモ帳やエクスプローラーで作ると、拡張子が隠れて.wslconfig.txtという名前で保存され、設定が読み込まれないことがあります。設定が効かない場合は、拡張子を表示する設定にしてから、ファイル名が.wslconfig(拡張子なし)となっていることを確認してみてください。上の PowerShell コマンドで作成すれば.txtは付きません。

設定内容

設定ファイル.wslconfigに次のように記述することで、メモリ上限、スワップサイズ、論理プロセッサ数の上限を設定できます。

[wsl2]
# VM が使えるメモリの上限(例: 8GB に制限)
memory=8GB

# スワップサイズ(例: 2GB。0 で無効化)
swap=2GB

# 使用する論理プロセッサ(CPU)数の上限(例: 4)
processors=4

[experimental]
# 未使用メモリを徐々に Windows へ返す(実験的機能)
autoMemoryReclaim=gradual

各行についての補足を以下に記述します。

  • memory / swapは単位を省略するとバイト扱いになります。8GB512MBのように単位を付けるのが分かりやすく、公式の推奨例もこの書き方です。
  • memoryは未指定だと「物理メモリの 50%」、swapは「メモリの 25%」が既定です。上限を絞りたいときに明示します。
  • processorsは CPU(論理プロセッサ)数の上限です。未指定だと Windows の論理プロセッサ数と同じになります。メモリと一緒に CPU も絞りたいときに指定します。
  • autoMemoryReclaimはキャッシュメモリの解放に関する設定で、 現状は実験的セクション [experimental]の設定です。値は次の3つから選べます。
設定値内容
gradual未使用のキャッシュメモリを少しずつ返却
dropCache即時に返却
disabled返却しない

設定を反映する

設定ファイルは WSL の起動時に読み込まれます。変更を反映するには、PowerShell またはコマンドプロンプトで WSL を一度シャットダウンします。

wsl --shutdown

すべての WSL 2 ディストリビューションが停止します。Docker Desktop の WSL 連携や、作業中の WSL セッションも一緒に落ちるので注意してください。完全に停止するまで若干(約8秒)かかります。少し待ってから再度起動してください。停止できたかは次のコマンドで確認できます(何も動いていなければその旨が表示されます)。

wsl --list --running

シャットダウンコマンドの実行場所

WSLの中からコマンドを打つ場合はwsl.exeを使用します。ただし、WSL内からWSLをシャットダウンすると、環境によっては設定ファイルが反映されない場合や端末が乱れる場合があるので、PowerShellからWSLをシャットダウンするのが無難です。

上限が設定されたか確認する

メモリ上限とスワップ量を確認するには、WSL内(ディストリビューション内)で free コマンドを実行します。これは Linux 標準のメモリ確認コマンドです。

free -h

出力例は以下のようになります。

               total        used        free      shared  buff/cache   available
Mem:           7.8Gi       840Mi       5.5Gi       3.0Mi       1.5Gi       6.8Gi
Swap:          2.0Gi          0B       2.0Gi

Memtotalが指定した上限に近い値、Swaptotalが指定したスワップ量になっていれば反映されています。

Memtotal は、VM のオーバーヘッド分だけ設定値よりわずかに小さく表示されることがあります(例: 8GB指定で7.8Gi前後)。これは正常です。

メモリのfree -hに対して、コア数は WSL(ディストリビューション内)でnprocを使うのが一番手軽です。

nproc

processors=4を設定して(PowerShell からwsl --shutdownで)再起動していれば、ここで4と表示されれば反映されています。もう少し詳しくみたい場合は、以下のコマンドで確認できます。

lscpu    # 「CPU(s):」の行が論理プロセッサ数

参考資料

-Technology
-,