WSL2 でビルドを回すとメモリが足りない。かといって .wslconfig に数字を書いたのに、free -h の値が思ったとおりにならない——。この2つは、既定値の決まり方と要求値と実測値がずれる理由を押さえると片付く。
検証環境と方法:Windows 11 / WSL 2.6.3.0 / カーネル 6.6.87.2-1 / 物理RAM 31.86 GiB。.wslconfig に memory=28GB を設定済みの実機で /proc/meminfo を読んだ値を載せている。既定値は Microsoft 公式ドキュメント(2026-06-02 更新)の記載。測っていない範囲=設定を外した既定状態の実測(当機は設定済みで、戻す作業はしていない)、他マシン・他バージョンでの再現。
結論
- 既定は 物理メモリの50%(公式)。swap は メモリの25%をGB単位で切り上げ(公式)
- 当機では
memory=28GBに対しMemTotalが 27.41 GiB=約608 MiB 少なかった(1点の実測) - 🔴
.wslconfigが壊れていてもエラーは出ず、設定が無視されるだけ(公式明記) - 当機は値の後ろに
#コメントが付いた状態で設定が適用されている(有無の比較はしていない) - 反映には
wsl --shutdownと約8秒の待ちが要る(公式)
既定ではどれだけ割り当てられる?
公式ドキュメントの [wsl2] セクションにはこう書かれている。
| キー | 既定値 |
|---|---|
memory |
Windows の全メモリの 50% |
swap |
メモリサイズの 25% を GB 単位で切り上げ |
processors |
Windows の論理プロセッサ数と同じ |
当機は物理 31.86 GiB なので、無設定なら約 15.9 GiB になる計算だ。実際の MemTotal は 27.41 GiB なので、memory=28GB の指定が効いていることが確認できる。
swap のほうは、公式の式をそのまま検算できた。実測の SwapTotal は 7.00 GiB ちょうどだ。
| 基準 | 計算 | 予測値 | 実測 7.00 GiB と |
|---|---|---|---|
| 割り当てメモリ | ceil(28 × 0.25) | 7 GiB | ✅ 一致 |
| 物理メモリ | ceil(31.86 × 0.25) | 8 GiB | 不一致 |
2つの解釈が別々の値を予測するので、1点の実測でも区別がつく。swap の既定は「物理メモリ」ではなく「割り当てたメモリ」を基準にしている=memory を増やすと swap も連動して増える。ディスクを食いたくないなら swap=0 を明示する。
28GB と書いたのに 27.41 GiB なのはなぜ?
.wslconfig の値はVM に渡すサイズで、MemTotal はLinux カーネルが起動したあとに使える量だ。カーネル自身の領域や予約分がそこから引かれるため、両者がずれること自体は仕組み上そうなる。当機の実測はこうなる。
| 項目 | 値 |
|---|---|
| 物理RAM | 31.86 GiB |
.wslconfig の指定 |
28GB(=28 GiB) |
実測 MemTotal |
27.41 GiB |
| 差 | 約608 MiB |
| 物理に対する割合 | 86.0% |
⚠ 測ったのは当機の1点だけなので、「常に一致しない」と一般化はできない。それでも差が出る前提で余裕を持たせるほうが安全だ。ぴったりの数字を当てにした見積もりはしない、という程度に受け取ってほしい。
なお単位の書き方は、公式では省略するとバイト扱いになる。memory=8 と書くと 8 バイトの要求になってしまうので、GB や MB を必ず付ける。
設定が効かないとき、何が起きている?
ここが一番はまりやすい。公式ドキュメントにこう書かれている。
「ファイルが存在しないか、形式が不正(improper markup formatting)な場合、WSL は設定を適用せずに通常どおり起動を続けます」
つまり 書式を間違えてもエラーにならない。「設定したのに変わらない」という顔でしか失敗が現れない。
疑うべき点は3つある。
- 置き場所:
%UserProfile%\.wslconfig(=C:\Users\<ユーザー名>\.wslconfig)。WSL の中の/etc/wsl.confとは別物で、メモリ割り当ては前者にしか書けない - セクション見出し:
[wsl2]が要る。これが無いとキーはどこにも属さない - 反映待ち:
wsl --shutdownのあと、約8秒待ってから起動する(公式が「8秒ルール」として明記している)
設定が効いたかどうかは /proc/meminfo で確かめられる。
grep -E "MemTotal|SwapTotal" /proc/meminfo
ここが物理メモリのちょうど半分あたりを指しているなら、既定値のまま=設定が読まれていないと判断できる。
コメントは書ける?
当機の .wslconfig は値の後ろにコメントが付いた状態で、それでも 27.41 GiB が割り当たっている(既定なら約15.9 GiB のはず)。少なくともこの書き方でファイルは読まれている。
[wsl2]
memory=28GB # 割り当てたいメモリサイズを指定
networkingMode=mirrored
⚠ ただしコメントの有無を切り替えて比較したわけではない(当機の設定を書き換えて WSL を再起動する検証はしていない)。言えるのは「この形で設定が適用されている」までで、行末コメントが常に安全だと確かめたわけではない。前段のとおり書式エラーは黙って無視されるので、凝った書き方をするより行頭コメントに寄せるほうが安全だ。
どれくらい割り当てるのが妥当?
- Windows 側に最低 4〜8 GiB は残す。WSL2 のVMだけでなくエクスプローラやブラウザも動いている
- 割り当てを増やすと swap も連動して増える(既定は割り当ての25%)。ディスクが厳しいなら
swapを明示する - 単位を必ず付ける。省略はバイト扱い
- 変更したら
MemTotalで確認する。設定ミスは黙って無視されるので、見に行かないと気づけない - 物理メモリが足りないなら割り当てでは解決しない。増設か構成の見直しになる
当機は 31.86 GiB のうち 28 GiB(86%)を WSL2 に振っている。3DCG や生成AIのようにメモリを食う作業を Windows 側でも並行するなら、ここまで寄せると窮屈になる。用途に応じて決める値であって、推奨値があるわけではない。
よくある質問
まず wsl --shutdown を実行し、約8秒待ってから起動し直してください。それでも変わらない場合、置き場所(%UserProfile%\.wslconfig)と [wsl2] セクション見出しの有無を確認します。公式ドキュメントは書式が不正な場合はエラーを出さず設定を無視すると明記しているため、間違いは「変わらない」という形でしか現れません。
ずれるのは仕組み上そうなります。.wslconfig の値はVMに渡すサイズで、MemTotal はカーネル起動後に使える量だからです。当機では memory=28GB に対して MemTotal が 27.41 GiB で、約608 MiB の差がありました(1点の実測で、608 MiB の内訳までは分解していません)。差が出る前提で余裕を持たせてください。
公式ドキュメントによると memory の既定はWindows の全メモリの50%、swap はメモリサイズの25%をGB単位で切り上げ、processors は論理プロセッサ数と同じです。MemTotal が物理メモリのちょうど半分あたりなら、既定のまま動いていると判断できます。
swap=0 で無効にできます。既定は割り当てたメモリの25%なので、memory を増やすと swap も自動的に増え、その分ディスクを消費します。当機では memory=28GB に対して SwapTotal が 7.00 GiB ちょうどで、公式の式と一致しました。
公式ドキュメントでは size 型の値は既定でバイトと定義されています。memory=8 は 8 バイトの要求になってしまうため、8GB や 512MB のように単位を必ず付けてください。
まとめ
WSL2 のメモリ割り当てで押さえるべきは3点だ。既定は物理の50%・swap は割り当ての25%。指定した値と MemTotal は一致しない(当機で約608 MiB の差)。そして書式ミスは黙って無視される。
3つ目がいちばん厄介で、公式が「エラーにせず設定を適用しないまま起動する」と明記している以上、変更したら必ず MemTotal を見に行くしかない。wsl --shutdown と8秒の待ちを挟んでから確認する、というのを手順に組み込んでおきたい。

コメント