WSL2编译卡顿八成源于磁盘I/O,主因是/mnt/c路径经drvfs挂载导致小文件读写延迟高;应将项目移至原生ext4.vhdx(如~/src/),并启用metadata挂载选项、关闭Defender扫描、配置pageReporting及定期收缩虚拟磁盘。
wsl2 编译大规模代码卡顿,八成问题出在磁盘 i/o 上。默认配置下,尤其是项目放在 /mnt/c 下编译,性能可能只有原生 linux 的 1/3 —— 因为 windows 文件系统(ntfs)经由 drvfs 挂载层转发,小文件密集读写时延迟高、吞吐低。
把代码和工作区放在 WSL2 原生 ext4 文件系统里
WSL2 底层使用一个叫 ext4.vhdx 的虚拟硬盘文件,挂载为 rootfs(即 /),它用的是真正的 Linux ext4 文件系统,I/O 性能接近物理 Linux。
务必把你的 Git 仓库、构建目录、Docker 构建上下文等,全部放在 WSL2 内部路径(如 ~/src/、/home/xxx/project),绝对不要放在 /mnt/c/Users/xxx/... 下编译。
- ✅ 正确:
cd ~/src/my-big-project && make - ❌ 高风险:
cd /mnt/c/Users/xxx/my-big-project && make
你可以用 df -h 确认:
Filesystem Size Used Avail Use% Mounted on rootfs 3.4G 2.7M 3.4G 1% / C:\ 931G 233G 698G 26% /mnt/c
第一行 rootfs 就是你的高性能区域;/mnt/c 是桥接挂载,性能受限。
关键配置:禁用 drvfs 元数据透传 + 调整挂载选项
编辑 WSL2 全局配置文件 /etc/wsl.conf(若不存在则新建):
[automount] enabled = true options = "metadata,umask=22,fmask=11" mountFsTab = true
-
metadata启用 Linux 权限和符号链接支持(必须开启,否则chmod、ln -s失效) -
umask=22和fmask=11是合理权限掩码,兼顾安全与协作
⚠️ 注意:options="metadata"不等于metadata=disabled——后者是反向操作,会彻底关闭元数据支持,导致大量工具(如 Git、Cargo、Bazel)行为异常,切勿设置metadata=disabled
关闭 Windows Defender 实时扫描
WSL2 的 ext4.vhdx 文件被 Defender 反复扫描,会显著拖慢 git checkout、cargo build 等操作。
操作路径:
- 打开「Windows 安全中心」→「病毒和威胁防护」→「管理设置」→「添加或删除排除项」
- 添加两项:
-
ext4.vhdx所在文件夹(通常是C:\Users\{用户名}\AppData\Local\Packages\...\LocalState\) - 进程
wsl.exe
-
实测关闭后,make -j8 编译耗时下降 30%+,尤其对含数千 .c/.cpp 文件的项目效果明显。
启用 pageReporting + 控制脏页刷盘节奏
在 Windows 用户目录(如 C:\Users\你的用户名)创建 .wslconfig 文件,加入:
[wsl2] memory=8GB processors=6 swap=0 pageReporting=true kernelCommandLine=sysctl.vm.dirty_expire_centisecs=500 sysctl.vm.dirty_writeback_centisecs=1000
-
pageReporting=true让 WSL2 主动通知 Windows 哪些内存页空闲,缓解“内存只涨不跌”问题 -
dirty_*参数缩短内核脏页缓存生命周期,避免编译中途突然卡顿(因内核批量刷盘阻塞)
保存后,在 PowerShell 中运行 wsl --shutdown 重启生效。
定期收缩虚拟磁盘,避免碎片和膨胀
WSL2 的 ext4.vhdx 不会自动释放已删除文件占用的空间,长期使用后体积虚大、IO 变慢。
微软官方推荐方法(2026 年最新):
- 在 PowerShell 中执行:
wsl --shutdown diskpart > select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\...\LocalState\ext4.vhdx" > attach vdisk readonly > compact vdisk > detach vdisk
- 或更简单:导出再导入(适合定期维护)
wsl --export Ubuntu-22.04 ubuntu-backup.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 .\ubuntu-new\ ubuntu-backup.tar --version 2
不复杂但容易忽略



















