dpdk-lvs的一次线上故障排查报告

news2024/11/15 10:51:30

背景

我们内部基于 dpdk 自研的高性能负载均衡器 dpdk-lvs 已经在多个机房部署上线,运行正常,但近期有多个金融相关的业务反馈,服务数据包在经过dpdk-lvs转发后,会出现hang住的情况。

问题

1、dpdk-lvs 已经在多个机房上线,运行时间已超过半年,为何突然有业务反馈异常

2、反馈问题的业务多与金融区相关(金融区由于其特殊性,会额外增加安全方面的加固策略)

3、为什么问题表现均为服务hang住

问题排查

首先,我们怀疑与 dpdk-lvs 或与金融的某些安全策略相关,因此我们做了如下测试(后端上跑的均是相同的测试代码,并模拟了服务端逻辑):

1、client < ----- > dpdk-lvs < ----- > rs(金融区) 不正常

2、client < ----- > dpdk-lvs < ----- > rs(非金融区) 正常

3、client < ----- > lvs < ----- > rs(金融区) 正常

4、client < ----- > lvs < ----- > rs(非金融区) 正常

通过1、2组测试能够得出结论:该问题与金融区相关且dpdk-lvs转发正常

通过3、4组测试能够得出结论:该问题与金融区无关且kernel版lvs转发正常

通过1、3组测试能够得出结论:该问题与dpdk-lvs有关,经过dpdk-lvs的请求不正常

通过2、4组测试能够得出结论:该问题与dpdk-lvs/lvs无关,经过dpdk-lvs/lvs的请求均正常

以上 4 组结论两两冲突,无法定位问题是与dpdk-lvs相关还是与金融区相关,排查一度进入僵局,无法定位故障点。

为了进一步排查,我们在 client 和后端 rs 上抓包排查,发现 client 的请求均能够正常到达 rs,而 rs 的大部分数据也能够正常回复给 client,但有固定的几个包总是会被重传且直至超时,以下是抓包截图:

其中 10.128.129.14 是 rs 的 ip,10.115.167.0/24 是 dpdk-lvs的local ip,通过在 rs 上的抓包结果可以清楚的看出 rs 发给 dpdk-lvs 的 length 为 184 的包正确传输,但 length 为 2 的包一直在重传,且直至超时都没有成功,同时在 client 上的抓包显示,client 收到了这个 length 为 2 的包,但是由于 tcp checksum error 被丢掉了,并没有交给上层应用去处理,这样就解释了为什么异常时的表现是hang住,因为某个数据包一直在重传,直至 timeout。

通过上面的分析,我们又产生了疑问:现在的硬件网卡一般都具有csum offload的功能,能够通过网卡硬件帮我们做checksum,难道是网卡的checksum offload功能出现了问题?如果真是网卡硬件的offload功能出现问题,那影响的应该不是某一个特定的数据包,而是所有经过这块网卡的数据包才对,因此我们怀疑是网卡在针对某个特定数据包的计算checksum的时候产生了错误,为了验证这个问题,我们在dpdk-lvs上进行抓包分析,以下是抓包截图:

这个包就是被不断重传的包,能够看到dpdk-lvs确实收到了这个包,并且处理逻辑也完全正常,剩下的步骤只有通过网卡做checksum并把这个数据包转发出去,问题似乎确实是出在了计算checksum这里,我们在分析这个包有什么特点,可以看到,这个包的初始大小=ethernet header length + ip header length + tcp header length + tcp data = 14 + 20 + 20 + 5 = 59,而我们知道,在网络中传输的数据帧最小长度为64字节,除去FCS的4字节(这部分也由网卡自行计算后添加在数据包末尾),最小长度应为60字节,也就是说,到达网卡的数据包如果不够60字节,那么网卡会在动在数据包末尾增加全0的padding来使数据包能够达到60字节,所以这个数据包也是需要网卡硬件来补充1字节的padding来达到最小传输长度。对此rfc894是这样规定的:

因此rs的网卡在数据包长度不足60字节时需要做两件事情:

  • 补充1字节的 padding 达到最小长度 60 字节* 补充的 adding 为全 0

可以看到,在二层头中,确实有个补充的 1 字节的 padding:ec,这个 padding 并没有按rfc894的规定填充成全0,而是填了非 0 值,这样就造成了dpdk-lvs的网卡在计算 tcp checksum 时把这个 padding 误当成了 tcp data 而计算了check sum,因此在 client 接收到这个数据包并根据ip伪头部和tcp头部计算出来的 checksum 与数据包 tcp 头部的 checksum 不一致,因此并没有把这个数据包交给上层应用处理而是直接 drop。

(网卡手册针对 TCP/UDP checksum部分的说明)

至此,问题的原因已经很明显了:部分机器的网卡在做padding时未按照rfc894的规定补充全 0 而是补充了其他值,导致 dpdk-lvs 的网卡在做 checksum offload 时 padding 的数据也参与了 checksum 的计算。

