WSL 性能调优实战指南:分 3 个阶段完成 6 项配置,资源占用减半
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
WSL 启动慢、time wsl --exec true要等几十秒、在 Windows 路径下编译代码比原生 Linux 慢好几倍。这篇文章用 WSL 官方开源仓库的真实配置接口,带你完成一轮 WSL 性能调优:先零配置装好基线,再写一个.wslconfig限制内存和 CPU,最后按存储和网络两项收口,全程不改一行代码。
先搞懂:原理与前置条件
WSL2 把发行版跑在 Hyper-V 轻量虚拟机里,资源由宿主机在虚拟机启动时一次性分配。源码里可以看到默认值偏保守:内存取宿主机的 50%,swap 取内存的 25%,所以默认体验偏重。
开始之前,确认 3 个前置条件:
- Windows 10/11 已开启虚拟化,PowerShell 里执行
wsl --update升级到最新版 - 已安装至少一个发行版:
wsl --install -d Ubuntu - 有管理员权限,能创建
%USERPROFILE%\.wslconfig
实战:分阶段操作
阶段一:零配置快速上手,先量出基线时间
做什么:装好发行版并测一次启动时间,后面所有调优效果都和这个基线对比。
# 升级到最新版并安装 Ubuntu wsl --update wsl --install -d Ubuntu # 记录基线启动耗时(秒) time wsl -d Ubuntu --exec true基线时间先写在便签里,没有基线的调优等于盲调。
阶段二:常用配置,用 .wslconfig 限制内存和 CPU
做什么:在%USERPROFILE%下新建.wslconfig,一行配置把内存从"宿主机的 50%"改成固定值。
[wsl2] memory=8GB # 限制虚拟机内存,避免挤占 Windows processors=4 # 分配 CPU 核心数 swap=2GB # 限制交换分区(默认按内存 25% 自动算) localhostForwarding=true # 保留 Windows 与 Linux 的端口转发这些参数在虚拟机启动时由 wslservice 读取并下发,改完后必须执行
wsl --shutdown再打开发行版才生效,不用重装。
WSL 设置应用的 General 页面,内存、CPU、交换分区选项与 .wslconfig 一一对应。
同一阶段再做一件事:启用 systemd 并精简服务。
# 写入发行版内的 /etc/wsl.conf [boot] systemd=true # 启用 systemd command=service docker start # 开机只拉起需要的服务# 查看已启用的服务,挑掉不用的 systemctl list-unit-files --type=service --state=enabled sudo systemctl disable bluetooth cups开启后 init 会 fork 出
/sbin/init让 systemd 占住 pid 1,机制细节见 doc/docs/technical-documentation/systemd.md。
阶段三:进阶玩法,存储路径与网络模式
做什么:把项目代码挪进 WSL 内部路径,按需求选网络模式。
# 把项目从 Windows 路径挪进 WSL 内部目录 cp -a /mnt/c/projects/myapp ~/projects/myappWindows 盘由宿主机上的 plan9 文件服务器跨虚拟机边界提供,每次 IO 都要出 VM,慢是架构属性,见 doc/docs/technical-documentation/drvfs.md。所以编译、装依赖放在
~/projects下,/mnt/c只用来共享文件。
网络方面,默认 NAT 模式够用;要跑 GUI 应用或让 Windows 侧直连 Linux 服务时,换成 mirrored:
[wsl2] networkingMode=mirrored # 与宿主共享网卡,无需端口转发NAT 模式下 wslrelay 会自动侦测 TCP 端口并做转发,mirrored 模式下 localhost 双向直连,原理见 doc/docs/technical-documentation/localhost.md。
WSL 设置应用中的网络集成选项,与 .wslconfig 的 networkingMode 对应。
验证:改完怎么确认生效
wsl --shutdown && wsl -d Ubuntu --exec free -m time wsl -d Ubuntu --exec truefree -m输出的内存总量应等于你写的memory值而不是宿主机的 50%;启动耗时以基线对比:
| 指标 | 默认值 | 调优后(参考) |
|---|---|---|
| 虚拟机内存上限 | 宿主机 50%(16GB 机器即 8GB) | 按 memory= 固定值 |
| 启动耗时 | 40s 上下(systemd 全量服务) | 10s 内(精简服务后) |
避坑:常见疑问
改了 .wslconfig 为什么不生效?
该文件只在虚拟机启动时读取。执行wsl --shutdown再重新打开发行版即可,不需要卸载重装,改错值也会自动回落到默认值并给出警告。
memory 限制了但 free 显示的还是很大?
物理内存不足时,memory=会被忽略并按宿主机 50% 分配。如果企业环境有组策略接管 WSL 设置,配置会被策略覆盖并提示 "overridden by policy",这种情况要联系 IT 调整。
启用 systemd 会不会让启动更慢?
慢的根源是 enabled 服务太多,不是 systemd 本身。Docker 等服务依赖它,保留 systemd、用systemctl disable精简服务,才是正确姿势。
调完为什么 /mnt/c 还是慢?
跨边界 IO 慢是架构决定的,配置改不了。把高频读写的项目目录放进 WSL 内部路径,Windows 侧用 VSCode Remote 编辑即可。
调完这 6 项,虚拟机内存从宿主机 50% 降到固定值,启动耗时和跨系统 IO 都有肉眼可见的改善,Windows 侧也不容易被拖卡。想继续深入可以看:
- 自定义内核:
.wslconfig的[wsl2]段支持kernel=指向自编译内核,裁掉不需要的模块 - GPU 加速图形应用:参考 WSL 设置中的图形加速选项配合 wslg 使用
- 网络深挖:NAT 模式下可调整
dhcp、firewall选项,或阅读仓库 doc/docs/technical-documentation/ 下的 networking 相关文档
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考