虚拟机网卡千兆速度慢,绝大多数情况下不是物理网卡的问题,而是虚拟化层配置、驱动类型和宿主机设置没有协同工作导致的,优化方向应优先锁定在半虚拟化驱动、中断处理和流量调度上。
性能和速度是两个概念,虚拟机里看到网卡显示“千兆”,和实际能跑满千兆,之间隔着好几层软件逻辑,物理网卡只是个搬运工,真正决定速度上限的,是虚拟机用什么驱动去认这张网卡、宿主机用什么策略去分配CPU中断、以及虚拟交换机用哪种方式把数据包递到虚拟机手里,这三层只要有一层拖后腿,千兆就只是一个灯,而不是一个速度。
虚拟机网卡跑不满千兆怎么解决:先分清瓶颈在虚拟层还是物理层
很多人在排查第一步就犯了错,宿主机网卡明明显示1 Gbps,虚拟机里也显示1 Gbps,可实际复制文件只有50 MB/s到80 MB/s,换算下来连800 Mbps都不到,这时候先别急着改虚拟机设置,应该先做一次简单的隔离测试。
在宿主机上直接往局域网里的另一台物理机复制一个大文件,看速度能到多少,如果物理机之间能稳定跑到110 MB/s以上,说明物理链路、交换机、网线都没问题,瓶颈在虚拟化层,如果物理机之间也慢,那得先查物理设备,和虚拟机没关系。
确认瓶颈在虚拟层后,再看虚拟机里网卡的类型,VMware环境下,默认的e1000e网卡模拟的是Intel千兆网卡,兼容性好,但性能很差,因为它在每次I/O操作时都要经过一层完整的设备模拟。
如果用的是VMware,把网卡类型改成VMXNET3,这是半虚拟化驱动,跳过了大量模拟开销,但注意,VMXNET3不是默认选项,装系统时如果选的兼容模式,很多时候用的就是e1000e,改完驱动后需要重装VMware Tools,否则新网卡不会被识别。
检查驱动是否真的生效了
改完网卡类型不算完,重点是确认系统里加载的驱动是不是对应虚拟网卡的,在Linux虚拟机里执行ethtool -i eth0,看driver字段,如果显示vmxnet3,说明驱动正确,如果还是e1000e,那就是改完后系统没切换过来。
Windows虚拟机则在设备管理器里找到网络适配器,右键属性,查看驱动提供商是否为VMware,如果显示的是Intel或Realtek,就需要手动更新驱动,指向VMware Tools安装目录下的驱动文件。
驱动对了,网卡速度依然起不来,下一步就看多队列。
网卡队列数量直接决定并发能力
千兆跑满,单队列理论上够用,但虚报机同时处理大量小文件或高并发连接时,单队列的CPU核会过载,VMware VMXNET3支持多队列,可以在虚拟机设置里调整,每个虚拟CPU核对应一个队列,把队列数调到与虚拟CPU数量一致,通常能解决70%以上的千兆跑不满问题
。
业内专家指出,多队列的收益在大包吞吐场景下尤其明显,小包高并发场景反而要先看CPU调度。
虚拟机网卡速度只有百兆?多半是协商机制在作怪
这个问题比跑不满更普遍,几乎每天都有讨论,虚拟机里明明设置了千兆网卡,系统却识别成100 Mbps,甚至10 Mbps,第一反应是换网线、换交换机,但实际上,问题往往出在对端设备的协商机制上。
虚拟交换机和物理交换机一样,有自协商机制,但虚拟交换机的自协商更死板,如果宿主机物理网卡和交换机协商出来的结果是百兆,那么虚拟机看到的最高速度也就是百兆,宿主机上执行ethtool eth0,如果Speed显示100Mb/s,那物理链路的协商就出了问题。
不过还有另一种情况:宿主机和物理交换机协商出千兆,但虚拟机的网卡依然显示百兆,这个一般在Hyper-V环境里常见,原因是指定了固定的虚拟网卡速度,在Hyper-V管理器里,虚拟交换机属性中有一个“连接类型”带宽限制选项,如果被手动设置了100 Mbps上限,那VM里的网卡永远只能跑百兆,哪怕物理链路是万兆,把带宽限制改为“不受限制”,重启虚拟机再看。
VMware环境里的百兆假象
VMware Workstation里创建一个新虚拟机,默认网卡类型是e1000e,选择网络连接为桥接模式,在虚拟机里看,网络连接状态有时会显示100 Mbps,但宿主机物理网卡明明是千兆。
这是VMware Workstation的兼容性判断问题,它默认让虚拟网卡跟随物理网卡当前协商速率,但有时候物理网卡的电源管理策略会临时把速度降到百兆,去宿主机设备管理器,找到物理网卡,属性里把“节能以太网”关闭,再把“速度和双工”设为“1.0 Gbps 全双工”,强制后虚拟机的协商速度也会跟着变成千兆。
驱动升级有时比换硬件更关键
网上很多人问“虚拟机网卡速度只有百兆正常吗”,这个问题要分场景,如果宿主机物理网卡就是百兆,那虚拟机当然也是百兆,正常,如果物理网卡是千兆,虚拟机却显示百兆,那先看看VMware Tools版本。
老版本VMware Tools的vmxnet3驱动存在一个已知问题在特定Linux内核版本下无法正确识别物理链路速率,会降级为百兆,升级VMware Tools到与虚拟化平台版本匹配的较新版本,问题通常直接消失,这与硬件无关,纯粹是驱动数据库老旧。
网络性能提升要靠宿主机端的CPU中断和流量调度
网卡驱动和类型解决了,速度或许能从50 MB/s提升到100 MB/s,但有时候这还不够,如果虚拟机里跑的是数据库或者Web服务,需要更低的延迟和更高的吞吐,那宿主机必须做更细致的调优。
多队列与RSS的配合逻辑
把虚拟机的CPU核数从2加到4,网卡队列从2加到4,这就是RSS(Receive Side Scaling,接收端缩放)的雏形,RSS的作用是让不同的CPU核分别处理不同的数据流,避免单个核完全占用。
在Linux虚拟机里,可以用ethtool -L eth0 combined 4来调整队列数,如果提示操作失败,说明驱动没有启用多队列支持,需要在宿主机VMX文件中添加ethtool.rss = "TRUE"或vmxnet3.queues = "4"这样的参数(取决于平台版本),然后重启虚拟机。
Windows虚拟机则直接看任务管理器里的CPU占用分布,如果拷贝大文件时,CPU 0占用率冲到99%,其他核心全部闲发慌,那就是RSS没有生效,在网卡属性中找到“接收端缩放”并勾选启用,再做一次大文件拷机,观察CPU负载是否分散。
中断合并:千兆网络下要改的只有一个地方
中断合并(Interrupt Coalescing)是宿主机物理网卡的一个参数,合并级别越高,CPU占用越低,但延迟越大;合并级别越低,CPU占用越高,延迟越低。
虚拟机场景下,延迟会比物理机高,所以这里要留意性能取舍,文件共享和备份业务,保持默认合并设置即可,因为吞吐量优先,但如果是RDP远程桌面或SSH操作,频繁的小包交互会显得卡顿,适当降低合并级别会更实用。
在Linux宿主机上,执行ethtool -C eth0 rx-usecs 8可以把接收合并时间设为8微秒,能明显感觉到交互响应变快,吞吐影响很小,Windows宿主机则看网卡驱动的高级选项卡中“Interrupt Moderation”,设为关闭或低级别,差异会很明显。
巨型帧:不是所有千兆网络都适合开
巨型帧(Jumbo Frame)是提升大文件传输效率的一个手段,把MTU从1500提到9000,对虚拟机来说,开启巨型帧后,宿主机虚拟交换机、物理网卡、物理交换机的MTU必须统一,否则传输会出问题,丢包率反而上升。
在虚拟机里把MTU设为9000前,先确认物理交换机支持并开启了巨型帧,家用路由器多数不支持,这也是为什么行业共识认为:家用环境开巨型帧得不偿失,而数据中心内部网络开巨型帧收益明显,如果物理交换机是企业级,且已经配置了MTU 9000,再在宿主机和虚拟机里ifconfig或更改高级属性同步设置。
链路层面容易忽略的瓶颈:PCIe通道和SR-IOV
宿主机上的物理网卡插在PCIe插槽上,如果插的是X1速率的插槽,带宽上限只有1 GB/s(PCIe 2.0)或2 GB/s(PCIe 3.0),理论上能覆盖千兆,但如果同时有多个虚拟机进行大量I/O,X1插槽就成了瓶颈。
查看物理网卡所在PCIe插槽速率,Windows宿主机打开设备管理器,网卡属性中“链接速度”或“当前链路设置”会显示X1或X4,如果显示X1,考虑把网卡换到X8或X16插槽上,即使是千兆网卡,多个虚拟机并发时也有明显差异。
SR-IOV:绕过虚拟交换机的直接通道
如果虚拟机数量多,而且每台都需要高吞吐,那就要考虑SR-IOV,这个功能允许物理网卡把硬件队列直接分配虚拟机独享,数据包不需要经过虚拟交换机软件转发,直接由网卡硬件处理,延迟大幅降低,吞吐接近物理机水平。
在VMware ESXi中开启SR-IOV需要物理网卡和BIOS同时支持,启用后在虚拟机的网卡类型中会出现“SR-IOV”选项,在Hyper-V中同样需要先给物理网卡创建SR-IOV虚拟交换机。
SR-IOV带来的问题在于它失去了虚拟交换机的部分功能,比如端口镜像、带宽限制、安全策略,为此需要存档网络配置或评估需求,确定是否可以用纯硬件直通换取这些功能,多数虚拟机场景其实不需要SR-IOV,只有当单台虚拟机吞吐需求超过1 Gbps,并且延迟敏感时,才值得去改架构。
千兆速度实测:用正确的工具读数据
优化完成后,用文件复制测试主观感受不可靠,文件缓存、磁盘速度都会掩盖网卡的真实能力,用iperf3做纯网络吞吐测试才准确。
宿主机是Linux,虚拟机也是Linux,在虚拟机里运行iperf3 -s,宿主机上运行iperf3 -c 虚拟机IP -t 60,读取SUM行的Receiver值,千兆网络的理论极限是940 Mbps左右,因为TCP/IP头开销,实际能稳定跑到900 Mbps以上,基本可以宣判优化到位。
如果是Windows环境,可以用NTttcp或LAN Speed Test这类工具,原理相同,但注意关闭防火墙,否则测试流量会被拦截,测试结果会虚低。
测试时要注意不要用VM内部生成流量再回环到VM自身,这个数据没有意义,测试源和目的地必须在不同设备上,要么虚拟机对物理机,要么虚拟机对另一台虚拟机,而且路径必须经过虚拟交换机和物理网卡。
长尾词问答:虚拟机网卡优化
VMware虚拟机里网络只有百兆能改成千兆吗?
先确认宿主机物理网卡连接的是千兆交换机且协商速率是1000 Mbps,然后在VMware Workstation或ESXi里编辑虚拟机设置,把网卡类型改为VMXNET3(如果之前是e1000e),重新安装或更新VMware Tools,之后进入虚拟机系统,禁用再启用网卡,或直接重启,多数情况下能恢复到千兆,若依然百兆,检查物理网卡驱动中的“节能以太网”是否关闭。
虚拟机网卡性能优化 VMware Workstation要改哪些设置?
VMware Workstation环境下,主要优化动作有三个:把网卡类型从e1000e改为VMXNET3;在虚拟机VMX配置文件中添加ethtool.rss = "TRUE"启用多队列;宿主机物理网卡属性中关闭所有电源管理节电选项,对于桥接模式用户,宿主机网卡的中断调优对虚拟机同样有效,相比NAT模式性能差异不大,不做强制要求。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/618897.html