分析正常的 rs 和不正常的rs在网卡硬件上的差别,发现:网卡的硬件型号相同,驱动型号也相同,但不正常的网卡 fireware 与正常的网卡不相同,而fireware我们没有办法自行升级或降级。

整个故障的过程可以大概表示为:

client dpdk-lvs rs

      ---1--- >

                                    < ---2---

      < ---3---

**步骤1:**数据包正常,请求数据

**步骤2:**部分数据包初始长度小于60字节,需要网卡补充padding,网卡先计算checksum填入tcp包头后补充padding至数据包末尾,此时checksum正常,但padding不为全0

步骤3:dpdk-lvs收到步骤2的包进行正常转发逻辑处理后转发至网卡,由网卡计算checksum并转发,但在计算新的checksum时由于padding非全0导致checksum计算错误,client收到后丢弃了这个包

ps:以上是rs的网卡在添加padding时补充的不是全0,另一种场景是client的网卡在添加padding时补充的不是全0,这两种情况都会导致上述问题的出现。

问题解决

至此,我们已经能够解释最开始提出的三个问题:

1、dpdk-lvs已经在多个机房上线,运行时间已超过半年,为何突然有业务反馈异常A:该业务是在某个核心机房上线了dpdk-lvs后出现了问题,其他机房很早上线了dpdk-lvs但由于其他机房是改业务的备份机房实际并未启用,因此半年多来一直没有发现问题

**2、反馈问题的业务多与金融区相关(金融区由于其特殊性,会额外增加安全方面的加固策略)**A:排查发现是金融区的某一批次机器的fireware存在bug导致,与金融区本身的安全策略无关

3、为什么问题表现均为服务hang住A:问题的实质是出现丢包,服务在等待响应,因此表现为hang住

接下来我们将解决该问题:

只要让 dpdk-lvs 在处理数据包时,忽略数据包以前的 padding 部分,而由 dpdk-lvs 的网卡重新去处理padding(由于网卡计算 checksum 是在补充 padding 之前,因此可以保证此时的 checksum 一定是正确的)。由于 dpdk-lvs 是基于 dpdk 开发的,数据包在 dpdk-lvs 中是以 mbuf 的结构保存和处理的,以下是 mbuf 的结构:

数据帧被存储在 headroom 和 tailroom 之间(与skb类似),pkt_len=data_len=整个数据帧的长度,我们要做的就是将 padding 从 data 中去除(放到 tailroom 中去),因此可以在数据包入口处添加以下代码:

int padding_length = mbuf->data_len - (mbuf->l2_len +rte_be_to_cpu_16(ipv4_hdr->total_length));
mbuf->data_len = mbuf->data_len - padding_length;
mbuf->pkt_len = mbuf->data_len;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务搭建篇(五) Redis单机/redis-cluster集群搭建

一. Redis集群简介 redis集群是一个由多个主从节点群组成的分布式服务器群&#xff0c;它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式&#xff0c;这种集群模式没有中心节点&#xff0c;可水平扩…

C语言重点解剖指针和数组要点速记

1.指针指向的是最低字节地址。 2.每一次跑程序&#xff0c;变量的地址都会是随机的&#xff0c;这是一种保护机制。基本上不可以使用地址直接访问变量。 3.以下是一段有意思的代码。 4.在栈上开辟变量&#xff0c;地址由高到低变化&#xff0c;值得注意的是&#xff0c;不是连…

云原生|kubernetes|kube-bench安全检测工具的部署和使用

前言&#xff1a; 安全是一个绕不开的话题&#xff0c;那么&#xff0c;在云原生领域&#xff0c;在kubernetes内更加的需要安全。毕竟没有人愿意自己的项目是千疮百孔&#xff0c;适当的安全可以保证项目或者平台稳定高效的运行。 安全性是一个永远不会消失的问题&#xff0c…

基于springboot+mybatis+mysql+vue软件缺陷管理系统

基于springbootmybatismysqlvue软件缺陷管理系统一、系统介绍二、功能展示1.主页2.个人中心3.缺陷管理4.项目管理5.系统管理6.统计分析三、代码展示四、其它1.其他系统实现2.获取源码一、系统介绍 系统主要功能&#xff1a; 开发人员&#xff1a;主页、个人中心&#xff08;我…

Java记录2:Java的三种注释类型

Java 注释 文章目录Java 注释一、单行注释 //二、多行注释 /*三、文档注释用于注解说明解释程序的文字就是注释&#xff0c;注释提高了代码的阅读性&#xff08;可读性&#xff09;。   注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来&#xff0…

EasyExcel写数字格式数据默认为科学计数法解决方案

问题背景 我们项目有个场景是excel下载&#xff0c;需要将数字类型的数据由字符格式转化为数字格式&#xff0c;但由于数字较长&#xff0c;利用easyExcel写入文件后&#xff0c;数字类型会默认展示为科学计数法。下面我们来看看demo演示。 demo演示 准备以下代码 public c…

