V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
plko345
V2EX  ›  程序员

请教虚拟机网络 nat 和桥接的区别

  •  
  •   plko345 · 2021-08-27 12:07:07 +08:00 via Android · 5312 次点击
    这是一个创建于 1213 天前的主题,其中的信息可能已经有所发展或是发生改变。

    环境:win10,vmware workstation

    使用 nat, 传大文件宿主机到虚拟机(或反向传),速率 100MB/s 左右,cpu 占用 90 左右。

    使用桥接情况类似。

    明显桥接下 cpu 也干了网卡的活,想问下大致原理。

    有什么办法能减轻 cpu 负载,同时提升速度。

    26 条回复    2022-03-29 07:15:51 +08:00
    pupboss
        1
    pupboss  
       2021-08-27 12:12:18 +08:00   ❤️ 2
    NAT 是在你的本机上再虚拟一个子网,虚拟机之间平级,你的电脑充当路由器

    桥接是从你的网卡上虚拟一个新的网卡,虚拟机和你电脑平级,共用家里的路由器

    虚拟机传文件负载本身就大,可能跟网卡没关系,等后面大佬回答吧
    noe132
        2
    noe132  
       2021-08-27 12:31:35 +08:00 via Android
    无论是 nat 还是桥接都有一个虚拟交换机,主机和虚拟机都接在这个虚拟交换机上面。这个交换机是软件实现的,所以包多当然占 cpu 。
    Tink
        3
    Tink  
       2021-08-27 12:44:55 +08:00 via Android   ❤️ 1
    桥接就是跟你主机一个 IP 段,nat 是主机的下级
    littlewey
        4
    littlewey  
       2021-08-27 13:46:24 +08:00   ❤️ 2
    - NAT 时候,Host 里好像有一个家用路由器,WAN 是 Host 的网卡,LAN 插向你的 VM,VMware 搞了一个 L3 设备

    - Bridged 的时候,Host 里好像有一个交换机,Host 的网卡和你 VM 网卡 都插在上边,VMware 搞了一个 L2 设备

    https://superuser.com/questions/227505/what-is-the-difference-between-nat-bridged-host-only-networking
    ryd994
        5
    ryd994  
       2021-08-27 13:55:16 +08:00   ❤️ 17
    nat: 虚拟机之间组成内网,而且使用私有地址,无法直接对外通信。宿主机会提供虚拟 nat 网关的功能,不仅转发包,还提供地址转换服务。NAT 是有状态的,所以开销很大。而且 NAT 工作在 4 层,需要了解每一个 TCP 连接的状态。

    桥接:虚拟机之间组成内网,但使用“公网”地址。因为你家只有路由器有真正的公网 IP (甚至路由器也没有,这也是论坛上讨论关于开公网 IP 的问题),家里的所有机器其实只有内网 IP 。这时,宿主机仍然需要提供私有网关服务,但不需要提供 NAT,所以开销较小。这时只是提供路由器或交换机的功能。工作在 3 层或 2 层。

    然而计算开销较小并不代表性能就会好很多。肯定是更好的。但是实际在网络处理中,难点是对大量的包进行处理,单个包的处理很简单,但包的数量很大,需要迅速处理完。CPU 并不适合这种工作。这种工作适合硬件。所以软路由的性能的极限比起硬件来说低很多。而且加钱买更好的 CPU 也没用。

    硬件加速是网络处理很重要的一部分。非虚拟机的连接,其实大部分工作依赖硬件加速。比如 RSS,TSO,LSO,LRO 。这都不是新技术,几乎所有的网卡都支持。

    虚拟化网络硬件加速则是商业应用的重要课题。宿主机可以直接下放路由功能或者交换机功能给硬件。低端的,硬件可以执行简单的筛选分类,把虚拟机的包放到独立的缓冲队列里。CPU 只需要简单的处理就可以把数据转发给虚拟机。而且可以提供虚拟 RSS 功能,让虚拟机也可以多线程处理网络。
    高级的就是 SRIOV,虚拟机网络数据完全不经过宿主机软件。PCIE 直通给虚拟机。PCIE 直通由主板 /CPU 硬件加速,使用中开销几乎为零。虚拟机直接控制硬件吗,也就可以享受到和非虚拟机一样的硬件加速功能。性能也完全不损失。没有 SRIOV 也能用 PCIE 直通,但是只能物理硬件一一对应,无法在虚拟机之间共享。
    各大云厂商的高性能网络大部分就是 SRIOV 再加上 SoC 或 FPGA 来处理虚拟网络流量。

    如果你的 CPU 有 VT-d,而且有富余的 pcie 槽,那最简单的就是再买一块网卡做直通。组 NAS 时这个方法很常用,直通网卡和 HBA 。不然的话,配置开启 VMQ 其实性能也还行。从你的描述来看你应该已经在用类似的功能了,否则所有的虚拟机负载都会打在一个核上,不会做到 CPU 占用 90%

    如果没有 pcie 直通的条件,但你的目标只是内网性能。那么也可以在全部设备上启用 jumbo frame 。之前说了,网络的难点在于包的数量。LSO LRO 技术实际上就是通过硬件切割组合包,CPU 实际上只看到硬件处理后的大包。jumbo frame 启用之后,线路上传输的就是更大但更少的包。自然也就不用耗费那么多 CPU 资源了。但是问题在于网络上的每一个节点都要有 jumbo frame 的支持,所以实质上仅限内网使用。
    jim9606
        6
    jim9606  
       2021-08-27 14:07:55 +08:00
    100MB/s 相当于 800Mbps,算是个比较高吞吐量的需求了。

    vmware workstation 默认使用的虚拟网络都是纯软件实现,桥接的工作量相对于 NAT 少些依然有。另外虚拟机的网卡也是在 cpu 实现的。

    你可以试试更改 vmx 文件,将虚拟网卡型号由 e1000 改为 vmxnet3,可能可以减少虚拟网卡的开销。

    还不够估计就得换支持 PCI 直通的虚拟机方案和支持 SR-IOV 的网卡了,例如 Hyper-V/VMware ESXi/LinuxKVM 和 Intel I350 。
    wccc
        7
    wccc  
       2021-08-27 14:16:13 +08:00
    网卡直通 或者 virtio-net window 需要额外驱动
    chenjies
        8
    chenjies  
       2021-08-27 15:09:51 +08:00
    100MB/s 是不是千兆网卡的速度?提升传输速度只有不走网卡,文件共享可以试试。
    newmlp
        9
    newmlp  
       2021-08-27 16:46:51 +08:00
    nat=路由器,桥接=交换机
    haikouwang
        10
    haikouwang  
       2021-08-27 16:59:16 +08:00
    hyperv 可以明显降低 cpu 占用,降低很多
    plko345
        11
    plko345  
    OP
       2021-08-27 18:20:18 +08:00 via Android
    @ryd994 谢谢大佬的分享,内容我得消化下
    littlewey
        12
    littlewey  
       2021-08-27 19:12:09 +08:00   ❤️ 1
    网络虚拟化比 PCI Passthrough/SR-IOV / Smart NIC 更轻量级的有高性能的方案是用基于 user space /PMD 的软件交换机。

    在 KVM 虚拟化的情况下通常是 OpenVSwitch + DPDK 。

    在 ESXi/VSphere 的情况下也可以用 VMWare 的等价于 OpenVSwitch 的技术 + DPDK 。

    在 VMware Workstation 这样的场景下就不需要了吧,本身就不是生产服务器级别的虚拟环境,有要求就多一个网卡直通给 VM 另外插线,交换路由都不在 Host OS 上。
    qiangmin
        13
    qiangmin  
       2021-08-27 19:22:28 +08:00
    @ryd994 大佬一下子透漏了云计算的主流技术。
    qiangmin
        14
    qiangmin  
       2021-08-27 19:29:52 +08:00
    @littlewey 感觉应该是 PCI Passthrough/SR-IOV + Smart NIC 这种关系,不是或者。
    plko345
        15
    plko345  
    OP
       2021-08-27 20:59:15 +08:00
    @haikouwang 谢谢推荐, 使用 hyperv 网络设置有什么注意点吗, 之前用过一次, 虚拟交换机配置挺麻烦的, 体验不太友好, 但性能确实比 vmware workstation 要强大很多
    desdouble
        16
    desdouble  
       2021-08-27 21:30:32 +08:00 via Android
    你确定虚拟机和宿主机这样拷贝文件是通过 nat 或桥的网络传输的?

    即使通过网络传输,也不太可能出现网络传输让 cpu 满负荷吧。cpu 满负荷可能是因为虚拟机的磁盘管理机制是文件拆分,自动扩容。大文件需要临时分配更大的磁盘空间,对磁盘的操作和程序本身的读写操作占用了大量 cpu 。同时,如果你物理内存不够大,开虚拟机很容易要用磁盘做虚拟内存,前面大量的磁盘操作还在继续,会让虚拟内存的效率急剧恶化,累及整个操作系统的运行。
    littlewey
        17
    littlewey  
       2021-08-27 22:34:44 +08:00 via iPhone
    @plko345 我们用过非 smart nic 的 SR-IOV 的哈。
    aru
        18
    aru  
       2021-08-27 23:26:41 +08:00
    是不是加密传输了?
    用 iperf 测试下
    flynaj
        19
    flynaj  
       2021-08-28 01:46:27 +08:00 via Android
    理论上桥接比 nat 更节省资源,不过要看虚拟机软件的实现,vbox 网卡配置成 virt 是非常快的。
    cassyfar
        20
    cassyfar  
       2021-08-28 02:24:52 +08:00
    @ryd994 nat 在 osi 3 层因为是修改 packet 的 IP header 。。并不负责 routing
    ryd994
        21
    ryd994  
       2021-08-28 04:16:43 +08:00 via Android
    @cassyfar 一般虚拟机的 nat 网络需要做 tcp/udp 的端口分配,而不是简单的 IP 地址翻译,否则就和宿主的通讯冲突了
    涉及到 TCP 就需要检查和改写 4 层 header 。不需要提供完整的 TCP 功能,比如重传。但是还是要有基本的 TCP 状态机,否则端口池回收只能靠超时。

    routing 是 vswitch 在做
    plko345
        22
    plko345  
    OP
       2021-08-28 08:32:14 +08:00 via Android
    @desdouble 电脑 40G 内存,虚拟机分配 6G,占用 50 左右,可能和你说的磁盘原因也有关系,我试试完整分配磁盘容量,代替动态的
    powerman
        23
    powerman  
       2021-08-28 16:51:25 +08:00
    @plko345 直通一条网卡走硬件虚拟机
    powerman
        24
    powerman  
       2021-08-28 16:51:37 +08:00
    @plko345 直通一条网卡走硬件交换机
    barathrum
        25
    barathrum  
       2021-08-30 12:03:10 +08:00
    是用什么软件传输的呢? 90% 的 CPU 很可能是加密解密的操作,纯网络也不是小包的话,不应该消耗这么大。
    haikouwang
        26
    haikouwang  
       2022-03-29 07:15:51 +08:00 via Android
    @plko345 没啥需要特别注意到 hyperv 能给你的配置的东西其实也不多
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2279 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 16:00 · PVG 00:00 · LAX 08:00 · JFK 11:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.