WSL 性能调优:3 处配置让 ls 从 30 秒变 3 秒
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
凌晨两点,你在 WSL 终端里敲了一个ls /mnt/c,光标转了三十秒还没回来。这不是玄学——WSL 性能调优要做的,就是把这种"卡"变成"能定位、能改"。这个项目把 Windows 侧的服务和 Linux 发行版装在同一个体系里跑,默认参数偏保守,但每个慢点都有对应的开关,你只需要找到属于你的那一个。
先做三个自检,定位 WSL 卡在哪一环
别急着改配置,先对号入座:
wsl -l -v # 确认是 WSL1 还是 WSL2 free -m # 看内存实际占用 time wsl -e true # 测一次启动耗时wsl -l -v的 VERSION 列显示 2,才谈得上下面的内存和交换区设置;显示 1 的话,升级发行版比调参数有用得多。free -m里 available 长期低于 1GB,是资源分配问题,看场景一。- 启动耗时超过 10 秒,大概率是开机项问题,跳场景三。
- 代码目录在
/mnt/c下,那 IO 慢是结构性的,见场景二。
场景一:天天跑 Docker、虚拟机把内存吃满的人
Docker Desktop 的容器其实跑在一台 Hyper-V 轻量虚拟机里,而这台虚拟机默认能拿到的内存是你物理内存的一半。机器 16GB,WSL 就能占到 8GB,Windows 侧开始疯狂换页,于是"跑着跑着就卡"。
改哪个文件:%USERPROFILE%\.wslconfig(没有就新建),加两行:
[wsl2] memory=4GB swap=2GB这两个参数由 wslservice 在启动虚拟机时读取并下发,所以改完必须wsl --shutdown再重新打开才生效——直接开新终端不算重启。验证:重开后再跑free -m,total 应该正好是你设的 4GB。顺手加一行localhostForwarding=true,WSL 里的服务在浏览器里直接用 localhost 访问,省掉手动记虚拟机 IP 的麻烦。
场景二:代码仓库放在 Windows 盘的人
这是最容易翻车的一环。/mnt/c下的文件走跨系统挂载,WSL2 里底层经 plan9/virtiofs 通道进出,机制在 drvfs 文档 里写得很清楚:每个文件操作都要过一道 Windows 内核,ls转圈多半就转在这。
改哪个文件:发行版内的/etc/wsl.conf,加一行让挂载带上元数据:
[automount] options="metadata"它解决的是 chmod、chown 这些权限操作真正生效的问题,救不了"慢"本身。真正的解法是搬家:把仓库 clone 到 WSL 内部的/home下,Windows 侧用 VS Code Remote 连进去编辑,形成"编辑在 Windows、跑在 WSL"的分工。验证:对同一个仓库分别在两个目录里跑time git status,差距通常是十倍起步。
场景三:多发行版来回切、开机项越攒越多的人
装过的发行版越多,默认那台机器的开机项就越长。开了 systemd 之后,启动单元动辄上百个,开发机真正需要的可能只有十几个。
改哪个文件:/etc/wsl.conf里先确认 systemd 已开启:
[boot] systemd=trueWSL 对 systemd 的启动方式是 fork 出/sbin/init再等它就绪(细节见 systemd 文档),所以启动等待和服务数量直接挂钩。进系统跑systemctl list-unit-files --type=service --state=enabled看清单,打印机、蓝牙这类用sudo systemctl disable干掉即可。验证:time wsl -e true连测三次取最好成绩,通常能从十几秒压到个位数。
踩坑实录
有人把memory设成 8GB 还抱怨 Windows 更卡——虚拟机内存是启动时就预留的,设得比物理内存还大,等于还没跑就把页文件挤爆了。设成物理内存的三四成比较稳。
我实测时还踩过一个:改完.wslconfig直接开新终端,参数纹丝不动。这个文件只在虚拟机冷启动时读一次,wsl --shutdown才是它对应的"保存并重启",之后一切正常。
还有个反直觉的:swapFile默认写在 C 盘,Windows 和 WSL 抢同一条盘道;把它指到 D 盘,Windows 侧的磁盘 IO 反而干净了,两者同时变快。
一页速查
| 改什么 | 文件 | 加什么 | 解决什么 | 验证方式 |
|---|---|---|---|---|
| 内存上限 | %USERPROFILE%\.wslconfig | memory=4GB | Windows 内存紧张 | free -m |
| 交换区 | 同上 | swap=2GB | 内存峰值超限 | 发行版内top |
| 交换区位置 | 同上 | swapFile=D:\wsl-swap.vhdx | C 盘 IO 挤占 | 观察 C 盘占用 |
| 端口转发 | 同上 | localhostForwarding=true | 服务要手动记 VM IP | 浏览器开 localhost:3000 |
| 挂载元数据 | 发行版内/etc/wsl.conf | options="metadata" | chmod/chown 不生效 | chmod 后ls -l |
| 开机服务 | 同上 + systemd | systemd=true+systemctl disable | 启动慢 | time wsl -e true |
以上每项改完都要wsl --shutdown重开才生效。这套配置全部来自 WSL 开源仓库 main 分支的.wslconfig与/etc/wsl.conf官方配置接口。
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考