昨天我升级系统到 Windows 10 Insider Preview Build 18945,折腾了一天多 WSL2,目前基本可用了,以一个普通用户的角度总结下 WSL 和 WSL2 的区别。

主要从功能性能两个方面简单说下 WSL2 和 WSL 相比的优势和劣势。本来想单独列下易用性,但发现都可以在功能和性能上体现出来。

功能

WSL2 的优势

因为 WSL2 是跑在虚拟机中的完整 Linux,所以功能方面要比 WSL 强大一些。从目前的版本看,至少能做到如下这些 WSL 做不到的事情(并没有全部核实,可能有出入):

  1. 网卡管理、网络抓包、查看网络连接状态、防火墙等较底层的网络相关功能。
  2. 挂载文件(如 ext4 文件、squashfs 文件)和网络资源(如 nfs、ssh)到本地。
  3. tmpfs(在 /run/shm 或者 /dev/shm,/tmp 不是)。
  4. 完整的 cgroups,因此可以运行 Docker 等容器。
  5. 完整的 IPC(WSL 缺失一部分,比如运行不了 fakeroot)。
  6. 可修改内核参数、添加内核模块,以及替换内核。因此可以支持很多更底层的应用。
  7. 因为之上的这些原因,WSL2 可以更好地享受完整 Linux 系统带来的方便,不需要因为 WSL 的功能缺失而使用各种迂回方法。

WSL2 的劣势

功能方面的劣势,主要是和本机系统(即 Windows 宿主机)整合相关的。

  1. 进程不再会显示在任务管理器里,也无法在 WSL2 外操作,包括不再支持本机系统的防火墙规则。
  2. 无法通过 localhost(127.0.0.1)访问本机系统监听的端口(也许以后会支持。目前用 localhost 是可以从本机系统访问 WSL2 的),只能通过其他 IP。
  3. 默认无法从其他机器访问到 WSL2 中监听的端口,需要在本机系统设置端口转发(如 netsh interface portproxy add)。

其中 2 和 3 后续都可能优化,技术上没有难题。

WSL2 的功能缺失,相对于原生的(包括虚拟机中的) Linux

  1. 没有声音、显示系统,和 WSL 一致。但有迂回办法(不包括显卡计算)。
  2. 不能访问本机系统的 USB 设备(但可以访问已经在本机系统挂载的硬盘、U 盘、光盘等)、串口设备(这个 WSL 已经支持,WSL2 之后也会支持)、PCI 设备等等。
  3. 网卡管理相关功能不全,比如不能设置静态 IP、不能桥接、不能访问网卡硬件等等。
  4. 不能运行 systemd(也许有迂回的方法),因此会有不少功能无法使用或者不方便使用。

但 WSL2 的文件系统镜像可以直接使用 Hyper-V 挂载(可以一个镜像两用,不能同时运行),这样功能比 WSL2 要强一些(比如有显示系统、网卡管理、串口设备支持、受限的本机硬盘直通等等),但还是有一些功能缺失。

WSL 2 FAQ 里的相关内容:

Can I access the GPU in WSL 2? Are there plans to increase hardware support?

In initial releases of WSL 2 hardware access support will be limited, e.g: you will be unable to access the GPU, serial or USBs . However, adding better device support is high on our backlog, as this opens many more use cases for developers that wish to interact with these devices. In the meantime, you can always use WSL 1 which has serial port and USB access. Please stay tuned to this blog and WSL team members on Twitter to stay informed about the latest features coming to insider builds and reach out to give us feedback on what devices you’d like to interact with!

性能

性能方面,WSL 和 WSL2 各有优势。如果不和本机系统交互,WSL2 的性能非常不错,但访问本机系统的文件会下降很多。

WSL2 的优势

  1. 进程启动开销大大减少,需要频繁启动进程的场景性能大幅提升。
  2. 本地磁盘(不包括挂载的 /mnt/*)读写性能大幅提升。

WSL2 的劣势

  1. 通过 9p 挂载的本机系统文件(/mnt/)和 WSL 中的 drvfs 相比,读写性能大幅下降,主要体现在读取大量小文件场景(比如文件数上百后,ls -l、file 、head -n1 *、git status/diff/... 等等命令会有明显卡顿,耗时为 WSL 中的几倍甚至十几倍)。但仅仅列文件名(ls 要比 ls -l 快几个数量级)很快。读写大文件的性能也有明显的下降。
  2. 内存占用比 WSL 高很多。基本运行起来后就要占 300M 以上(要看 Vmmem 进程,而不是终端模拟器)。而且读写大量本地系统文件(/mnt/*)后内存会飙升,至少有些情况不会回落,即使其他软件将内存快耗尽了 Vmmem 内存占用也不会下降。
  3. 首次启动比 WSL 慢,但平时不需要退出(wsl --shutdown,可以用它来释放内存),可以认为没影响。

User Experience Changes Between WSL 1 and WSL 2 中有这样一点:

Cross OS file access speed will be slower in initial preview builds

You will notice slower file speeds compared to WSL 1 when accessing Windows files from a Linux application, or accessing Linux files from a Windows application. This is a result of the architectural changes in WSL 2, and is something that the WSL team is actively investigating on how we can improve this experience.

我想 1 后续会有优化。

另外 WSL 2 consumes massive amounts of RAM and doesn't return itbenhillis 提到:

We have a fix for this in the works.

和 Vmmem 的内存占用高以及不回收有关,后续 2 很有可能也有优化。

简单比较下 CPU 性能

用 bc 计算下 PI,运行了多次后选择比较稳定的最后三次:

WSL

% echo "scale=6000; 4*a(1)" | time bc -l
3.14...

bc -l  29.39s user 0.02s system 99% cpu 29.470 total

bc -l  29.28s user 0.00s system 99% cpu 29.399 total

bc -l  29.20s user 0.05s system 99% cpu 29.381 total

WSL2

% echo "scale=6000; 4*a(1)" | time bc -l
3.14...

bc -l  29.61s user 0.00s system 99% cpu 29.615 total

bc -l  29.56s user 0.00s system 99% cpu 29.559 total

bc -l  29.57s user 0.00s system 99% cpu 29.572 total

差别不大,WSL2 稍微慢一点。

总结

总体说功能上变得更强大了,但和本机系统交互的相关功能有所减弱,用起来没有之前方便了。性能上如果不需要和本机系统交互,提升很显著,但如果需要读写本机系统硬盘的文件,性能下降很明显。后续很可能有各种优化,可以继续观望。

v2ex 地址

文章目录