V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
goreliu
V2EX  ›  Linux

WSL 和 WSL2 简单对比

  •  
  •   goreliu · 2019-07-30 20:30:30 +08:00 · 40782 次点击
    这是一个创建于 1946 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文地址: http://www.mocihan.ml/archives/267/

    昨天我升级系统到 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、不能桥接、不能访问网卡硬件等等。

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

    性能

    性能方面,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 快几个数量级)或者操作大文件(比如用 dd 读写大文件感觉不到慢)基本没影响。
    2. 内存占用比 WSL 高很多。基本运行起来后就要占 300M 以上(要看 Vmmem 进程,而不是终端模拟器)。而且读写大量本地系统文件(/mnt/*)后内存会飙升,至少有些情况不会回落,即使其他软件将内存快耗尽了 Vmmem 内存占用也不会下降。
    3. 首次启动比 WSL 慢,但平时不需要退出( wsl --shutdown,可以用它来释放内存),可以认为没影响。

    其中 1 也许可以大幅优化,2 之后很可能会优化。

    总结

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

    我会继续更新原文。

    第 1 条附言  ·  2019-07-31 07:31:17 +08:00

    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.

    我想文件系统互访问速度后续会有优化。

    另外这个连接有一些实用内容(比如镜像文件空间不足的处理方法)。

    第 2 条附言  ·  2019-07-31 09:36:27 +08:00

    简单比较下 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 稍微慢一点。

    49 条回复    2021-07-08 23:30:16 +08:00
    hronro
        1
    hronro  
       2019-07-30 20:37:12 +08:00
    貌似楼主只比较了 IO 性能?不知道在密集计算上,二者的性能有何差异
    goreliu
        2
    goreliu  
    OP
       2019-07-30 20:45:52 +08:00
    @hronro 有差异的主要应该是 IO 性能,其他方面,可以参考实体机和虚拟机比较之类的评测。
    undeflife
        3
    undeflife  
       2019-07-30 20:55:58 +08:00   ❤️ 1
    12101111
        4
    12101111  
       2019-07-30 21:00:39 +08:00
    CPU 性能 WSL2 有不到 10%的损失,WSL1 等于原生 Windows 或 Linux 性能.
    WSL1 的 fork()性能很差
    kidlj
        5
    kidlj  
       2019-07-30 21:02:11 +08:00 via iPhone
    有 systemd 吗?好奇。
    goreliu
        6
    goreliu  
    OP
       2019-07-30 21:03:15 +08:00
    @undeflife 我在上文里也提到了。但反过来访问现在还不行。
    Osk
        7
    Osk  
       2019-07-30 21:04:11 +08:00 via Android
    感谢分享,但糟糕,是被劝退的感觉。。。
    之前我开玩笑说 wsl 是用来算 hash 值的,结果这么久用下来,还真差不多。
    wsl2 换成这种架构后,更没用的想法了,幸好 wsl1 不是直接被抛弃。。。

    目前虚拟机用着还不错,如果微软以后允许在 Hyper-V 中通过 9p 直通文件系统给 guest 对于我来说这才是真香。。。
    goreliu
        8
    goreliu  
    OP
       2019-07-30 21:07:22 +08:00
    @kidlj 好像是可以折腾的,比如这个: https://github.com/arkane-systems/genie
    Cooky
        9
    Cooky  
       2019-07-30 21:09:30 +08:00 via Android   ❤️ 1
    自己装个虚拟机得了…
    goreliu
        10
    goreliu  
    OP
       2019-07-30 21:12:06 +08:00
    @Osk 我也有一些失望吧(主要是通过 9p 访问大量小文件太慢了,严重影响体验,感觉应该是优化不到位,而不是技术局限),但总体还可以,我还是迁移过来了,另外留了一个 WSL 实例备用。
    goreliu
        11
    goreliu  
    OP
       2019-07-30 21:13:55 +08:00
    @Cooky 在很多方面还是比虚拟机方便不少的,比如可以直接调用 Windows 进程。它和 WSL 一致的地方我没有写,很多功能都保留了。
    devtiange
        12
    devtiange  
       2019-07-31 01:08:23 +08:00
    感谢楼主的总结! 个人觉得这些劣势都不是什么大问题, WSL/WSL2 的定位应该就是一个本机开发环境, 比虚机更轻量一点. 如今 vscode 都能连进去写代码了, 和本机的文件交换也不是那么重要了.
    anguiao
        13
    anguiao  
       2019-07-31 01:27:39 +08:00 via Android
    对我来说,本来也就是提供一个本地的*NIX 开发测试环境,性能什么的我倒不是特别在意,不要太离谱就行,也不会真的拿它来进行最终的部署。
    无论 WSL 底层用的是什么技术,它和系统的整合程度都是第三方虚拟机无法比拟的。对 WSL 2,个人还是十分期待的。
    最后想问一下楼主,20H1 有没有什么影响使用的 bug ?没有的话有点想尝鲜了。
    alexfu
        14
    alexfu  
       2019-07-31 01:51:46 +08:00   ❤️ 1
    WSL2 和 proxifier 冲突被劝退。。
    ericgui
        15
    ericgui  
       2019-07-31 02:17:58 +08:00
    我最近一直非常关心,怎样从 wsl 升级到 wsl2 ?

    是否可以平滑升级?

    我原先的设置,安装的开发环境,是否还都可以继续用?

    请楼主解惑,谢谢!
    goreliu
        16
    goreliu  
    OP
       2019-07-31 07:03:14 +08:00   ❤️ 1
    @devtiange 如果作为开发环境使用,体验会比之前好一些。
    goreliu
        17
    goreliu  
    OP
       2019-07-31 07:05:28 +08:00
    @anguiao 暂时没发现什么 bug。
    Love4Taylor
        18
    Love4Taylor  
       2019-07-31 07:05:31 +08:00
    WireGuard 会导致 WSL2 无法连接网络, 只能暂时放弃 WSL2 了...
    goreliu
        19
    goreliu  
    OP
       2019-07-31 07:10:11 +08:00   ❤️ 1
    @ericgui 可以平滑升级,环境会完全保留。wsl.exe --set-version <Name> 2 就可以升级了,需要等待几分钟到几十分钟吧。wsl.exe --set-version <Name> 1 可以再降回去。
    goreliu
        20
    goreliu  
    OP
       2019-07-31 07:11:29 +08:00
    @alexfu
    @Love4Taylor

    现在网络相关的问题是多一些,过几个版本再看看吧。
    LokiSharp
        21
    LokiSharp  
       2019-07-31 07:22:10 +08:00 via iPhone   ❤️ 1
    告辞诉还不如直接用 vmware
    ericgui
        22
    ericgui  
       2019-07-31 07:26:39 +08:00
    @goreliu 好的,谢谢大佬
    Qzier
        23
    Qzier  
       2019-07-31 08:20:34 +08:00 via iPhone
    还有个问题,装了 wsl2 后就没法用 vmware 了。
    dk7952638
        24
    dk7952638  
       2019-07-31 08:43:36 +08:00
    WSL2 根本就是一次倒退和妥协
    nullboy
        25
    nullboy  
       2019-07-31 08:44:10 +08:00   ❤️ 1
    这玩意真的有用?
    anguiao
        26
    anguiao  
       2019-07-31 08:44:11 +08:00 via Android
    @Qzier 这个是可以解决的,需要 VMware
    anguiao
        27
    anguiao  
       2019-07-31 08:44:53 +08:00 via Android
    @Qzier 这个是可以解决的,需要 VMware 那边适配。
    sky101001
        28
    sky101001  
       2019-07-31 08:49:37 +08:00
    真希望 wsl 能支持 cuda
    yjfuk
        29
    yjfuk  
       2019-07-31 08:54:18 +08:00
    to run vmware vm:

    bcdedit /set hypervisorlaunchtype off

    Restart

    To run hyper-v vm:

    bcdedit /set hypervisorlaunchtype auto

    Restart
    uleh
        30
    uleh  
       2019-07-31 08:54:20 +08:00
    因为公司统一用麦咖啡,而麦咖啡和 WSL 犯冲,所以一直用的 hyper-v + vagrant,发现也挺好用的
    fcten
        31
    fcten  
       2019-07-31 10:05:56 +08:00
    对于我来说,WSL 满足大部分日常需求了,为了那剩下一小部分需求切换到 WSL2 不值得,有需要的时候开个虚拟机就行了。
    ungrown
        32
    ungrown  
       2019-07-31 10:37:10 +08:00   ❤️ 2
    归根到底,WSL 不是刚需,以我的经验,直接上虚拟机,vbox 就挺好用的,发行版随便选,我现在用个 openwrt-x86 就能满足我的全部需求了,如果有更多需求,上 alpine,再不行直接上 ubuntu-mini。
    虚拟机看似臃肿,实际上跑个小体积的 linux 根本不会对系统产生什么压力,那点负载和占用还不到 windows 的零头。而如此小的代价换来的是近乎实机的应用体验,根本没有 WSL 里面那些莫名其妙的破事。而且我还可以随时快照/复原/迁移。而本地本地网络上的 SSH / VNC 体验流畅无比,还要啥自( W )行( S )车( L )?
    testcaoy7
        33
    testcaoy7  
       2019-07-31 10:39:07 +08:00
    WSL2 会不会和 VMware 等虚拟机发生冲突?
    yinjy
        34
    yinjy  
       2019-07-31 10:41:57 +08:00
    wsl2 是否像 wsl 那样要一直开着一个 wsl 终端才能用吗?
    wly19960911
        35
    wly19960911  
       2019-07-31 10:43:59 +08:00
    @yinjy #34 wsl 早就不用开着终端了. 你更新下系统就可以了
    photon006
        36
    photon006  
       2019-07-31 10:44:16 +08:00   ❤️ 1
    GPU 呢,WSL2 能用宿主机显卡做 machine learning ?
    userdhf
        37
    userdhf  
       2019-07-31 11:01:14 +08:00
    安全问题呢?会不会有被黑的可能,然后通过 wsl 在宿主上各种搞?
    goreliu
        38
    goreliu  
    OP
       2019-07-31 11:08:44 +08:00
    @ungrown 看个人需求吧。
    goreliu
        39
    goreliu  
    OP
       2019-07-31 11:09:32 +08:00
    @photon006 现在不行。
    goreliu
        40
    goreliu  
    OP
       2019-07-31 11:11:26 +08:00
    @userdhf 把 /etc/wsl.conf 里的 automount 和 interop 关掉就和普通虚拟机差不多了,不再能访问宿主机。
    lastone6210
        41
    lastone6210  
       2019-07-31 11:20:12 +08:00
    WSL 和 VSCode 是让我近年来对 MS 好感飙升的玩意, WSL2 预告的时候我还挺期待的, 结果嘛...

    我个人理解 WSL 受欢迎是给了开发者一个从 0 到 1 的解决方案, 不必为了某些 tiny function 而专门开个虚拟机, 而如果真的追求性能, 为什么不直接使用虚拟机甚至实机呢? WSL2 为了性能导致只能和 VMvare 二选一 有些得不偿失
    LengthMin
        42
    LengthMin  
       2019-08-01 11:24:03 +08:00
    wsl2 的 dns 就是 可访问 win 主机 ip:

    cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'

    参见: https://docs.microsoft.com/en-us/windows/wsl/wsl2-ux-changes#accessing-network-applications
    nullizer
        43
    nullizer  
       2019-08-01 18:15:28 +08:00   ❤️ 1
    只要依然魔改 init,那看都不会看一眼。我程序要用 systemd 怎么办?
    cppgohan
        44
    cppgohan  
       2019-11-24 18:34:18 +08:00   ❤️ 1
    proxifier + wsl2 现在还是凉凉
    Bunnyranch
        45
    Bunnyranch  
       2020-05-30 10:06:14 +08:00
    我在 WSL2 下只安装一个 smartDNS 跑起来也要费 300M 内存吗。。。
    gaopinsong
        46
    gaopinsong  
       2020-06-01 19:26:39 +08:00   ❤️ 1
    估计微软也是知道 WSL2 的这个方案还有很大问题。所以没有直接废弃掉 WSL1 。还可以让你自行切换。
    Cu635
        47
    Cu635  
       2020-08-10 20:58:42 +08:00
    还少说了一个:wsl2 对 ipv6 的支持不完整。
    ruanimal
        48
    ruanimal  
       2021-03-29 17:39:54 +08:00
    在 hyper-v 的虚拟机中,能挂载 9p 文件系统吗?
    Elliota
        49
    Elliota  
       2021-07-08 23:30:16 +08:00
    配置弄高一点,搞个虚拟机不香吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5809 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:34 · PVG 11:34 · LAX 19:34 · JFK 22:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.