WSL磁盘性能测试:为什么我的/mnt挂载盘慢得像蜗牛?
开头先说痛点
用 WSL 的兄弟们,是不是都感觉 /mnt 盘慢得要死?
最常见的情况就是:代码放在 Windows 的 D 盘,然后在 WSL 里用 /mnt/d/ 去访问。一开始还好,项目小的时候没啥感觉。等到项目一大,node_modules 一多,跑个 npm install、git status 或者 Docker build,那速度简直能让你怀疑人生。
我一直好奇这到底有多慢,口说无凭,索性就拿我的电脑正经测了一下。不测不知道,一测吓一跳。
我的测试平台和工具
- 电脑: 联想 R9000P 2021 (R7 5800H, 64G 内存)
- 硬盘: 三星 980 NVMe SSD 500G (性能还算可以的一块盘)
- 工具:
fio。这玩意儿是专业的磁盘测试工具,比dd命令靠谱多了。核心参数是--direct=1,用来跳过内存缓存,测出来的才是硬盘的真实速度。
测试思路很简单,就在两个地方跑同样的测试命令做对比:
- WSL 原生目录:
/test(代表 ext4 文件系统性能) - Windows 挂载盘:
/mnt/d/test(代表 NTFS 文件系统性能)
不废话,直接上测试和结果
1. 顺序读写 (模拟拷贝大文件)
这是最基础的测试,看看持续读写大文件的速度。
测试命令:
# 测试写
fio --name=seq-write --rw=write --bs=1M --size=4G --direct=1 --directory=/path/to/test
# 测试读
fio --name=seq-read --rw=read --bs=1M --size=4G --direct=1 --directory=/path/to/test
结果对比:
| 操作类型 | 原生目录 (/test) |
挂载盘 (/mnt/d) |
性能差距 |
|---|---|---|---|
| 顺序写 | ~1467 MiB/s | ~105 MiB/s | 慢了 14 倍 |
| 顺序读 | ~1282 MiB/s | ~134 MiB/s | 慢了 9.5 倍 |
一句话小结: 看到没,差了整整一个数量级!在 /mnt 下搞大文件,性能基本就废了。
2. 4K 随机读 (模拟跑数据库、零碎小文件)
这才是体现 SSD 牛逼之处的测试,看的是 IOPS (每秒操作数)。
测试命令:
fio --name=rand-read --rw=randread --bs=4k --size=4G --direct=1 --directory=/path/to/test
结果对比:
| 操作类型 | 原生目录 (/test) |
挂载盘 (/mnt/d) |
性能差距 |
|---|---|---|---|
| 4K随机读 | ~4,638 IOPS | ~3,618 IOPS | 慢了约 28% |
一句话小结: 这次差距小多了,但原生还是快一截。说明对于小文件,/mnt 还能用,但已经不是满血状态了。
3. 高并发混合随机读写 (模拟真实项目高负载)
最后来个压力最大的,模拟一个跑着数据库和 Web 服务的真实项目,4 个线程同时进行 70% 读和 30% 写的操作。
测试命令:
fio --name=rand-rw-mix --rw=randrw --rwmixread=70 --bs=4k --size=4G --numjobs=4 --direct=1 --directory=/path/to/test
结果对比 (总 IOPS):
| 操作类型 | 原生目录 (/test) |
挂载盘 (/mnt/d) |
性能差距 |
|---|---|---|---|
| 混合随机 | ~16,111 IOPS | ~6,238 IOPS | 慢了 2.5 倍 |
一句话小结: 一上压力,差距又拉开了。原生系统的并发能力很强,性能提得上去。但 /mnt 盘那边,因为延迟高,多线程的优势发挥不出来,直接被按在地上摩擦。
汇总表 & 为啥这么慢?
为了方便看,所有数据整理到一张表里:
| 测试位置 | I/O 模式 (并发) | 关键指标 | 性能结果 | 结论 |
|---|---|---|---|---|
/test (原生) |
顺序写入 (1) | 吞吐量 | ~1467 MiB/s | 满血 |
/mnt/d (WSL) |
顺序写入 (1) | 吞吐量 | ~105 MiB/s | 残血 (掉90%) |
/test (原生) |
顺序读取 (1) | 吞吐量 | ~1282 MiB/s | 满血 |
/mnt/d (WSL) |
顺序读取 (1) | 吞吐量 | ~134 MiB/s | 残血 (掉90%) |
/test (原生) |
4K 随机读 (1) | IOPS | ~4,638 | 满血 |
/mnt/d (WSL) |
4K 随机读 (1) | IOPS | ~3,618 | 小亏 (掉22%) |
/test (原生) |
混合随机 (4) | 总 IOPS | ~16,111 | 满血 |
/mnt/d (WSL) |
混合随机 (4) | 总 IOPS | ~6,238 | 血亏 (掉61%) |
原因其实很简单: WSL 2 是个虚拟机,它有自己的 Linux 内核和 ext4 文件系统。你访问 /mnt/d 时,I/O 请求需要跨越系统边界,通过一个叫 9PFS 的协议层进行“翻译”,把 Linux 的请求转成 Windows 的请求。这个“翻译”过程有巨大的性能开销,特别是延迟很高,直接导致了性能拉胯。
结论和给你的建议
测试做完了,结论就一句话:
想让你的 WSL 快起来,就把代码和项目文件都老老实实地放在 Linux 的主目录 (~ 或者 /home/你的用户名) 下面。别再放 /mnt 了!
特别是跑 Docker、Node.js 项目、编译代码、搞数据库这些对 I/O 敏感的东西,放在原生目录和挂载盘上,完全是两种体验。
别让文件存放位置这个小细节,浪费了你的好电脑和宝贵的时间。
本文来自博客园,作者:donyu006,转载请注明原文链接:https://www.cnblogs.com/lcc6/p/19001698

浙公网安备 33010602011771号