ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows / WSL2 下 Docker 占用内存过高?.wslconfig 配置指南

Windows / WSL2 下 Docker 占用内存过高?.wslconfig 配置指南 用 Windows Docker Desktop 开发的同学大概都见过这个场景任务管理器里一个叫 Vmmem 或者 VmmemWSL 的进程吃掉十几个 G 内存电脑卡得不行但你 docker stats 一看所有容器加起来才用了 2G。多出来的内存去哪了这是 WSL2 的内存回收机制问题不是 Docker 的 bug。这篇讲清楚原理、怎么用 .wslconfig 限制、以及几个立即释放内存的办法。原理为什么 Vmmem 占用远超容器实际用量Docker Desktop 在 Windows 上默认跑在WSL2 后端里——本质是一个轻量 Linux 虚拟机。你的容器跑在这个 VM 中Vmmem 进程就是这个 VM 在 Windows 侧的内存映射。问题出在 WSL2 的内存管理默认上限高WSL2 虚拟机默认最多可以用到宿主机物理内存的50%内存大于 8G 时或 80%小于 8G 时老版本行为。16G 内存的机器WSL2 默认能吃到 8G内存不主动归还Linux 内核会把空闲内存拿去做 page cache文件缓存。容器读过的镜像层、写过的文件都会进 cache。Windows 侧看就是 Vmmem 占用很高。即使容器停了cache 不释放Vmmem 也不降所以你会看到容器只用 2G 但 Vmmem 占 12G——大头是 Linux 的 page cache 和 VM 预留不是容器真的在用。确认一下# Windows 侧看 Vmmem 占用 # 任务管理器 → 详细信息 → 找 Vmmem / VmmemWSL # 进 WSL 看 Linux 内部真实内存分布 wsl free -hfree -h 输出里 buff/cache 那一列很大、available 还很充足就说明是 cache 占用不是真泄漏。解法一.wslconfig 限制 WSL2 内存上限根治创建或编辑用户目录下的 .wslconfig 文件C:\Users\你的用户名\.wslconfigPowerShell 里快速打开notepad $env:USERPROFILE\.wslconfig写入文件不存在就新建[wsl2] memory6GB processors4 swap4GB localhostForwardingtrue各参数说明参数作用建议memoryWSL2 VM 内存上限物理内存的 1/3~1/2如 16G 机器设 6GBprocessors分配给 VM 的 CPU 核数物理核数的一半左右swapVM 的 swap 大小设为 memory 的 0.5~1 倍设 0 禁用localhostForwarding允许 Windows 访问 WSL 内 localhost 服务保持 true改完必须重启 WSL 才生效wsl --shutdown然后重新打开 Docker Desktop它会自动拉起 WSL。注意 wsl --shutdown 会停掉所有 WSL 里的东西包括正在跑的容器保存好工作再执行。memory 设多少合适日常开发跑几个容器数据库 应用4~6GB 足够要跑大型构建或多服务 Compose8GB别设太小2GB否则容器和构建会 OOM 或极慢设了上限后Vmmem 最多吃到这个值不会再无限涨到宿主机 50%。解法二Docker Desktop 里单独限制更细粒度.wslconfig 限制的是整个 WSL2 VM。如果还想限制 Docker 本身可以在 Docker Desktop 里设Settings → Resources → AdvancedMemoryDocker 可用内存不能超过 .wslconfig 的 memoryCPUsDocker 可用核数Disk image size虚拟磁盘上限或者直接改 Docker Desktop 的 settings.json%APPDATA%\Docker\settings.json 或 Settings Store但推荐用 UI 改避免格式错误。两层限制的关系.wslconfig 是 VM 总闸Docker Desktop 是 Docker 这一个应用的闸。一般设 .wslconfig 就够了Docker 是 WSL 里主要的内存消费者。解法三立即释放内存不改配置的应急办法不想改配置、想马上把内存还回来办法 1重启 WSL最彻底wsl --shutdownVM 重建page cache 清空Vmmem 立刻降下来。代价是容器全停。办法 2在 WSL 内手动 drop cache不停容器wsl sudo sh -c echo 3 /proc/sys/vm/drop_caches释放 page cacheVmmem 会降一部分。但 Linux 之后还会慢慢用回 cache属于治标。办法 3停掉不用的容器和镜像docker compose down # 停当前项目 docker system prune -f # 清停止的容器和悬空镜像容器和镜像少了cache 来源就少了。日常开发建议下班前 wsl --shutdown 一次第二天开 Docker Desktop 自动拉起内存从干净状态开始。解法四换 Hyper-V 后端不推荐但可选Docker Desktop 支持切换后端Settings → General → 取消 Use the WSL 2 based engine回退到 Hyper-V。Hyper-V 后端的内存行为不同但整体性能和文件 IO 比 WSL2 差且配置更重。除非 WSL2 有无法解决的兼容问题否则不建议换WSL2 是现在的主流和推荐后端。一个完整的配置示例16G 内存开发机的推荐 .wslconfig[wsl2] memory6GB processors4 swap2GB localhostForwardingtrue # 限制 page cache 回收更积极可选进阶 [wsl2] autoMemoryReclaimgradualautoMemoryReclaimgradual 是较新 WSL 版本Windows 11 22H2 / WSL 0.67支持的选项让 WSL自动 gradual 回收 cache 内存归还给 Windows能显著缓解cache 不释放问题。如果你的 WSL 版本支持强烈建议加上wsl --version # 查看 WSL 版本0.67 支持 autoMemoryReclaim支持的话配置[wsl2] memory6GB autoMemoryReclaimgradual这是目前最优雅的解法——不用手动 drop cacheWSL 自己会把空闲 cache 还回来。排查清单现象原因处理Vmmem 占用远超容器用量page cache VM 预留设 .wslconfig memory 上限容器停了 Vmmem 不降cache 不主动归还autoMemoryReclaimgradual 或 drop_caches改 .wslconfig 不生效没重启 WSLwsl --shutdown 后重开 Docker设了 memory 后容器 OOM上限设太小调大 memory 或减少同时跑的容器找不到 .wslconfig路径不对必须在 %USERPROFILE%\.wslconfig不是 WSL 里小结Windows 上 Docker 吃内存的本质是 WSL2 虚拟机的内存管理默认上限高宿主机 50% page cache 不主动归还导致 Vmmem 占用远超容器真实用量。四层解法按优先级.wslconfig 设 memory 上限根治总量新版 WSL 加 autoMemoryReclaimgradual自动还 cache最优雅应急用 wsl --shutdown 或 drop_caches 立即释放Docker Desktop Resources 里做细粒度限制配置完记得 wsl --shutdown 重启生效。16G 内存的机器设 6GB 上限 gradual 回收日常开发基本不会再被 Vmmem 卡住。
返回列表