composer如何在Windows Subsystem for Linux (WSL) 中获得最佳性能?(文件系统挂载建议)

6次阅读

wsl2 中 /mnt/c/ 下 composer install 极慢,因 ntfs 通过 drvfs 挂载导致高频小文件 i/o 延迟飙升 5–10 倍;应将项目移至 wsl2 原生 ext4 分区(如 ~/project),并禁用自动挂载与 windows 互操作以优化性能。

composer如何在Windows Subsystem for Linux (WSL) 中获得最佳性能?(文件系统挂载建议)

为什么 WSL2 的 /mnt/c/ 下 composer install 慢得像在编译 linux 内核

因为 windows 文件系统(NTFS)通过 /mnt/c/ 挂载到 WSL2 后,所有文件操作都要经过跨内核的翻译层(drvfs),inode、权限、符号链接、atime 等行为全被模拟,composer install 这种高频小文件读写场景会直接触发大量 syscall 转发,I/O 延迟飙升 5–10 倍是常态。

实操建议:

  • 永远不要把项目放在 /mnt/c/Users/xxx/project 或任何 /mnt/ 下路径中运行 composer installcomposer update
  • 把项目移到 WSL2 原生文件系统里,比如 ~/project/home/username/project/opt/project
  • 如果必须从 Windows 编辑(例如用 VS Code),用 WSL Remote 扩展打开 ~/project,而非打开 //wsl$/ubuntu/home/username/project —— 后者本质还是走网络共享,同样慢

如何确认当前项目是否在 WSL 原生文件系统上

执行 df -T .,看当前目录所在分区的 Type 列:

  • 显示 ext4zfs → 安全,是原生文件系统
  • 显示 9pdrvfs → 危险,正在走 Windows 文件桥接,性能受损
  • findmnt -T . 也能快速验证挂载源,重点看 TARGET 是否为 /(即根分区)

注意:/tmp 在 WSL2 中默认是 tmpfs,速度极快,但重启丢失;别误以为它适合放 vendor —— composer install 会失败,因为 vendor 需要持久化且支持硬链接

WSL1 和 WSL2 对 composer 性能的影响差异

WSL1 没有真实 Linux 内核,文件系统是直接映射,/mnt/c/ 下的 I/O 延迟比 WSL2 低不少,但代价是不兼容部分 Linux 行为(如 inotify 监听失效,导致 laravel Mix/HMR 失效)。

所以不能简单说“WSL1 更快就换回去”:

  • 如果你只跑 composer install + php artisan serve(无文件监听),WSL1 的 /mnt/c/ 可能勉强可用
  • 但只要涉及 symfony/flex 插件、phpstan 扫描、或任何依赖 inotify/epoll 的工具,必须用 WSL2 + 原生路径
  • WSL2 的内存和 CPU 开销更大,但对 composer 来说,I/O 瓶颈远大于 CPU,所以“慢在磁盘,不在核数”

额外提速:禁用 WSL2 的多余挂载和 Windows 集成

WSL2 默认自动挂载所有 Windows 驱动器(/mnt/d, /mnt/e…),并启用 Windows 互操作(code, explorer.exe 调用)。这些虽方便,但会增加初始化开销和潜在的文件系统干扰。

优化方法:

  • 编辑 /etc/wsl.conf(若不存在则新建),加入:
    [automount] enabled = false options = "metadata,uid=1000,gid=1000,umask=022"

    → 关闭自动挂载,避免 /mnt/ 下一空目录拖慢 findls

  • 在 Windows 的 PowerShell 中执行:wsl --shutdown,再重启 WSL,让配置生效
  • 不需要 Windows GUI 工具时,在 /etc/wsl.conf 加上:
    [interop] enabled = false

    → 减少进程间通信开销(对 composer 本身影响小,但减少后台干扰)

改完之后,composer install 不会变魔法般快 10 倍,但能稳定在原生 ext4 的预期水平 —— 也就是你该有的速度。真正的瓶颈从来不在 PHP 或 Composer,而在你敲下回车时,光标停在哪条路径上。

text=ZqhQzanResources