环境:win10,vmware workstation
使用 nat, 传大文件宿主机到虚拟机(或反向传),速率 100MB/s 左右,cpu 占用 90 左右。
使用桥接情况类似。
明显桥接下 cpu 也干了网卡的活,想问下大致原理。
有什么办法能减轻 cpu 负载,同时提升速度。
1
pupboss 2021-08-27 12:12:18 +08:00 2
NAT 是在你的本机上再虚拟一个子网,虚拟机之间平级,你的电脑充当路由器
桥接是从你的网卡上虚拟一个新的网卡,虚拟机和你电脑平级,共用家里的路由器 虚拟机传文件负载本身就大,可能跟网卡没关系,等后面大佬回答吧 |
2
noe132 2021-08-27 12:31:35 +08:00 via Android
无论是 nat 还是桥接都有一个虚拟交换机,主机和虚拟机都接在这个虚拟交换机上面。这个交换机是软件实现的,所以包多当然占 cpu 。
|
3
Tink 2021-08-27 12:44:55 +08:00 via Android 1
桥接就是跟你主机一个 IP 段,nat 是主机的下级
|
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 |
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 的支持,所以实质上仅限内网使用。 |
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 。 |
7
wccc 2021-08-27 14:16:13 +08:00
网卡直通 或者 virtio-net window 需要额外驱动
|
8
chenjies 2021-08-27 15:09:51 +08:00
100MB/s 是不是千兆网卡的速度?提升传输速度只有不走网卡,文件共享可以试试。
|
9
newmlp 2021-08-27 16:46:51 +08:00
nat=路由器,桥接=交换机
|
10
haikouwang 2021-08-27 16:59:16 +08:00
hyperv 可以明显降低 cpu 占用,降低很多
|
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 上。 |
14
qiangmin 2021-08-27 19:29:52 +08:00
@littlewey 感觉应该是 PCI Passthrough/SR-IOV + Smart NIC 这种关系,不是或者。
|
15
plko345 OP @haikouwang 谢谢推荐, 使用 hyperv 网络设置有什么注意点吗, 之前用过一次, 虚拟交换机配置挺麻烦的, 体验不太友好, 但性能确实比 vmware workstation 要强大很多
|
16
desdouble 2021-08-27 21:30:32 +08:00 via Android
你确定虚拟机和宿主机这样拷贝文件是通过 nat 或桥的网络传输的?
即使通过网络传输,也不太可能出现网络传输让 cpu 满负荷吧。cpu 满负荷可能是因为虚拟机的磁盘管理机制是文件拆分,自动扩容。大文件需要临时分配更大的磁盘空间,对磁盘的操作和程序本身的读写操作占用了大量 cpu 。同时,如果你物理内存不够大,开虚拟机很容易要用磁盘做虚拟内存,前面大量的磁盘操作还在继续,会让虚拟内存的效率急剧恶化,累及整个操作系统的运行。 |
18
aru 2021-08-27 23:26:41 +08:00
是不是加密传输了?
用 iperf 测试下 |
19
flynaj 2021-08-28 01:46:27 +08:00 via Android
理论上桥接比 nat 更节省资源,不过要看虚拟机软件的实现,vbox 网卡配置成 virt 是非常快的。
|
21
ryd994 2021-08-28 04:16:43 +08:00 via Android
@cassyfar 一般虚拟机的 nat 网络需要做 tcp/udp 的端口分配,而不是简单的 IP 地址翻译,否则就和宿主的通讯冲突了
涉及到 TCP 就需要检查和改写 4 层 header 。不需要提供完整的 TCP 功能,比如重传。但是还是要有基本的 TCP 状态机,否则端口池回收只能靠超时。 routing 是 vswitch 在做 |
22
plko345 OP @desdouble 电脑 40G 内存,虚拟机分配 6G,占用 50 左右,可能和你说的磁盘原因也有关系,我试试完整分配磁盘容量,代替动态的
|
25
barathrum 2021-08-30 12:03:10 +08:00
是用什么软件传输的呢? 90% 的 CPU 很可能是加密解密的操作,纯网络也不是小包的话,不应该消耗这么大。
|
26
haikouwang 2022-03-29 07:15:51 +08:00 via Android
@plko345 没啥需要特别注意到 hyperv 能给你的配置的东西其实也不多
|