WSLを使い続けていると、「メモリ使用量が大きくて他の作業でメモリが足りない」「他の作業も並行して行いたいけど、WSLがCPUコアを使い過ぎている」と思うときがあります。本記事では、WSL2が使うメモリとスワップ、CPU数の上限を設定する方法を解説します。
目次
設定ファイルの場所
設定ファイルの場所は%UserProfile%\.wslconfig(C:\Users\<ユーザー名>\.wslconfig)です。デフォルトでは存在しないので、新規に作成します。
新規に作成する場合はエクスプローラーで、右クリック->新規作成->テキストドキュメントで.txtファイルを作成した後、.wslconfigに名前を変更することで作れます。
あるいは、CLIに慣れているのであれば、PowerShellで以下のコマンドを実行することでもファイルを開けます(ファイルがなければ新規作成されます)。
notepad "$env:USERPROFILE\.wslconfig"設定内容
設定ファイル.wslconfigに次のように記述することで、メモリ上限、スワップサイズ、論理プロセッサ数の上限を設定できます。
[wsl2]
# VM が使えるメモリの上限(例: 8GB に制限)
memory=8GB
# スワップサイズ(例: 2GB。0 で無効化)
swap=2GB
# 使用する論理プロセッサ(CPU)数の上限(例: 4)
processors=4
[experimental]
# 未使用メモリを徐々に Windows へ返す(実験的機能)
autoMemoryReclaim=gradual各行についての補足を以下に記述します。
memory/swapは単位を省略するとバイト扱いになります。8GB・512MBのように単位を付けるのが分かりやすく、公式の推奨例もこの書き方です。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内(ディストリビューション内)で 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
Memのtotalが指定した上限に近い値、Swapのtotalが指定したスワップ量になっていれば反映されています。
Memのtotal は、VM のオーバーヘッド分だけ設定値よりわずかに小さく表示されることがあります(例: 8GB指定で7.8Gi前後)。これは正常です。
メモリのfree -hに対して、コア数は WSL(ディストリビューション内)でnprocを使うのが一番手軽です。
nprocprocessors=4を設定して(PowerShell からwsl --shutdownで)再起動していれば、ここで4と表示されれば反映されています。もう少し詳しくみたい場合は、以下のコマンドで確認できます。
lscpu # 「CPU(s):」の行が論理プロセッサ数