前回のDay 06では、Windows 11上にWSL2とDocker Desktopを導入し、本物のLinuxコンテナが動く環境を手に入れました。
しかし、初期設定のまま使い続けると、「なぜかWindowsの動作が重い」「タスクマネージャーのVmmemがメモリを12GBも食っている」「SSDの空き容量がいつの間にか数十GB減っている」というトラブルに必ず直面します。
本日は、ベテランエンジニアが安心して日常開発に没頭できるよう、ホストPCを軽く保つリソース最適化とディスク管理の黄金設定を完全伝授します!
① 導入・本日の達成目標
従来のHyper-VやVMwareでは、「仮想マシン作成時にメモリ4GBを固定割り当て」するのが当たり前でした。 一方、WSL2は「動的メモリ確保(ホストのメモリを最大80%まで自動拡張)」という挙動を取るため、何も制限しないとホストWindows側のメモリを食い尽くしてしまいます。
本日の講義を終える頃には、以下の3つの目標を完全にマスターできます。
.wslconfigファイルを用いたCPU・メモリ・スワップの制限設定を正しく行い、ホストWindowsの快適性を100%保護する。- Docker Desktopの推奨設定(WSL Integration / Docker Engineデーモン設定)を適用し、不要なオーバーヘッドを排除する。
- ビルドキャッシュや未使用イメージで肥大化する仮想ディスク(
ext4.vhdx)のダイエットと定期メンテナンス手順を習得する。
② なぜPCが重くなるのか?(Vmmemプロセスの正体と動的メモリ確保)
Docker Desktopでコンテナを動かしているとき、Windowsのタスクマネージャーを開くと Vmmem または VmmemWSL というプロセスが大量のメモリ(8GB〜16GB以上)を消費しているのを目撃することがあります。
これにはLinuxカーネルの「ページキャッシュ(Page Cache)」仕様が深く関係しています。
- Linuxは、一度読み込んだファイルやコンテナビルド時のデータを、空いているメモリに「キャッシュ」として極力保持し続ける性質があります。
- WSL2はホストWindowsの空きメモリを動的にどんどん確保してLinux側のキャッシュに充てるため、「メモリを使い終わってもホストにすぐ返却されない」という現象が発生します。
- 結果として、Windows側でVisual Studioやブラウザ(Chrome/Edge)を開いた際にメモリ不足が発生し、スワップアウトによる重篤なスラッシング(激重状態)に陥ります。
この問題を根本から解決するのが、Windowsのユーザー設定ファイル .wslconfig です。
③ .wslconfig によるホストPC保護の黄金設定
ユーザーのホームディレクトリ(C:\Users\<ユーザー名>\.wslconfig)に設定ファイルを配置することで、WSL2およびDockerが使用できる最大メモリ・CPUコア数・スワップサイズに厳格な上限をかけることができます。
【実務標準】推奨 .wslconfig テンプレート
[wsl2] # 1. WSL2全体で使用する最大メモリサイズ(物理メモリの25%〜50%を推奨) # 物理16GBのPC ➡ 4GB〜6GB / 物理32GBのPC ➡ 8GB〜12GB memory=6GB # 2. 割り当てる論理CPUコア数(物理コア数の半分程度を指定) processors=4 # 3. スワップ領域のサイズ(SSDの消耗を防ぎつつ安全弁として2GB程度確保) swap=2GB # 4. localhostでのポートフォワーディングを有効化 localhostForwarding=true [experimental] # メモリ自動解放機能(未使用キャッシュをWindowsへ速やかに返却:Windows 11 22H2以降) autoMemoryReclaim=gradual
設定の反映手順(PowerShell)
.wslconfig を作成・編集した後は、必ずWSL2を一度完全停止(シャットダウン)して設定を読み込ませます。
# 1. 稼働中のWSL2インスタンスを完全停止 wsl --shutdown # 2. Docker Desktopを再起動すると、指定したメモリ上限(6GB)内で快適に稼働開始
④ Docker Desktopの推奨設定(WSL Integrationとログ最適化)
Docker DesktopのGUI設定(画面右上の歯車アイコン)でも、実務に最適な推奨パラメータを設定しておきましょう。
| 設定タブ | 推奨設定値 | 設定する理由・効果 |
|---|---|---|
| General | Use the WSL 2 based engine: ON | Hyper-V仮想マシンを使わず超軽量WSL2バックエンドで動作させる。 |
| General | Start Docker Desktop when you log in: OFF(推奨) | Windows起動時の負担を減らし、開発時のみ必要なタイミングで起動。 |
| Resources ➡ WSL Integration | Ubuntu: ON | Ubuntuターミナル内から docker コマンドを直接実行可能にする。 |
| Docker Engine | log-driver 設定(下記JSON参照) | コンテナログが無限に溜まってディスクを圧迫するのを防止。 |
【必須】Docker Engine のログローテーション設定
「Docker Engine」設定タブを開き、以下のJSON設定をマージしておくと、コンテナログがディスクを食いつぶす事故を完全防止できます。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
⑤ ディスク容量管理(仮想ディスク ext4.vhdx の肥大化とダイエット)
Dockerを使い続けていると直面するもう1つの罠が、「SSD容量の圧迫(仮想ディスクの自動肥大化)」です。
WSL2およびDocker Desktopは、コンテナやイメージのデータを ext4.vhdx(仮想ハードディスクファイル) に格納しています。
.vhdx ファイルは、新しいイメージをビルドすると自動的にサイズが拡張(20GB ➡ 40GB ➡ 60GB)しますが、docker rmi 等でコンテナやイメージを削除してもWindows上のファイルサイズは自動では縮小(縮小解放)されません。
定期メンテナンスの2ステップ(PowerShell)
# Step 1: Docker内の不要なビルドキャッシュ・停止中コンテナ・未使用イメージを一括掃除 docker system prune -a --volumes -f # Step 2: WSL2を停止し、仮想ディスクファイルを物理的に圧縮(Windows 11 23H2以降) wsl --shutdown wsl --manage Ubuntu --compact wsl --manage docker-desktop-data --compact
これだけで、肥大化していた数十GBのSSD空き容量が一瞬で手元に戻ってきます!
⑥ C# / .NET 現場での実践アプローチ(マルチコンテナのメモリ配分)
C#開発では、Web APIだけでなく SQL Server や Redis などをローカルで同時に立ち上げることが日常茶飯事です。
それぞれのコンテナに適切なリソース上限(limits)を指定しておくことで、限られた開発機スペックでも安定してサクサク動作させることができます。
[A] composeファイルでのリソース制限定義例
services:
# 1. C# Web API(軽量・高スループット)
api:
build: .
ports:
- "8080:8080"
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
# 2. SQL Server(開発用DB:1.5GBあれば快適)
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=YourStrong@Passw0rd
ports:
- "1433:1433"
deploy:
resources:
limits:
cpus: '2.0'
memory: 1536M
# 3. Redis キャッシュ(極小256MBで十分)
cache:
image: redis:alpine
ports:
- "6379:6379"
deploy:
resources:
limits:
memory: 256M
[B] 稼働中のリソース診断コマンド(PowerShell)
# 1. 全コンテナのCPU/メモリ消費率をリアルタイム監視 docker stats --format "table {{.Name}} {{.CPUPerc}} {{.MemUsage}} {{.MemPerc}}" # 2. Dockerが現在ディスク上で消費している容量の内訳を確認 docker system df
[C] 4大AIエージェントへの指示プロンプト例
「Windows 11(RAM 16GB)のローカル環境向けに、ASP.NET Core Web API + SQL Server + Redis を同時起動する docker-compose.yml を作成してください。ホストPCが重くならないよう、各サービスに適切な cpus / memory の limits 設定を明記してください。」
「メモ帳で保存した時に .wslconfig.txt になっていて設定が無視される罠」
Windowsの標準設定(「登録されている拡張子は表示しない」)のままメモ帳で .wslconfig を保存すると、末尾に勝手に .txt が付いてしまい、WSL2が設定を読み込まない事故が多発します。
必ずエクスプローラーの「表示」メニューで「ファイル名拡張子」にチェックを入れ、ファイル名が正確に .wslconfig(ドットから始まる)になっていることを確認しましょう!また、編集後は wsl --shutdown を実行しないと反映されない点も要注意です。
.wslconfigでメモリ上限(例: 4〜6GB)を設定し、Vmmemによるホストメモリの食い尽くしを完全防止する。- WSL Integrationを有効化し、UbuntuターミナルとDocker Desktopをシームレスに連携させる。
- 仮想ディスク(
ext4.vhdx)は自動縮小されないため、docker system pruneとwsl --compactで定期ダイエットを行う。 - マルチコンテナは compose の
deploy.resources.limitsで各サービスのメモリ上限を制御する。
『Visual Studio 2022のコンテナツール拡張とDockerサポート追加』〜右クリック一発でコンテナ内デバッグ〜
コメント
コメントを投稿