WSL 2 正在加速 Windows 文件系统访问
WSL 从 WSL 1 中的 DrvFs 到 Plan 9 再到 virtiofs,WSL 2 中跨操作系统的文件访问在每一代中都有所改进。一项新变化为每个 virtio 设备提供了自己的专用 DMA 池,从而消除了 virtiofs 路径上的最后一个主要竞争点。如果你的工作流程跨越 Windows/Linux 边界,WSL 2 中的文件 I/O 性能一直在稳步提升。2026 年 5 月,WSL 2 引入了一项改变,消除了 virtiofs 路径上的最后一个瓶颈。要理解这有什么重要性,了解跨操作系统文件访问的演变过程有助于理解。我们是如何走到这一步的 2016 年的 WSL 1 通过 DrvFs 处理 Windows 驱动器访问,这是一个在 Windows NT 内核中运行的自定义文件系统驱动程序。由于 WSL 1 直接通过兼容层在 Windows 内核上运行 Linux 进程,因此对 /mnt/c 的文件操作几乎可以直接访问 NTFS。对于文件密集型工作负载,性能很好。2019 年 5 月,WSL 2 用轻量级 Hyper-V 虚拟机中的完整 Linux 内核替换了该模型。这是一个正确的交易:真实的 Linux 内核调用、适当的系统调用兼容性和对于 Linux 原生工作负载的更好性能。对于跨操作系统访问,虚拟机边界意味着需要不同的方法。微软在 Windows 侧的 WSL 服务中构建了一个 Plan 9 (9P) 文件服务器。你的 Linux 会话通过 Hyper-V 套接字在启动时连接到它,并且对 /mnt/c 的文件操作通过 9P 协议通道进行。9P 通过 Hyper-V 套接字工作,但它有协议开销:每个操作受限于一个消息大小参数 (msize=65536,64 KB)。对许多小文件的文件密集型工作负载在每次往返时都要承担这种开销。自 WSL 2 启动以来,微软一直在对其进行迭代。大约在 2021 年,virtiofs 作为实验性选项出现。与 9P 相比,virtiofs 使用 VirtIO 传输进行共享内存文件访问,减少了序列化开销。你可以通过在 .wslconfig 的 [wsl2] 部分中启用 virtiofs=true 来启用它。从那时起,它已逐步改进:在 PR #40298 中改进设备重用,在 PR #40426 中增加了无 DAX 的共享 mmap 支持,现在修复了 DMA 层。DMA 层 在 Hyper-V 上的虚拟机通过跳跃缓冲区执行 DMA 进行 I/O:一个保留的内存区域,在 4 GB DMA 边界以下,硬件可以直接寻址。Linux 内核将其称为 SWIOTLB 池。直到最近,WSL 2 会话中的所有 virtio 设备共享一个全局池。一个用于 /mnt/c 的 virtiofs 挂载、一个用于 /mnt/d 的挂载和 virtio 网络适配器都排队到同一个缓冲区,在重 I/O 期间彼此争用。PR #40654,由 Ben Hillis 提交并于 2026 年 5 月 27 日合并,为每个 virtio 设备提供了自己的专用 DMA 池。内核在启动时在 4 GB 以下分配一个连续的物理范围,并通过 sysfs(/sys/bus/vmbus/drivers/hv_pci/swiotlb_base 和 swiotlb_size)发布其地址,WSL 服务读取这些值并在每个 virtio 设备创建时注入 per-device swiotlb= 选项。驱动器与网络适配器之间不再有共享队列。注意:这需要内核 Microsoft.WSL.Kernel 6.18.26.3-1,与 WSL 2 DeviceHost 1.2.29-0 一起提供。如果你在旧内核上,WSL 会告知你:“正在运行的内核缺少显著改善 virtio 设备性能的补丁。请更新到更近期的 WSL 内核以启用此优化。” 这在实践中意味着什么 受益最大的场景是文件密集型跨操作系统工作流程:在一个位于 Windows 驱动器上的项目中工作,但在 Linux 中构建。如果你将代码保存在 C:\Users\you\code 下并从 /mnt/c 运行 cargo build、npm install 或 mvn package,则每次文件读取都会支付一次跨操作系统的 I/O 成本。每个设备池消除了 virtiofs 路径上剩余的一个竞争点。VirtioProxy 网络也受益,因为它共享相同的 DMA 基础设施并获得自己的池。要充分利用这一点:在 .wslconfig 的 [wsl2] 部分中设置 virtiofs=true。使用 wsl.exe --update --pre-release 更新到最新的 WSL 内核。保持你的 WSL 2 会话内存大于 1 GB。SWIOTLB 池需要至少 64 MB 的操作余地。virtiofs 目前仍为可选:默认传输仍然是通过 Hyper-V 套接字的 Plan 9。跨操作系统边界的 WSL 文件系统性能在每一代中都在改善。WSL 1 的 DrvFs 之所以快速,是因为没有虚拟机边界。WSL 2 引入了虚拟机和对 9P 的转变。virtiofs 缩小了大部分差距。每设备 SWIOTLB 池消除了 DMA 层的竞争。差距在不断缩小。默认仍然是通过 Hyper-V 套接字的 Plan 9。virtiofs 仍然是可选的。该工作仍在开放中,访问 github.com/microsoft/WSL 。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