アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

WSLが重い・メモリを食う問題を.wslconfigで直す完全ガイド【2026年版】

Featured image of the post

「WSLを起動しておくだけでPC全体が重くなる」「タスクマネージャーの VmmemWSL が何GBも食っている」「Linux側でファイルを消したのにCドライブの空きが戻らない」——WSLを日常的に使っている人なら、一度はぶつかる問題です。

これらはすべて「重い」と一括りにされがちですが、原因はメモリ・ファイルI/O・ディスクの3つにはっきり分かれ、対処法もそれぞれ違います。本記事では切り分け方から、.wslconfig のマシン別テンプレート、そしてネットに多い誤った情報までを、Microsoft公式ドキュメントにあたって整理します。

💡
30秒で要点

・WSLのメモリは既定で搭載RAMの50%まで膨らむ.wslconfigmemory で上限を切るのが基本
・よく見る「autoMemoryReclaim を追加しろ」という助言は半分古い。現在の既定値はすでに dropCache で、回収は動いている
・ファイルI/Oが遅い原因の大半は /mnt/c 上にプロジェクトを置いていること
・ディスクは一度膨らむと自動では縮まないwsl --manage <distro> --set-sparse true で自動縮小を有効化する
.wslconfig%UserProfile% 直下。ディストリ内の /etc/wsl.conf とは別物
・書式を間違えるとWSLはエラーを出さずに無視する。反映には wsl --shutdown が必要

💡
開発環境のチューニングや、チーム全体のWSL環境の標準化のご相談はお気軽にどうぞ!

ご用途に合わせた最適な構成をご提案します。

お問合せはこちら


[目次を開く]

1. 「重い」の正体は3つに分かれる

WSLが重いと感じるとき、実態は次の3つのどれかです。ここを先に切り分けないと、効かない設定を廻って時間を浪費します。

flowchart TB
    A["WSL が重い"] --> B{"何が起きているか"}
    B -->|"Windows 全体が重い<br>VmmemWSL が大きい"| C["原因① メモリ<br>→ .wslconfig で上限を切る"]
    B -->|"git や npm のコマンドが遅い"| D["原因② ファイルI/O<br>→ /mnt/c をやめる"]
    B -->|"C ドライブの空きがない"| E["原因③ ディスク<br>→ VHDX を sparse 化する"]
  • 原因① メモリ:WSLを起動しているとWindows側のアプリが重くなる。タスクマネージャーに VmmemWSL が大きく出る
  • 原因② ファイルI/Ogit statusnpm install が体感でわかるほど遅い。メモリは空いている
  • 原因③ ディスク:動作は普通だが、Cドライブの空き容量がじりじり減る

2. まず現状を測る

推測で設定をいじる前に、数字を見ます。

メモリ(Windows側)

タスクマネージャーの「詳細」タブで VmmemWSL を探します(古い環境では Vmmem)。これがWSLのVMがWindowsから実際に占有している量です。

メモリ(Linux側)

free -h

ディスクの使用量

# PowerShell で実行(<distro> は wsl -l -v で確認した名前)
wsl.exe --system -d <distro> df -h /mnt/wslg/distro

このコマンドが使えない場合は wsl --update でStore版にWSLを更新するか、wsl df -h / を試してください。

⚠️
dfSize が1TBと表示されても驚かないでください。WSLのVHDは既定で最大1TBまで伸びる割当で作られており、実際のWindows側の空き容量とは別です。見るべきは Used の方です。

3. 原因① メモリ:既定ではRAMの50%まで使う

ここが最も誤解されている点です。Microsoft公式ドキュメントによると、.wslconfig の主要な既定値は次のとおりです。

設定 既定値 意味
memory Windowsの総メモリの50% 32GBマシンなら最大16GBまでWSLが使える
processors Windowsの論理プロセッサと同数 全コアをWSLに見せる
swap メモリサイズの25%をGB単位に繰上げ スワップ用VHDが別途作られる
swapFile %Temp%\swap.vhdx スワップファイルの置き場

つまり、何も設定していなければ、WSLはRAMの半分まで膨らむのが仕様どおりの振る舞いです。故障ではありません。上限を切りたければ、明示的に memory を指定する必要があります。

「autoMemoryReclaim を追加しろ」は半分古い

ネットでよく見る「[experimental]autoMemoryReclaim=gradual を追加すればメモリが戻る」という助言は、前提が古いです

この機能は2023年9月のWSLアップデートで導入され、現在の公式ドキュメントでは既定値が dropCache(キャッシュを即時回収)となっています。つまり回収はすでに動いています

振る舞い
dropCache(既定) キャッシュされたメモリを即時に回収する
gradual キャッシュされたメモリをゆっくり自動で回収する
disabled 自動回収を無効化する

では gradual に意味がないかというと、そうではありません。dropCache は即時にキャッシュを捨てるため、ビルドなどで同じファイルを繰り返し読むワークロードだと、捨てては読み直す動きになりがちです。体感速度を優先するなら gradual を検討する価値があります。

いずれにしても、メモリを減らしたいならまず memory で上限を切るのが先です


4. 原因② ファイルI/O:/mnt/c を使っていないか

