热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记一次线上DPDKLVS的故障排查

记,一次,线上,dpdk,lv

背景

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

问题

dpvs已经在多个机房上线,运行时间已超过半年,为何突然有业务反馈异常反馈问题的业务多与金融区相关(金融区由于其特殊性,会额外增加安全方面的加固策略)为什么问题表现均为服务hang住

问题排查

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

client <----- > dpvs <----- > rs(金融区) 不正常
client <----- > dpvs <----- > rs(非金融区) 正常
client <----- > lvs <----- > rs(金融区) 正常
client <----- > lvs <----- > rs(非金融区) 正常

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

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

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

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

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

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

记一次线上DPDK-LVS的故障排查

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

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

记一次线上DPDK-LVS的故障排查

这个就是被不断重传的包,能够看到dpvs确实收到了这个包,并且处理逻辑也完全正常,剩下的步骤只有通过网卡做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是这样规定的:

记一次线上DPDK-LVS的故障排查

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

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

记一次线上DPDK-LVS的故障排查

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

记一次线上DPDK-LVS的故障排查

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

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

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

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

记一次线上DPDK-LVS的故障排查

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

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

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

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

问题解决

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

dpvs已经在多个机房上线,运行时间已超过半年,为何突然有业务反馈异常
a:该业务是在某个核心机房上线了dpvs后出现了问题,其他机房很早上线了dpvs但由于其他机房是改业务的备份机房实际并未启用,因此半年多来一直没有发现问题
反馈问题的业务多与金融区相关(金融区由于其特殊性,会额外增加安全方面的加固策略)
a:排查发现是金融区的某一批次机器的fireware存在bug导致,与金融区本身的安全策略无关
为什么问题表现均为服务hang住
a:问题的实质是出现丢包,服务在等待响应,因此表现为hang住

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

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

记一次线上DPDK-LVS的故障排查

数据帧被存储在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;

添加以上代码后测试通过,本次故障解决。

参考资料

https://tools.ietf.org/html/rfc894

http://doc.dpdk.org/guides/prog_guide/mbuf_lib.html

https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/82599-10-gbe-controller-datasheet.pdf


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
author-avatar
黄镇郁皓伟嘉惟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有