在生产环境中,负载均衡产品如ULB4基于DPDK(Data Plane Development Kit)实现高可用四层负载均衡,其转发能力接近线速,在实际运行中可能会遇到各种问题,特别是与异常报文相关的发包异常现象,本文将详细探讨如何定位和解决这些问题,确保负载均衡产品的稳定运行。
一、问题背景

在12月初,一向稳定的ULB4集群中突然出现了容灾现象,某台ULB4服务器工作异常被自动移出了集群,当时的现象是:转发面服务监控到网卡接收方向流量正常,但是发送方向流量为0,重启转发面服务后又可以正常收发,同时集群其他机器也会不定期出现异常情况,对用户业务而言,会出现少量连接轻微抖动,随后迅速恢复。
二、问题定位与分析
1. GDB调试报文,发现疑点
为了深入理解程序为什么不发包,团队使用GDB工具进行调试,在发包程序逻辑中设置断点,并通过disassemble命令查看函数的执行逻辑,结合对应DPDK版本的源码,单条指令一步步执行,最终发现在i40e_xmit_pkts()函数中,当发送队列满了时会调用i40e_xmit_cleanup()清理队列,此处的问题是驱动程序认为该队列中的报文始终未被网卡发送出去,后续来的报文无法加入队列而被直接丢弃。
2. 一键还原网卡报文
为了验证是否存在异常报文导致队列满的问题,团队开发了一个报文一键导出工具,通过该工具,可以将当前队列里面的所有报文全部导出来,并转换成pcap格式以便进一步分析,多次导出后发现一个规律:每次都会有一个长度为26字节但内容全为0的报文,且其前面都有一个同样长度的正常报文。
3. 流量镜像,确认异常包
为了获取最原始的业务报文,团队配置了端口镜像,将发往ULB4集群的流量镜像到一个空闲服务器上进行抓包,经过多次尝试后,找到了一个IP分片报文,其中第二片只有IP头而没有数据部分,这种异常报文触发了DPDK的BUG,导致驱动程序认为发送队列始终处于队列满的状态。
三、解决方案

1. 修复DPDK BUG
根据上述分析结果,团队定位到了DPDK本身的一个BUG,通过修改相关代码,确保即使遇到异常报文也能正确处理发送队列,避免因队列满而导致的后续报文丢弃问题。
2. 优化报文导出工具
为了提高排查问题的效率,团队进一步优化了报文一键导出工具,该工具可以在异常发生时快速导出所有报文并转换为pcap格式,便于后续分析。
3. 加强流量监控
为了避免类似问题再次发生,团队加强了对ULB4集群的流量监控,通过实时监测发送和接收方向的流量变化,及时发现并处理异常情况。
通过对DPDK负载均衡产品问题的深入分析和解决,我们不仅成功解决了当前的发包异常问题,还积累了宝贵的经验,我们将继续优化和完善我们的负载均衡产品,提升其在复杂环境下的稳定性和可靠性,我们也期待与更多的同行分享我们的经验和成果,共同推动负载均衡技术的发展。
五、FAQs

Q1: 什么是DPDK?
A1: DPDK(Data Plane Development Kit)是一个高性能的数据平面开发套件,用于快速数据包处理应用的开发,它提供了一套API和驱动程序,使开发者能够利用硬件特性进行快速、低延迟的数据包处理。
Q2: ULB4是什么?
A2: ULB4是UCloud自主研发的基于DPDK的高可用四层负载均衡产品,转发能力接近线速,作为用户应用的全局入口,ULB4在大流量多元化场景下保证用户业务的持续稳定至关重要。
Q3: 如何定位DPDK负载均衡产品的发包异常问题?
A3: 定位DPDK负载均衡产品的发包异常问题可以通过以下步骤进行:首先使用GDB工具进行调试;其次开发报文一键导出工具导出异常报文;最后配置流量镜像获取最原始的业务报文进行分析。
小伙伴们,上文介绍了“负载均衡产品dpdk问题的解决”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复