WSL 2 将提升 Windows 文件系统访问速度
速览
Windows Subsystem for Linux 2 (WSL 2) 正在获得性能改进,主要聚焦于加速与 Windows 文件系统的交互。这一更新将解决开发者在跨平台环境中频繁读写文件时的性能瓶颈。对于需要在 Linux 环境中处理大量 Windows 文件的开发者而言,这将带来更流畅的开发体验。
AI 深度解读
WSL 2 文件访问速度提升:移除 virtiofs 路径上的最后一个主要瓶颈
背景
WSL(Windows Subsystem for Linux)自诞生以来,其跨操作系统文件访问的性能一直是用户关注的焦点。从 WSL 1 的 DrvFs 到 WSL 2 引入的 Plan 9 协议,再到如今实验性的 virtiofs,这一路径上的每一次迭代都旨在缩小 Linux 与 Windows 之间的性能差距。
对于工作流跨越 Windows/Linux 边界的开发者而言,WSL 2 中的文件 I/O 性能一直在稳步提升。2026 年 5 月,一项关键变更被合并进 WSL 2 代码库,它移除了 virtiofs 路径上最后几个主要的瓶颈之一。要理解这一变更的重要性,我们需要回顾跨操作系统文件访问技术的演变历程。
WSL 1(2016 年发布)通过 DrvFs 处理 Windows 驱动器访问。DrvFs 是一个运行在 Windows NT 内核内部的自定义文件系统驱动程序。由于 WSL 1 通过兼容层直接在 Windows 内核上运行 Linux 进程,因此对 /mnt/c 的文件操作几乎可以直接触及 NTFS。这种架构使得文件密集型工作负载的性能表现良好。
然而,WSL 2(2019 年 5 月发布)彻底改变了这一模式,它在轻量级 Hyper-V 虚拟机中运行完整的 Linux 内核。这是一个正确的权衡:它提供了真正的 Linux 内核调用、完善的系统调用兼容性,以及针对 Linux 原生工作负载的更好性能。但对于跨操作系统访问,虚拟机边界意味着需要不同的方法。为此,微软在 Windows 侧的 WSL 服务中构建了一个 Plan 9 (9P) 文件服务器。Linux 会话在启动时通过 Hyper-V 套接字连接到它,对 /mnt/c 的文件操作便通过该 9P 协议通道进行传输。
虽然基于 Hyper-V 套接字的 9P 协议可以工作,但它存在协议开销:每个操作都受限于消息大小参数(msize=65536,即 64 KB)。对于涉及大量小文件的文件密集型工作负载,每次往返都会产生这种开销。自 WSL 2 发布以来,微软一直在对此进行迭代优化。
核心内容
virtiofs 的引入与演进
大约在 2021 年,virtiofs 作为实验性选项出现。Virtiofs 使用 VirtIO 传输进行共享内存文件访问,与 9P 相比,它减少了序列化开销。用户可以在 .wslconfig 文件的 [wsl2] 部分通过设置 virtiofs=true 来启用它。
自引入以来,virtiofs 逐步进行了多项改进:
- PR #40298:改进了设备复用。
- PR #40426:支持无需 DAX(Direct Access)的共享 mmap。
- 本次更新:解决了 DMA 层的争用问题。
DMA 层的技术细节
Hyper-V 上的虚拟机通过弹跳缓冲区(bounce buffers)执行 I/O 的 DMA(直接内存访问)。这是一种位于 4 GB DMA 边界以下的保留内存区域,硬件可以直接寻址。Linux 内核将此称为 SWIOTLB 池。
在最近的更新之前,WSL 2 会话中的所有 virtio 设备共享一个全局池。这意味着,用于 /mnt/c 的 virtiofs 挂载点、用于 /mnt/d 的挂载点以及 virtio 网络适配器,都会排队进入同一个缓冲区。在重 I/O 负载下,它们会相互争用资源。
本次更新的核心变更
由 Ben Hillis 编写并于 2026 年 5 月 27 日合并的 PR #40654 做出了关键改变:为每个 virtio 设备分配其专用的 DMA 池。
具体实现机制如下:
- 内核在启动时分配一个位于 4 GB 以下的连续物理范围。
- 通过 sysfs 发布其地址(位于
/sys/bus/vmbus/drivers/hv_pci/swiotlb_base和swiotlb_size)。 - WSL 服务读取这些值,并在创建每个 virtio 设备时,向其注入特定的
swiotlb=选项。
这一变更彻底消除了驱动器与网络适配器之间的共享队列争用。
启用条件与注意事项
要使用此优化,需要满足以下内核版本要求:
- 内核版本:
Microsoft.WSL.Kernel 6.18.26.3-1 - WSL 2 DeviceHost 版本:
1.2.29-0
如果用户使用的是较旧的内核,WSL 会提示:“运行的内核缺少显著改进 virtio 设备性能的补丁。请更新到更新的 WSL 内核以启用此优化。”
关键要点
- 性能瓶颈消除:本次更新通过为每个 virtio 设备提供专用的 DMA 池,解决了 virtiofs 路径上最后的重大争用点。
- 受益场景:
- 跨 OS 文件密集型工作流:例如代码存储在 Windows 驱动器(如
C:\Users\you\code),但在 Linux 环境中构建(如运行cargo build、npm install或mvn package)。 - VirtioProxy 网络:由于共享相同的 DMA 基础设施,网络性能也会因获得独立池而受益。
- 跨 OS 文件密集型工作流:例如代码存储在 Windows 驱动器(如
- 配置指南:
- 在
.wslconfig文件的[wsl2]部分设置virtiofs=true。 - 使用
wsl.exe --update --pre-release更新到最新的 WSL 内核。 - 保持 WSL 2 会话的 RAM 高于 1 GB。SWIOTLB 池需要至少 64 MB 的余量。
- 在
- 默认状态:Virtiofs 目前仍为**可选(opt-in)**功能,默认传输协议仍然是基于 Hyper-V 套接字的 Plan 9。
意义与影响
WSL 文件系统性能跨越操作系统边界的改进呈现出明显的代际上升趋势:
- WSL 1 的 DrvFs:因为没有虚拟机边界,所以速度很快。
- WSL 2 的 9P:引入了虚拟机,性能有所妥协。
- Virtiofs:缩小了大部分性能差距。
- 本次更新:通过移除 DMA 层的争用,进一步缩小了差距。
尽管默认设置仍然是 Plan 9,但 virtiofs 的持续优化表明微软正在致力于消除 Linux 与 Windows 之间的性能壁垒。这项工作在 GitHub 上的 microsoft/WSL 仓库中公开进行,体现了开源协作在提升开发者体验中的重要作用。对于重度依赖跨平台文件交互的开发者来说,启用 virtiofs 并更新内核将带来显著的性能提升。
