WSL2开发使用小贴士
WSL 1 和 WSL 2 有哪些关键不同?以及使用 Linux 工具链时,如何获取最大的文件性能?
WSL概述
适用于 Linux 的 Windows 子系统(Windows Subsystem for Linux,WSL)是 Windows 的一项功能,用于在 Windows 计算机上运行 Linux 环境,而无需完整的虚拟机。
目前 WSL 有 WSL 1 和 WSL 2 两个版本,虽然都是为了在 Windows 上运行 Linux 环境,但它们的实现方式完全不同。
| 功能 / 特点 | WSL 1 | WSL 2 |
|---|---|---|
| 架构 | 系统调用的翻译层 | Hyper-V 轻量级虚拟机 |
| 文件系统 | Windows NT 层模拟 Linux 文件系统 | ext4 格式的 VHDX 文件系统 |
| 快速启动 | ✅ | ✅ |
| 完整 Linux 内核 | ❌ | ✅ |
| 完整的系统调用兼容性 | ❌ | ✅ |
| 读写 Linux 上文件的性能 | ❌ | ✅ |
| 读写 Windows 上文件的性能 | ✅ | ❌ |
| systemd 支持 | ❌ | ✅ |
比较实现方式
WSL 1 是一个翻译层,在 Windows NT 内核上模拟 Linux 系统调用层,不是虚拟机也没有 Linux 内核。
WSL1 的机制是:
- Windows 截获 Linux 程序发出的系统调用;
- 转换成 Windows 的系统调用;
- 在 Windows 内核中执行。
WSL 2 是使用 Hyper-V 技术在轻量级虚拟机内运行特制内核的完整 Linux。
轻量级虚拟机是 Hyper-V 的一种特殊虚拟化模式,只提供运行 WSL 2、Docker Desktop 等功能所需的最少组件,由 Windows 自动创建、启动、停止和配置,动态分配资源且与 Windows 深度集成。
WSL 2 上 Linux 内核的“完整”和“特制”体现在以下方面:
- 保留核心功能:有完整的进程、内存管理、网络栈和文件系统支持,完整的系统调用接口;
- 精简非必须的功能:移除显卡等大多数硬件的驱动,硬件由 Hyper-V 虚拟化层提供;移除对老旧架构和部分企业级功能的支持;
- 添加 WSL 特有的功能模块:9P 文件系统用于访问 Windows 磁盘,内存动态调整,启动速度优化。
比较文件系统
WSL 1 的文件操作本质上都是 Windows 的 NTFS 文件系统在操作:
- 访问 Windows 文件:Windows 磁盘看似“挂载”在
/mnt下,实际上翻译层会直接将文件路径/mnt/c/xxx转换为 Windows 路径C:\xxx,相当于 NTFS 直接访问原始文件,速度快; - Linux 根文件系统:在 NTFS 上仿真实现 Linux 文件系统的行为,增加额外的仿真开销,速度稍慢;
WSL 2 强烈建议将文件放在 Linux 文件系统中:
- 访问 Windows 文件:Windows 磁盘使用 9P 网络文件系统协议挂载在
/mnt下,属于跨系统文件访问,速度很慢; - Linux 根文件系统:独立的 ext4 格式的 VHDX 文件,速度很快。
对文件读写性能进行排序:WSL 2 读写 Linux 文件 > WSL 1 读写 Windows 文件 > WSL 1 读写 Linux 文件 > WSL 2 读写 Windows 文件。
WSL2读写性能测试
若想获得最快的性能速度,请将文件存储在 WSL 文件系统中,使用 Linux 工具在 Linux 命令行中处理这些文件。跨操作系统访问文件可能会显著降低性能。
WSL 2 操作 Linux 文件和 Windows 文件的性能差距有多大呢?写个脚本简单测试下:
|
在 i5-12500H(4E8P)和 NVMe SSD 的环境下,测试结果如下:
$ ./wsl_fs_benchmark.sh |
---
config:
theme: 'base'
xyChart:
width: 600
height: 150
plotReservedSpacePercent: 50
showDataLabel: false
themeVariables:
xyChart:
darkMode: true
fontSize: 16px
backgroundColor: '#000'
titleColor: '#fcee09'
labelFontSize: 16
xAxisLabelColor: '#fff'
xAxisTitleColor: '#fff'
xAxisTickColor: '#fff'
xAxisLineColor: '#fff'
yAxisLabelColor: '#fff'
yAxisTitleColor: '#fff'
yAxisTickColor: '#fff'
yAxisLineColor: '#fff'
plotColorPalette: '#fcee09, #02d7f2'
---
xychart horizontal
title "WSL2操作不同文件系统的性能"
x-axis ["顺序读", "顺序写", "创建小文件"]
y-axis "速度(GB/s)" 0 --> 5.5
bar [5.3,0.89,5.36]
bar [0.14,0.11,0.04]
| 测试项目 | Linux | Windows |
|---|---|---|
| 顺序读(GB/s) | 5.3 | 0.14 |
| 顺序写(GB/s) | 0.89 | 0.11 |
| 创建大量小文件用时(秒) | 0.08 | 10.72 |
可以看到在 WSL 2 中,Linux 工具处理 Linux 文件的性能远远大于挂载的 Windows 文件。因此,官方文档中建议将文件存储在 WSL 文件系统中。
参考资料
WSL2开发使用小贴士