ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

虚拟化平台心跳链路带宽饱和的故障排查与优化实践

虚拟化平台心跳链路带宽饱和的故障排查与优化实践 上周帮朋友处理了一台机房虚拟化平台的“怪病”——虚拟机隔三差五漂移集群提示主机隔离业务断断续续查了三天都没头绪。后来我把目光从业务网络挪到一条不起眼的链路上心跳线。问题一下就明朗了这条承载集群心跳检测的链路带宽被一些意料之外的流量占满了虚拟化平台误判主机失联才不断触发迁移和隔离动作。如果你也遇到虚拟化平台“抽风”而业务网看起来一切正常我强烈建议你先别急着重启主机去看看心跳链路的流量。这篇博文我就把这次问题从表象、排查到根治的完整过程拆开讲顺带把心跳机制、带宽测试、网络设备诊断这些核心方法一并梳理清楚希望能帮你少走弯路。1. 问题定性心跳链路被打满虚拟化平台为什么就跟着“发病”先说结论心跳链路在虚拟化平台里承担的是“你还活着吗”的定时问候。一旦这条链路带宽被打满问候报文发不出去也收不回来平台就会认定主机失联进而触发一系列隔离、迁移、重启动作。表面上看起来是虚拟化平台不稳定根子上其实是网络链路出了问题。1.1 心跳链路到底是干什么的它在虚拟化平台里的地位很多刚接触虚拟化的人会有个误区只有交换机、路由器、防火墙这些看得见的设备才算网络设备服务器之间那几根跳线无所谓。但实际上机房网络设备的组成里除了对外提供业务的网络链路还有一条很重要的内部链路就是心跳链路。在虚拟化平台里心跳机制普遍存在。以最常见的VMware vSphere为例集群中的每台ESXi主机会通过管理网络或专门的HA心跳网络周期性地向其他节点发送检测报文。如果你用的是KVM加Pacemaker/Corosync的组合或者是Hyper-V的故障转移集群同样有类似的心跳通信。它的作用简单说就是让每一台主机都知道“我的邻居们还活着集群是完整的”。心跳链路通常复用管理网口或者在物理服务器上单独留一个网口。问题恰恰出在“复用”上——很多机房为了省网口把心跳报文、管理流量、vMotion迁移流量挤在同一条物理链路上。平时流量小看不出来一旦有大流量灌进来心跳报文就会被挤到队尾超时、丢弃都来了。1.2 带宽打满之后集群会做出哪些要命的误判心跳报文本身就是几K字节的小包对延迟和丢包极其敏感。链路带宽一旦接近饱和交换机端口缓存被占满小包被丢弃的概率会大幅上升。而虚拟化平台在几秒内收不到心跳回应就会做出以下误判一个比一个麻烦主机被标记为“网络隔离”。平台认为这台主机已经脱离集群开始准备隔离响应比如关闭虚拟机、重启虚拟机甚至把虚拟机迁移到其他节点。触发HA隔离响应或DRS迁移。如果配置了HA隔离主机上的虚拟机可能会被强制重启如果开了DRS群集管理服务会反复尝试把虚拟机迁走形成“迁移风暴”。集群脑裂或管理服务抖动。双节点集群里如果心跳断开而业务网还通两边都可能认为对方挂了争抢共享资源这是最危险的情况。存储网络误判。有些平台把存储心跳也放在同一条链路上心跳丢了存储路径也可能被标记为故障导致I/O报错。我当时处理的那台环境就是第一和第二种情况轮流上演。集群告警面板每隔十来分钟就冒出一条“主机与隔离地址失去连接”的告警紧接着DRS开始把虚拟机往另一台主机上迁迁到一半又发现目标主机也不稳定干脆把业务卡到半死不活。整个过程持续了大半天机房值班的兄弟差点以为虚拟化软件出了bug。1.3 心跳链路带宽高的常见来源别急着甩锅给虚拟化软件遇到这类问题我建议先别急着查虚拟化平台配置先把心跳链路流量构成搞清楚。根据我这些年踩过的坑带宽被占满的常见来源基本是这几类误把业务流量挂到了心跳口。最常见的一种服务器上有多块网卡新来的虚拟机或备份服务器被指到了“管理口”或“心跳口”所在的虚拟交换机上业务流量直接灌进来。网卡绑定策略不当散列不均。某些物理网卡绑定的负载均衡策略会把大部分流量散列到同一块物理口上看起来是绑定闲置实际上某一条链路已经快被打爆了。虚拟机迁移、快照合并、备份窗口的瞬时流量。这类流量动辄几百MB甚至上GB如果恰好走了心跳链路链路瞬间就打满。广播风暴、环网故障。机房网络拓扑里如果有环路或者某个交换机端口收到了大量广播报文心跳链路也会被殃及。物理机网卡降速。比如光模块老化、PCIe链路降速网卡实际吞吐严重下降看起来只有几十MB流量实际上对这条链路来说已经是满载了。我在排查时后来发现那条心跳链路的带宽被占满主要是两个原因叠加一是备份服务器把备份流量指到了心跳口所在的交换机端口上二是网卡绑定的散列算法不巧地把一部分业务流量也散到了这条链路上。两边一凑心跳链路直接变成一条繁忙的“主干道”。2. 诊断过程我如何一步步锁定“心跳线带宽高”这个元凶既然怀疑网络链路就得用网络手段来证明不能光靠猜。我当时的排查路径是先从监控日志找时间共性再到物理网络设备上验证链路状态最后用打流和抓包做实锤。整个过程大概花了一个下午。2.1 先别翻配置把监控日志和告警时间线对齐遇到虚拟化平台不稳定我的习惯是先看时间段。打开集群的告警记录把“主机隔离”“心跳丢失”“虚拟机迁移”这些事件按时间列出来再和业务高峰、备份任务、批量任务的时间线对比。如果告警集中在某个固定时间窗口十有八九是定时任务把链路打满了。当时的环境里告警集中在每天凌晨1点到2点恰好是备份任务启动的窗口。但我一开始只看了业务网络以为备份流量不可能走上行链路结果浪费了不少时间。后来把管理网络也纳入监控范围才发现备份任务确实不应该走心跳链路可它偏偏走了。这个环节建议重点看几个指标心跳丢包率、管理网口入向/出向实时速率、交换机端口丢弃计数。告警只是表象流量数据才是线索。2.2 登录网络设备直接看心跳端口的实时流量和丢包监控上看不到细节就要动手登录交换机。我手头这台环境用的是华三的交换机命令跟其他品牌大同小异思路是一样的。这里贴几条我常用的你们根据设备型号变通system-view display interface GigabitEthernet 1/0/1 display counters inbound interface GigabitEthernet 1/0/1 display counters outbound interface GigabitEthernet 1/0/1第一条命令能看到端口当前的速率、双工模式、错包计数、丢包计数第二三条看的是出入口的累计流量统计。我重点关注的是端口入向速率是不是长时间超过端口带宽的70%以上以及CRC错误包、丢弃包是不是在持续增长。跟你分享一个容易忽略的点很多交换机默认看不到最实时的速率需要开流量统计或者用display interface里给出的最近300秒平均速率来判断。我当时看到心跳端口入向速率平均到80多MB/s对于一个只有千兆的端口来说已经占了将近七成带宽加上突发流量打到百分之百是常事。登录网络设备这一步也是排查“办公机房网络设备组成”是否合理的时机。我会顺便看交换机上的VLAN划分、端口类型、端口所属的聚合组确认心跳链路有没有被错误地划进业务VLAN或者某条物理链路被多个VLAN共用。2.3 用 psping / iperf / tcpdump 做实锤验证端口流量高还不等于就是心跳问题得验证心跳报文确实在丢失或超时。我的做法分三步第一步用微软的psping测试管理网口/心跳IP的连通性和丢包。psping比普通ping强的地方在于它可以测试指定TCP端口而且能统计丢包率和往返延时的趋势。命令行大概是psping -t -i 1 心跳IP psping -t -i 1 心跳IP:443如果你还不了解psping这里顺便回答一个高频疑问psping完全可以测带宽和丢包它通过连续发送ICMP或TCP探测包能给出最小/最大/平均延迟和丢包率。对心跳类小报文的链路质量测试非常合适比单纯看端口流量更直观。第二步用iperf打流把链路真实吞吐测出来。当时我在两台服务器之间跑了一下iperf3 -s # 在接收端启动服务 iperf3 -c 心跳IP -t 30 -i 5打出来的结果是链路只能跑到大约650Mbps而端口显示有千兆协商速率说明这条链路连基本的吞吐都不达标要么是光模块问题要么是链路中间有拥塞或错误包。第三步抓包看心跳报文。用tcpdump在主机的心跳口上抓几秒数据包tcpdump -i eth1 host 对端心跳IP -c 100如果看到大量TCP重传、乱序或者心跳报文之间的间隔远大于正常配置那基本就实锤了链路质量不行。我当时抓包发现心跳报文频繁出现超过5秒的间隔正常情况应该是1-2秒一次显然是被拥塞拖垮了。你也可以顺手测一下PCIe带宽或者网卡自检排除宿主机网卡降速、驱动丢包之类的问题不过这个一般等前面的网络侧手段都做完之后再考虑优先级没那么高。2.4 临时切换心跳链路用排除法验证判断证据链完整了但为了万无一失我还是做了一步最直接的验证在维护窗口把集群心跳流量临时切换到另一条空闲的链路上观察告警是否消失。方法很简单在虚拟化平台的管理界面里把心跳网络关联的虚拟交换机从原来那个物理端口组换到另一个空余的物理网口上。切换之后观察30分钟结果非常干净心跳告警全部消失DRS不再蹦迪虚拟机也不再漂移。这一步其实是在用“控制变量法”做最终判断。如果切换链路后问题照旧说明问题可能不在链路带宽而在主机本身。但一旦切换后问题立刻缓解那就可以放心大胆地把处理重心放到链路流量治理和网络规划上了。3. 处理与优化把心跳流量降下来并让它以后不再失控验证完是心跳链路的问题接下来就是处理。处理分三步走先止血再调优最后建立长效机制。3.1 第一步止血把不该走的流量从心跳口剥离处理动作其实不复杂原理就是“把马路上的无关车辆清走”。我当时把备份服务器的备份流量从心跳链路所在的交换机端口上挪走在备份服务器上给虚拟化平台的心跳网单独划了一个存储网络VLAN走独立端口。具体操作上如果你用的是VMware要进vSwitch的“端口组”设置里把业务/备份流量和心跳流量分开。如果你用的KVM或者Hyper-V思路也是一样的创建不同的Linux Bridge或者虚拟交换机绑定不同的物理网卡。这里有个注意事项调整心跳网络绑定关系前一定要确认改动后集群仍然有至少一条管理通道在线。我见过有人手滑把唯一的管理网口直接移除结果主机彻底失联只能跑机房接显示器手动恢复相当尴尬。建议只操作没跑业务的备用物理口或者挨个端口操作改一个确认一个。3.2 网卡绑定与负载均衡策略小报文偏偏被散列坑了把大流量清走之后心跳链路的带宽占用从接近90%降到了不到5%。但事情还没完。我之前提到还有一部分业务流量因为网卡绑定的散列策略不均被摊到了心跳口上这是必须处理的。虚拟化平台里物理网卡绑定通常有几种策略。以VMware为例标准vSwitch里的“基于源虚拟端口的路由”和“基于IP哈希的路由”是最常用的两种。前者按虚拟机端口分配上行链路基本不会出现单链路打满的情况后者是根据源目IP做哈希理论上均衡但遇到少量大流量虚机时很容易把几个大流量会话散列到同一条链路上。我当时那条链路就是用了基于IP哈希的绑定恰好两台大流量虚机的IP哈希结果落在同一个物理口上而那个物理口正是心跳口。后来把绑定策略改成基于源虚拟端口的路由并配合流量控制策略业务流量才没有继续蹭心跳链路。如果你用的是LACP动态链路聚合记得检查交换机侧的负载均衡模式是不是选择了“目的MAC源MAC”或者“L3L4”并确认流量模型是否适合。很多环境下LACP的散列效果并不如预期尤其是在流量会话数量少但单会话流量大的场景里很容易出现链路倾斜。3.3 虚拟化平台侧的心跳参数调优流量治理做完还可以在虚拟化平台侧做一点参数优化让心跳机制本身更“皮实”。不过这里的调优要谨慎参数过于激进反而会掩盖链路问题。在VMware HA里有一个“隔离响应”的设置可以定义当主机被判定为隔离时是“保持电源状态不变”还是“关闭并重启虚拟机”。如果你的业务对抖动容忍度较高建议把该设置改为“保持电源状态不变”至少不会因为一次心跳超时就重启虚拟机。这个调整不是治本但能给前端的流量治理争取时间避免业务被反复重启。另外可以调整隔离地址isolation address的配置把隔离检测从单一IP改成多个探测IP防止因为某个IP不通而误判整台主机隔离。如果网络环境里允许把心跳报文发送间隔稍微调大也能降低链路拥塞时的超时概率。但记住这只是一种“容错”不是让你无视带宽问题。KVM/Pacemaker环境里也有类似参数比如corosync的token超时时间、consensus超时时间默认值在小规模集群里够用但在高负载链路上适当上调能减少误判。这些都需要根据实际网络延迟来定不能照搬网上的数值。3.4 网络设备侧的QoS、风暴控制与监控配合处理到最后我不光改了服务器侧配置还在交换机上做了配套优化算是把隐患从网络侧也堵上了。一个比较有效的措施是为心跳VLAN/端口配置QoS队列把心跳报文的优先级标记为高优先级。做法是在交换机上配置ACL或classifier匹配心跳IP或VLAN的报文设置dscp值为EF或CS6确保即使在链路拥塞时这些报文也能优先被转发。这个配置对生产环境非常友好因为不管未来哪条链路又被误用了心跳报文至少不会最先被丢。另一个措施是配置风暴控制storm-control和流量阈值告警。比如给心跳链路所在端口设置一个入方向广播/组播报文的阈值超过阈值自动丢弃并上报避免广播风暴把链路冲垮。同时利用交换机的sFlow/NetStream功能把流量镜像到监控平台持续观察这条链路的流量模型。如果你还担心广域网或专线链路的带宽问题建议类似思路做好限速和队列调度。带宽资源永远是有限的重点是让重要的小报文始终有一条“快车道”。4. 复盘与长期防护这类问题怎么做到“早发现、防再发”问题处理完我得说这类故障最坑的不是处理而是难发现。平时大家看监控主要盯着业务网口和存储延迟很少有人每天都去看心跳链路的带宽利用率。所以最后一个部分我总结了一份速查表和几条防护建议。4.1 故障排查常见问题速查表问题现象可能原因排查动作心跳频繁超时但主机不隔离心跳链路拥塞但不完全断开超时偶发查看端口丢弃计数抓包看心跳报文间隔只有某一台主机失联其他正常该主机心跳网卡故障或绑定策略异常登录主机检查网卡状态、驱动版本、物理链路隔离和迁移告警每隔一段时间就出现备份任务/批量任务触发流量高峰对齐告警时间线和定时任务窗口迁移风暴持续几分钟才停DRS与HA同时误判反复迁移暂时关闭DRS先切链路恢复稳定重启主机后短暂恢复又复发链路底层存在间歇性错误包/光模块抖动检查CRC错误、光模块收发光功率、更换网线/模块流量不高但延迟一直偏大链路距离远、设备转发瓶颈或端口协商异常检查双工模式是否一致核实跨越设备数排查时我还有一个心得不要只看实时速率一定要看“历史趋势”。很多瞬时打满的情况你看监控大屏是看不到的只有翻历史曲线才能发现规律。有条件的话给心跳链路端口的历史流量图也加到管理员的日常巡检页面上。4.2 网络规划上的几条红线都是我拿生产环境换来的处理完这次故障我给自己定了几条不轻易破例的规则分享给你参考心跳流量必须独立。至少要在逻辑上独立也就是独立VLAN、独立端口组条件允许就物理独立单独一个物理口或一块物理网卡。心跳口上禁止跑任何大流量业务。此条为铁律包括备份、虚拟机迁移、文件拷贝一律不允许。所有绑定链路都要做流量倾斜检查。特别是多网卡绑定聚合后要持续观察每条物理链路的利用率不要只看聚合总量。做容量规划时把管理网和心跳网单独算一份余量。业务网络的扩容不能顺带解决心跳链路的带宽问题心跳链路对带宽需求不大但对低延迟、低丢包要求极高。备份、迁移、快照等重流量任务必须避开业务高峰并限制流量带宽。比如用流量控制脚本或虚拟化平台的迁移带宽限制把瞬时流量压到心跳链路可承受的范围以下。这几条看着简单但实际执行中经常因为“图省事”“只是临时的”而被破坏。等出问题再回头收拾成本高得多。特别是那些规模不大但承载了核心业务的机房宁可多花半个U的网口也要把心跳独立出来别跟我朋友一样为省一个口折腾三天。4.3 监控和告警落地把“心跳带宽”纳入基础设施核心指标最后说一说监控和告警。好的监控配置能让这类问题在发生前就被发现而不是等到虚拟化平台开始报错才去救火。我建议至少覆盖以下几项交换机端口监控通过SNMP采集心跳端口和聚合端口的入出方向速率、错误包、丢弃包阈值建议端口带宽的60%就预警80%就告警。主机心跳状态监控在监控平台如Zabbix或Prometheus里定期执行ping或psping监控心跳IP的往返延迟和丢包率超过阈值直接触发告警。虚拟化平台事件日志监控把虚拟化平台集群中的隔离、迁移、HA事件接入统一告警平台并做好事件关联分析。定期打流验证每隔季度或半年对心跳链路主动做一次带宽和延迟测试确认链路能力没有因为光模块老化、线缆松动而悄悄下降。我个人的体会是与其在故障发生时满世界找原因不如在日常运维里多花十分钟看两眼关键链路。那次处理完我给所有托管机房的交换机都加了SNMP轮询和告警把心跳端口的流量图和虚拟化平台告警绑到同一个大屏上。之后再没出现过类似的“幽灵漂移”。另外如果你平时想练练网络设备配置但又不方便操作生产环境可以找个网络设备模拟器比如HCL这类工具把VLAN、端口聚合、QoS这些配置跑一遍熟悉命令也顺手验证思路比直接在生产设备上试错稳妥得多。最后再分享一个小技巧检修完这类问题后一定记得把交换机和虚拟化平台的关键配置导出备份并在变更记录里写明这条链路是干什么用的、哪些配置是敏感的。下次不论谁接手都不至于一头雾水地踩上同一个坑。
返回列表