WSL 性能调优实战指南:分 3 个阶段完成 6 项配置,资源占用减半
2026/9/9 21:34:46 网站建设 项目流程

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/myapp

Windows 盘由宿主机上的 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 true

free -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 模式下可调整dhcpfirewall选项,或阅读仓库 doc/docs/technical-documentation/ 下的 networking 相关文档

【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询