2015-2022机器人方向课程教学评价成绩和任务汇总

←机器人工程或机器人方向毕业设计汇总篇→↓2022↑https://zhangrelay.blog.csdn.net/article/details/124856849ROS机器人程序设计课程反思-2022终篇-https://blog.csdn.net/ZhangRelay/article/details/127295957由于系统更新&#xff0c;分为两个部分2015-20182018-2022学生…

2023首场CSDN直播丨顶象邀您共话验证码顶层能力设计

1.12 15:00 验证码技术解析——业务安全大讲堂直播https://live.csdn.net/room/dingxiangtech/gqzj6MEr “我不是机器人”本应是不言自明的事情。但随着黑灰产的出现&#xff0c;诈骗行为和刷票行为呈指数级增长。 为了遏制这种现象&#xff0c;第一代验证码出现了。由此也开…

你需要知道的无代码数据分析工具

Nov. 2022, Vincy当今市场上有无数种的无代码分析工具&#xff0c;允许开发人员和非开发人员使用拖放的方式构建图表和仪表盘。此列表涵盖了 4 种针对不同的用例和行业的无代码数据分析工具。这些工具可以帮助用户节省时间并根据数据做出明智的决策。Footprint AnalyticsFootpr…

burp抓包mumu模拟器

1、生成android系统证书 step1:burp导出der证书 step2:生成pem格式证书 openssl x509 -inform DER -in mybpcert.der -out PortSwiggerCA.pem 生成hash并显示 openssl x509 -inform PEM -subject_hash_old -in PortSwiggerCA.pem|head -1 mv PortSwiggerCA.pem 9a5ba575.0…

mysql 存储过程批量删除重复数据

mysql 存储过程批量删除重复数据 表结构&#xff1a; LOAD DATA INFILE /usr/local/phone_imsi_12 replace INTO TABLE tbl_imsi2number_new FIELDS TERMINATED BY \t ENCLOSED BY (number,imsi); 先用SQL语句来进行去重操作&#xff1a; delete from tbl_imsi2number_new …

115.(leaflet之家)leaflet空间判断-点与矩形的空间关系

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

PCBA方案——红外医用额温枪方案

本方案讲述一款国产8位CMOS单芯片ZHW3548开发的额温枪方案&#xff0c;该CMOS芯片内置8K*16bits一次性可编程OTP ROM&#xff08;只能分为4K和4K两次使用&#xff09;&#xff0c;内置256*8bits数据存储器SRAM&#xff0c;一个带有1路全差分模拟信号输入的24位ADC&#xff0c;低…

【LeetCode每日一题】——258.各位相加

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目进阶】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 258.各位相加 四【题目描述】 给…

React(coderwhy)- 01(介绍及基础)

React的介绍&#xff08;技术角度&#xff09; React是什么&#xff1f;React&#xff1a;用于构建用户界面的 JavaScript 库React的官网文档&#xff1a;https://zh-hans.reactjs.org/React的特点&#xff1a; 声明式编程组件化开发多平台适配Hello React react需要3个依赖&am…

最近蛮多应届生问,刚出来怎么找工作,我实在难以启齿......

前言 不知道什么情况&#xff0c;近几个月&#xff0c;好多兄弟朋友有在问我&#xff0c;关于应届生刚出来找工作的事儿。 可以看到标题&#xff0c; ‘难以启齿’ 这四个字大家应该都很少看到了吧。 因为很多兄弟问这个事情&#xff0c;我决定悄悄地发出来&#xff0c;把 我…

域名批量查询 到期未续费域名查询

域名的批量查询&#xff0c;指用户可以一次性输入多个域名进行查询&#xff0c;这样可以节省很多查询时间&#xff0c;例如你需要查询iis7这个关键词相关的域名在全球的注册情况 你完全可以使用域名批量查询工具。 最近入职了一家SEO公司&#xff0c;接手管理了110多个网站&am…

ARM指令

目录 1.指令格式 2.条件&#xff08;cond字段&#xff09; 3.指令助记符 4.寄存器 1.指令格式 基本格式 <opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>} 一共6部分 其中&#xff0c;<>内的项是必须的&#xff0c;{}内的项是可选的&#…

【整型提升问题】

整型提升是什么&#xff1f; 整型提升的规则整型提升的存在 整型提升&#xff1a; 在计算机中&#xff0c;一个数据的类型如果是char 类型&#xff0c;以整型的形式打印该char类型的值时&#xff0c;会自动转换成整型&#xff0c;叫做整型提升。 整型提升的规则&#xff1a…

LeetCode 力扣 2042. 检查句子中的数字是否递增 areNumbersAscending

大家觉得写还可以&#xff0c;可以点赞、收藏、关注一下吧&#xff01; 也可以到我的个人博客参观一下&#xff0c;估计近几年都会一直更新&#xff01;和我做个朋友吧&#xff01;https://motongxue.cn 文章目录2042. 检查句子中的数字是否递增题目描述示例 1&#xff1a;示例…