「メモリは空いているのに git status が遅い」場合、ほぼ間違いなくこれです。

WSL2はHyper-Vの軽量VM内でLinuxを動かしているため、Windows側のファイル(/mnt/c/...)へのアクセスはOSをまたぐ分だけ遅くなります。Microsoft公式の比較表でも、「OSをまたぐファイルシステム性能」は WSL1 ✅ / WSL2 ❌ と明記されています。

flowchart LR
    A["プロジェクトを<br>/mnt/c/Users/... に置く"] -->|"OS をまたぐ<br>遅い"| B["Windows ファイルシステム"]
    C["プロジェクトを<br>~/projects/... に置く"] -->|"ネイティブ<br>速い"| D["Linux ファイルシステム"]

対処はシンプルです。プロジェクトをLinux側に移すだけ

# 悪い例:Windows 側に置いている
cd /mnt/c/Users/yourname/projects/myapp

# よい例:Linux 側に置く
cd ~/projects/myapp

VS Codeからは WSL 拡張機能で接続すれば、Linux側に置いたままWindowsのGUIで編集できます。速度を捨てずに使い勝手を保てるので、これが推奨構成です。

⚠️
逆に、Windows側のアプリからLinux側のファイルを頻繁に読む構成も同じ理由で遅くなります。「どちらのツールで作業するか」にファイルの置き場を合わせるのが原則です。

5. 原因③ ディスク:VHDXは自動では縮まない

WSL2はディストリビューションごとに ext4.vhdx という仮想ディスクを作ります。このファイルは使うにつれて大きくなりますが、Linux側でファイルを削除しても自動では小さくなりません。これが「消したのにCドライブが空かない」の正体です。

解決策:sparse VHD を有効にする

2023年9月のWSLアップデートで、使った分だけ自動で縮むVHDのサポートが入りました。既存のディストリに適用するには次のとおりです。

# 先に完全に停止させる
wsl --shutdown

# 既存のディストリを sparse 化する
wsl --manage <distro> --set-sparse true

今後作るディストリをすべてsparseにしたい場合は、.wslconfig に次を入れます。

[experimental]
sparseVhd=true
⚠️
AppData内のWSL関連ファイルをWindowsのツールで直接触らないでください。Microsoftは公式ドキュメントで、AppData配下のWSLファイルをWindows側のエディタやツールで変更・移動・アクセスするとディストリが壊れる可能性があると警告しています。Linux側のファイルには \\wsl$\<distro>\ 経由でアクセスしてください。

ディスクが本当に足りない場合

VHDの上限(既定1TB)に到達しているなら、拡張するのが正解です。WSL 2.5以降ならコマンド一発です。

wsl --shutdown
wsl --manage <distro> --resize 2TB

サイズは B/M/MB/G/GB/T/TB の形式で指定します。小数点(2.5TB など)は現時点で非対応です。


6. マシン別 .wslconfig テンプレート

.wslconfig%UserProfile%\.wslconfig(通常は C:\Users\<ユーザー名>\.wslconfig)に作ります。既定では存在しないので、自分で新規作成します

以下は、搭載RAM別の実用的な出発点です。いずれもWindows側に十分な余地を残すことを優先しています。

RAM 8GB のマシン

[wsl2]
memory=4GB
processors=2
swap=2GB

[experimental]
autoMemoryReclaim=gradual
sparseVhd=true

RAM 16GB のマシン(標準的な開発機)

[wsl2]
memory=8GB
processors=4
swap=4GB

[experimental]
autoMemoryReclaim=gradual
sparseVhd=true

RAM 32GB 以上のマシン

[wsl2]
memory=16GB
processors=8
swap=8GB

[experimental]
autoMemoryReclaim=gradual
sparseVhd=true
💡
ドックコンテナやローカルLLMを回すなら、上記より多めに割り当ててください。逆にエディタとターミナル中心の使い方なら、16GBマシンで memory=6GB まで下げても実用上困りません。まずは上記で始めて、足りなければ増やすのが安全です。

7. 設定を反映させる:8秒ルール

ファイルを保存しただけでは反映されません。WSLのVMが完全に停止してから再起動する必要があります。

Microsoft公式はこれを「8秒ルール」と呼んでいます。ディストリのシェルをすべて閉じてから、サブシステムが停止するまで約8秒かかるためです。

# 確実な方法:全ディストリとVMを即時に停止
wsl --shutdown

# 本当に止まったか確認する
wsl --list --running
# 「実行中のディストリビューションはありません」と出ればOK

特定のディストリだけ止めたい場合は wsl --terminate <distro> を使います。


8. やりがちな失敗

.wslconfig/etc/wsl.conf を取り違える

最も多いミスです。別物です

.wslconfig wsl.conf
置き場 %UserProfile%\.wslconfig(Windows側) /etc/wsl.conf(Linux内)
適用範囲 全ディストリ共通(グローバル) そのディストリのみ
対象 WSL2のみ WSL1 / WSL2 の両方
設定内容 VMのメモリ・CPU・カーネルなど マウント・ネットワーク・既定ユーザ・systemd

