首页 / 资讯中心 / 文章详情

ESXi网络直通全景指南:硬件体检、参数配置与故障排查

ESXi网络直通全景指南:硬件体检、参数配置与故障排查 ★ FEATURED ARTICLE
简介面向VMware ESXi虚拟化管理员与运维工程师这份网络直通配置指南围绕PCI Passthrough技术完整说明如何将物理网卡直接映射给虚拟机从而绕开虚拟化层转发获得接近物理机的吞吐与延迟表现。文档从硬件兼容性检查入手讲解如何判断设备是否支持直通并指导在BIOS中开启PCI设备64位寻址随后详细演示在虚拟机中添加PCI设备以及在虚拟机选项中配置hypervisor.cpuid.v0、pciPassthru.use64bitMMIO、pciPassthru.64bitMMIOSizeGB等关键参数并说明了这些参数的作用与设置时机。针对直通可能引发的虚拟化层保护失效、兼容性风险以及生产环境部署注意事项文档也给出了提醒和备份策略建议。资源包内为1个docx文档共343KB内容以步骤分解和参数说明为主结构清晰适合随时查阅。目前已有1945人学习下载可作为网络直通实施、调优和故障排查时的常备参考。1. ESXi的网络直通为什么我们会想把PCIe网卡直接塞给虚拟机ESXi的虚拟交换机再怎么优化数据面也要经过vmkernel和vSwitch的处理路径双向流量拉到万兆以后CPU开销和延迟曲线会变得很难看。网络直通PCI Passthrough把物理网卡直接交给某台虚拟机让客户机驱动直接操作硬件队列性能和物理机几乎一致这是虚拟机跑软路由、DPI、边缘网关时最直接的提速手段。这篇笔记围绕ESXi网络直通的完整落地过程展开硬件支持判定、BIOS里64位寻址与VT-d开关、Web Client添加PCI设备、三个关键参数的写法与取舍最后一章给出一套可复现的验证清单。中间会穿插我在真实服务器上踩到过的状态禁用、虚拟机起不来、客户机网卡消失这三类问题。适合正在做软路由、边缘网关、DPI分析或者对网卡多队列和低延迟有明确要求的虚拟化用户。全程不涉及SR-IOV的高级切分先把手动直通这一条路走通。2. 直通前的硬件体检支持性确认与BIOS里的64位寻址开关2.1 在ESXi里读取设备直通状态网络直通的第一步不在虚拟机界面而是在主机侧确认硬件能力。用vSphere Client登录后选择目标ESXi主机进入“管理 → 硬件 → PCI设备”。页面会列出该主机全部PCI设备每行显示地址、厂商、设备名称、直通状态和驱动持有情况。你要找的是Ethernet Controller这一类比如Intel XL710、E810、Mellanox ConnectX系列或者Broadcom BCM5719/5720。状态字段要会读常见三种。禁用设备支持直通但未加入允许列表。活动已加入允许列表并且已经从vmkernel解绑可以被虚拟机添加。需要重启刚切换直通设备等待主机重启完成解绑。如果设备型号太老、固件旧还会出现“不支持”那说明在当前BIOS和ESXi驱动组合下无法直通没有参数可以绕开。命令行确认比界面更准确SSH到主机执行esxcli hardware pci list | grep -B 4 -A 14 0000:03:00输出里的Vendor、Device、SubDevice三行用于核对网卡具体型号ModuleName字段显示该设备当前被哪个驱动模块持有。继续往下看还有IOMMU Group平台支持分组时才会出现以及PassthruCapable、PassthruActive两个布尔字段。前者为true说明硬件支持直通后者为true表示已经处于直通状态。这两个字段是后面排查问题时最直接的判断依据。提示直通状态下设备不再被ESXi的物理网卡驱动接管主机侧的esxcli network nic list里会少掉这块网卡。看见网卡从列表消失不要慌这是预期行为。2.2 BIOS开启64位寻址Above 4G Decoding不是可选项直通网卡的MMIO BAR空间比较大尤其是双口25G、单口100G这类设备一块卡动辄占用几GB的BAR地址。BIOS默认只把PCIe设备的BAR映射到4GB以下高地址窗口如果没打开设备在客户机里会枚举失败表现为虚拟机开机卡在PCI初始化或者客户机lspci里根本没有这块卡。BIOS里的开关名词因厂商而异常见叫法如下平台选项名备注Intel / AMIAbove 4G Decoding最常见的叫法开启后允许BAR映射到4GB以上DellMemory Mapped I/O above 4GB部分机型叫MMIO Above 4GHPEAbove 4G MMIO BIOS allocation可同时调整预留大小超微Above 4G Decoding建议同时把4G Limit Restriction设为Disabled这个开关必须在安装ESXi之前或直通之前就在BIOS里确认。开启后进入ESXi用下面的命令核对设备BAR地址是否落在高位esxcli hardware pci list | grep -A 14 0000:03:00 | grep -i -E BAR|Address如果BAR起始地址在0x80000000以下说明设备仍被压在32位窗口里Above 4G Decoding没有真正生效。如果BAR地址明显高于0x80000000说明64位寻址已经工作。这里有个容易误判的点开启Above 4G之后不需要重启ESXi但需要重启一次主机让BIOS重新枚举PCI总线。2.3 “设备支持直通但状态禁用”不是异常是默认ESXi默认不会把所有支持直通的设备都加入允许列表这是出于驱动稳定和安全的考虑。禁用状态在表格里其实是常态。要让设备可以被虚拟机使用需要显式切换选中设备点“切换直通”此时状态变为“需要重启”重启主机后变成“活动”。这一步有个翻车点如果你直通的网卡正好是管理网络上行链路重启后管理网络将失去这块网卡vSphere Client直接断连。所以点“切换直通”之前先去“网络 → 虚拟交换机”里查看管理网络vmk0的上行链路绑定的是哪个网卡确认不是目标设备。如果设备切换后状态一直停留在“需要重启”说明直通请求没有被正常接收。常见做法是检查BIOS里的VT-d / AMD-Vi是否开启。注意VT-dDirected I/O和CPU虚拟化VT-x是两个开关很多主板默认只开VT-x不开VT-d。VT-d没开PCI直通所需的IOMMU映射表就不存在ESXi在设备直通之前会静默失败。注意服务器定制BIOS里VT-d选项可能叫Intel Virtualization Technology for Directed I/OAMD平台叫IOMMU或AMD-Vi。出现“需要重启”长时间无法推进时优先查这个开关。VT-d管IOMMU映射Above 4G Decoding管BAR地址高位窗口两者是独立项缺一个直通配置都会卡在半路。3. 给虚拟机挂载PCI设备冷添加步骤与设备选择细节3.1 Web Client冷添加PCI设备的完整路径直通设备只能冷添加虚拟机必须处于关机状态这一点没有例外。路径是vSphere Client选中虚拟机 → 右键“编辑设置” → “添加其它设备” → “PCI设备”。下拉列表里会出现当前主机所有直通状态为活动的设备按总线地址过滤选择目标网卡例如0000:03:00.0点击“添加”后保存。保存后建议打开虚拟机的.vmx文件确认一下写入结果。在ESXi的shell里执行grep -i pciPassthru /vmfs/volumes/datastore1/你的虚拟机目录/你的虚拟机.vmx正常会看到一行类似pciPassthru0.system TRUE和pciPassthru0.id 03:00.0的记录。.vmx里没有这两行说明设备没有被真正挂上回头检查主机的直通状态。这里有两个隐蔽问题。第一个是虚拟机硬件版本过低的老版本虚拟PCIe桥枚举顺序可能不对冷添加能成功但开机报No function错误建议硬件版本不低于15。第二个是功能号选择一块四口网卡会显示为0000:03:00.0到0000:03:00.3四个功能号每个功能都是独立设备。如果你只需要单口吞吐只添加一个功能号不要四个全加进去否则客户机驱动会尝试做多PF绑定队列分配会互相干扰。3.2 开机后怎么确认设备被正确认领保存配置后启动虚拟机。在客户机Linux里执行lspci -nnk | grep -i -A 3 ethernet正常输出会显示目标网卡型号Kernel driver in use字段指向原生驱动比如ixgbe、i40e、mlx5_core。如果字段显示Kernel modules: ixgbe但in use为空说明设备还没有绑定驱动继续执行dmesg | grep -i pci 0000:03:00.0日志里出现probe失败信息多数是因为驱动模块没加载手动modprobe ixgbe试一次。手动加载成功问题多半出在initramfs里没把驱动打进去或者udev规则有冲突。加载不成功就检查设备是否被其他虚拟机先占用了。客户机里的队列数也要看一眼ethtool -l eth0直通模式下队列数量应该和物理机一致比如Intel X710四队列驱动模式下能看到Combined至少4到8。如果队列数只有1说明驱动没有正确识别设备的多队列能力通常和驱动版本过旧有关优先升级客户机内网卡驱动。3.3 直通与SR-IOV的互斥以及快照和vMotion的限制如果你之前在同一块网卡上开过SR-IOV直通配置会撞车。ESXi同一时间只允许设备处于物理直通或SR-IOV驱动两者之一。直通活动状态下的PF设备无法再创建VF反过来已启用SR-IOV的物理网卡在直通列表里往往不出现或者在切换直通时报错。要保留SR-IOV又需要直通只能把两种用途分配到不同物理端口或者先关掉SR-IOV重启主机再切换直通。两个动作不能同时存在。另一个常被忽略的限制是直通设备绑定物理主机。开了直通的虚拟机不能vMotion到另一台宿主机因为直通设备和物理PCIe槽位强绑定。快照也建议关掉直通模式下快照恢复时IOMMU映射重建经常失败。这些限制不是配置错误而是架构本身就有的提前知道可以省去后面排障的时间。4. 直通参数配置hypervisor.cpuid.v0与64位MMIO的取舍4.1 hypervisor.cpuid.v0FALSE它管的是驱动认不认虚拟化这个参数在显卡直通场景里很常见网卡直通里它同样有意义但作用面不同。参数值是FALSE时客户机内CPUID指令不再暴露hypervisor位等于告诉客户机里的驱动这里不是虚拟机是物理机。网卡直通场景下这个参数解决的是驱动对虚拟化环境的检测问题。哪些场景必须加第一种网卡驱动检测到虚拟化环境后主动关闭硬件卸载特性比如TSO、GRO、多队列。第二种厂商固件工具在虚拟化环境下拒绝执行配置改写操作。第三种某些安全类中间层驱动在虚拟机里拦截DMA分配导致驱动初始化失败。添加路径是虚拟机选项 → 高级 → 编辑配置 → 添加参数。键写hypervisor.cpuid.v0值写FALSE注意必须大写。hypervisor.cpuid.v0 FALSE值一定要加引号旧版本Web Client里裸写FALSE不一定会被正确识别为字符串。添加后保存并重启虚拟机。提示Intel ixgbeX520/540/550和i40eXL710/X722驱动通常不检查hypervisor位不加这个参数直通也能正常跑。什么时候需要加取决于你的网卡驱动源码里有没有虚拟机检测逻辑这个只能实测。我的一般做法是先不加参数直通开机观察吞吐和队列数量数据不对劲再关掉hypervisor位对比一次。4.2 64位MMIO参数BAR空间预留的含义与大小选择第二个和第三个参数要配套使用pciPassthru.use64bitMMIO TRUE pciPassthru.64bitMMIOSizeGB 64use64bitMMIO为TRUE表示允许直通设备把MMIO BAR预留在4GB以上的地址空间。64bitMMIOSizeGB数值是预留窗口的大小单位是GB。直通设备的MSI-X table、doorbell register、DMA缓冲区都要占用BAR空间设备越新、速率越高BAR空间需求越大。不给足窗口客户机开机时地址解算就会失败或者设备枚举后中断无法投递。那个“64”不是固定答案。它的合适值取决于你直通设备的BAR大小以及同一虚拟机里挂了几块直通卡。经验参考如下场景建议值原因单口1G/10G网卡1610G时代网卡BAR空间普遍在16GB以内双口25G / 单口100G64高密度网卡BAR大预留64GB后续加卡不用改多GPU 多网卡混合直通128GPU BAR空间占用大128GB更稳妥设置步骤同样在“虚拟机选项 → 高级 → 编辑配置”里两个参数都按字符串类型加入保存后重启生效。64bitMMIOSizeGB不要写成小于设备BAR实际需求的数值否则ESXi开机加载虚拟机时会警告PCI资源不足。这里顺便解决一个玄学问题为什么我按文档设置了64GB但客户机里看到的网卡BAR还是不高因为BAR的实际映射地址由vmkernel在启动虚拟机时分配客户机里用lspci -v看到的BAR地址不一定正好落在64GB窗口它落在哪取决于已经启动的其他虚拟机占用了多少高位空间。只要use64bitMMIO为TRUE且64bitMMIOSizeGB足够大映射就会落在4GB以上不需要纠结具体数值。4.3 参数写入的格式细节引号、大小写与顺序编辑配置对话框里参数是按字母顺序展示还是按添加顺序展示不同版本的vSphere Client表现不一样这个不用纠结。真正影响生效的是值格式。三个参数统一用字符串格式hypervisor.cpuid.v0 FALSE pciPassthru.use64bitMMIO TRUE pciPassthru.64bitMMIOSizeGB 64TRUE和FALSE必须大写小写true在部分版本里会被解析成无效值。64同样要加引号裸写数字在个别版本里会被当成布尔量处理结果是MMIO窗口创建失败虚拟机直接无法开机。还有一个容易漏掉的点修改这几个参数前先检查.vmx里有没有残留的旧值。虚拟机之前如果做过直通后又移除.vmx里可能还会存有pciPassthru0相关的旧配置。新旧参数叠加后会被虚拟机开机时一起解析出现参数“覆盖失效”的怪问题。稳妥做法是先移除旧PCI设备保存一次再重新添加并写入参数。5. 直通常见问题排查禁用状态、开不了机和网卡消失这一章把我在实机环境里踩过、以及帮别人排过的坑按“现象 → 原因 → 解决”三要素列出来每一条都值得在动手前对照。5.1 设备状态一直“禁用”切换直通按钮点了没反应现象主机管理 → 硬件 → PCI设备里网卡直通状态持续显示“禁用”点击“切换直通”后没有任何变化也不报错。原因ESXi检查到该设备当前被vmkernel驱动持有而且这块网卡正被管理网络或某个虚拟交换机使用。切换直通请求会被静默拒绝。另一种原因是vCenter版本偏老对较新设备ID的处理逻辑不完整。解决先确认目标网卡没有正被管理网络占用。SSH执行esxcli network nic list看Driver和Link Status列。如果网卡处于活动状态把管理网络迁移到其他上行链路后执行esxcli network nic unload -n vmnic2卸载驱动后再回到Web Client点“切换直通”。如果仍然是禁用检查设备ID是否在vCenter兼容列表内。不在的话只能升级vCenter或者直接改ESXi的passthru.map后者属于深度操作不建议在生产环境尝试。5.2 直通后虚拟机无法开机报断言失败现象虚拟机电源操作报Failed to power on: Assertion failed事件详情里提示某个PCI设备地址没被识别。原因多数情况下是.vmx里残留的直通配置和当前物理设备总线地址对不上。比如物理网卡从0000:03:00.0换到0000:05:00.0但虚拟机的旧配置还指向03:00.0vmkernel开机时找不到对应设备。解决确认物理设备当前地址esxcli hardware pci list | grep -i Intel.*Ethernet | grep 0000:然后在虚拟机“编辑设置 → PCI设备”里移除旧设备重新从列表选择当前地址对应的设备保存再开机。如果移除后.vmx里仍有pciPassthru0相关行需要直接编辑VMX文件删除残留配置。5.3 直通网卡的虚拟机开机后客户机里看不到设备现象虚拟机电源正常客户机系统能起来但lspci输出里找不到直通网卡。原因设备被添加到了虚拟机的PCIe总线高位域客户机OS没有正确枚举到对应PCIe桥。常见于虚拟机硬件版本过旧或者.vmx里的内存预留策略挤占了MMIO窗口。解决先把虚拟机硬件升级到v15以上。然后核对第4章里的pciPassthru.use64bitMMIO和pciPassthru.64bitMMIOSizeGB两个参数是否已经写入。如果还在虚拟机配置里见过“内存热添加”关闭它保存重启一次再重新开启。内存热添加会改变客户机内PCI枚举顺序和直通设备经常打架。5.4 多队列都在但吞吐上不去重传率高现象iperf3测速只有线速三分之一netstat -s里重传率高得异常CPU占用看着不高。原因直通模式下多队列已经创建但每个队列的中断全落在一个vCPU上。直通设备的中断一样走虚拟中断控制器vCPU亲和性不对时中断热点会集中在某一个逻辑处理器上吞吐自然上不去。另一个常见原因是直通网卡所在PCIe插槽和虚拟机vCPU不在同一个NUMA节点跨节点访问内存万兆场景下性能损失非常大。解决先看主机侧网卡所在NUMA节点esxcli hardware pci list | grep -A 20 0000:03:00 | grep -i numa然后在虚拟机属性里把CPU和内存调度都绑定到该NUMA节点。客户机内部再看中断分布cat /proc/interrupts | grep -i ixgbe如果中断集中在单个CPU用irqbalance --banirq把对应中断号排除出去或者写/proc/irq/中断号/smp_affinity手工分散。5.5 主机关机或重启卡在PCI设备初始化现象主机重启后黑屏进度条卡住不动BIOS菜单都进不去。原因上面第2节强调过Above 4G Decoding要开这里还有一个隐藏点。某些服务器主板在PCIe初始化阶段如果检测到某设备BAR空间请求过大且高地址窗口未开启会直接挂起整个PCI枚举流程导致ESXi永远起不来。解决开机进BIOS把Above 4G Decoding打开然后恢复BIOS默认设置重启后再重新配置直通。如果连BIOS都进不去只能清CMOS跳线。清CMOS会丢失BIOS里所有定制项所以生产机器改直通前务必先把BIOS配置导出备份。6. 验证与进阶从iperf3测速到SR-IOV的升级路线配置完成后先做一次基准验证。在直通网卡上配置IP与另一台物理机互通然后跑iperf3iperf3 -c 192.168.10.2 -t 60 -P 8观察双向吞吐是否接近线速同时看客户端CPU占用。再用ethtool -L eth0 combined 8确认队列数量直通场景下队列数应该和物理机一致。还有一步容易被漏掉ethtool -k eth0 | grep -E tx-checksum|tcp-segmentation确认TSO和GRO没有被驱动禁用掉。之后拿同一台虚拟机用VMXNET3虚拟网卡再跑一轮同样的iperf3两组数据放一起对比你就能直观看到直通带来的收益。这里给一个可复现的对比方法固定同一台对端服务器、同一测试时长、同一并行流数只切换网卡类型记录吞吐和CPU占用两组数据。我的一贯做法是开直通前先在本地笔记里写下物理机上的基线数据队列数、TSO状态、最大吞吐直通后逐项核对。数值有出入就回去查不凭感觉判断。如果直通的性能已经达标但你发现多台虚拟机都需要共享同一块万兆网卡下一步就该看SR-IOV。SR-IOV可以在物理PF下切出多个VF每个VF单独直通给不同虚拟机保留硬件级队列隔离而且宿主机保留PF的管理能力不会像完整直通那样把整块卡独占。升级路线是这样判断的单机追求极致低延迟用完整PCI直通多虚机隔离需求上来把PF切VF更合理。从那以后我每次在ESXi上给机器配网络直通都强制把这三条过一遍BIOS里Above 4G Decoding确认开启、切换直通前确认网卡不持有管理网络和SR-IOV、虚拟机里三个参数以字符串格式写入并核对引号。这套习惯替我挡过至少三次生产环境的返工希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站