メモリを減らそうとして /etc/wsl.confmemory=8GB と書いても、何も起きません

② 書式ミスでもエラーが出ない

これが厄介です。公式ドキュメントにはこうあります。

If the file is missing or malformed (improper markup formatting), WSL will continue to launch as normal without the configuration settings applied.
(訳:ファイルがないか、書式が不正な場合、WSLは設定を適用せずに普段どおり起動します)

つまり、タイポしても黙って無視されるのです。「設定したのに効かない」ときは、まずセクション名 [wsl2] の綴りとキー名を見直してください。

③ 単位を書き忘れる

サイズ値は単位を省略するとバイト扱いです。

memory=8      # ✖ 8バイトと解釈される
memory=8GB    # ⭕ 正しい

④ パスのバックスラッシュをエスケープしていない

パスを指定するキー(swapFilekernel)では、バックスラッシュを二重にする必要があります。

swapFile=C:\temp\wsl-swap.vhdx     # ✖
swapFile=C:\\temp\\wsl-swap.vhdx   # ⭕

wsl --shutdown せずに確認している

上の「8秒ルール」です。ディストリを閉じてすぐ開き直しても、サブシステムがまだ生きているため新設定は読まれません。

💡
手書きが不安ならGUIを使う手もあります。 Microsoftは公式ドキュメントで、.wslconfig を直接編集するよりスタートメニューの「WSL Settings」アプリから変更することを推奨しています。書式ミスで黙って無視される事故を避けられます。

まとめ

  • 「WSLが重い」はメモリ・ファイルI/O・ディスクの3つに切り分けるところから始める
  • メモリは既定でRAMの50%まで膨らむ仕様.wslconfigmemory で上限を切るのが最も効く
  • autoMemoryReclaim を追加しろ」は半分古い。既定はすでに dropCache で回収は動いている。gradual は体感速度優先の選択肢
  • ファイルI/Oが遅いなら、プロジェクトを /mnt/c からLinux側に移すだけで大幅に改善する
  • ディスクは自動では縮まないwsl --manage <distro> --set-sparse true で自動縮小を有効化する
  • 反映には wsl --shutdown が必要。書式ミスはエラーを出さずに無視されるので注意

まずは16GBマシン向けテンプレートをそのまま置いて wsl --shutdown し、タスクマネージャーで VmmemWSL が落ちているかを見てみてください。

💡
開発環境のチューニングや、チーム全体のWSL環境の標準化のご相談はお気軽にどうぞ!

お問合せはこちら

よくある質問(FAQ)

Q. memory はどれくらいにすればいいですか?

目安は搭載RAMの半分以下です。16GBマシンなら 8GB、エディタ中心の使い方なら 6GB まで下げても実用上困りません。ドックコンテナやローカルLLMを回す場合は多めに確保してください。下げすぎてOOMが出るようなら増やす、という順で調整するのが安全です。

Q. 設定したのに何も変わりません

典型的な原因は3つです。(1)wsl --shutdown をしていない、(2)ファイルを /etc/wsl.conf に置いている(正しくは %UserProfile%\.wslconfig)、(3)書式ミスで黙って無視されている。この順に確認してください。

Q. WSL1に戻せば速くなりますか?

用途次第ですが、基本的には推奨しません。 WSL1はOSをまたぐファイルアクセスが速い一方で、Linuxカーネルがなく、Dockerが使えず、システムコール互換性も部分的です。「どうしてもWindows側のファイルを直接扱う必要がある」ケース以外は、WSL2のままプロジェクトをLinux側に移す方が良い結果になります。

Q. スワップは切った方がいいですか?

基本は残しておいて問題ありません。既定ではメモリサイズの25%が割り当てられます。ただしスワップ用のVHDが %Temp% に作られるため、ディスク容量を節約したい場合は swap=0 で切るという選択もあります。その場合はメモリ不足時にプロセスが落ちやすくなる点に注意してください。

Q. VmmemWSLVmmem は違うものですか?

どちらもWSLの仮想マシンが使っているメモリを表します。新しいWSLでは VmmemWSL という名前で表示され、古い環境や他のHyper-VのVMと混ざる環境では Vmmem と表示されます。

関連記事

📄Arrow icon of a page linkWSLとは?簡単に図解で解説|WindowsでLinuxを使うメリットとWSL2インストール手順【2026年版】

📄Arrow icon of a page linkWSL3は存在しない|Microsoftが公式否定した誤報の正体とWSL container(wslc)の実際【2026年7月訂正】

📄Arrow icon of a page linkWSL container(wslc.exe)とは?導入手順と使い方を解説【パブリックプレビュー対応・2026年7月更新】

📄Arrow icon of a page linkWSLでローカルAIを動かす|GPUパススルーの実際と手順【WSL3・NPUパススルーは誤報:2026年7月訂正】

出典


関連記事

プログラミング学習でお悩みですか?

現役エンジニアがあなたの学習をマンツーマンでサポートします。

  • 学習の進め方がわからない
  • ポートフォリオの作り方を知りたい
  • 現場で使える技術を学びたい
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

学習・開発のお悩みは現役エンジニアに相談

メンタープログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら