Intel万兆网卡背靠背连接ping不通那点事儿
对那些整天喊着“玩大的,玩狠的”口号的人来说,我下面要说的这点事儿,根本就不算事儿。所以,如果你正好喜欢喊口号,就不要往下看了,因为我要讲述的,你可能不感兴趣,也可能看不懂。
今天,是我加入I公司3个多月以来最有成就感的一天,因为打赢了一个硬仗。1个多月以前,我所在的项目小组给我分配了一个bug, 该bug可简单描述为:两张Intel 82599的万兆网卡,通过光纤背靠背连接后,彼此ping不通。从接受任务到今天,一共持续了33天,其间多次被各种杂事儿各种突发任务所打断,但总的投入时间累计起来也至少有8个工作日。直到今天,我才真正定位了这个bug的root cause(I公司称之为“根因” Orz),真是“山重水复疑无路,蓦然回首,那人却在灯火阑珊处”。 既然玩不了大的,也玩不了狠的,咱就玩点实在的吧。
1. 问题概述
应用结点Ann和存储结点Ben上各有一张Intel 82599万兆网卡(ixgbe), 网卡与网卡之间使用光纤背靠背连接。在Ann和Ben上都给网卡的Interface配置上IPv4地址,彼此无法ping通。
[Ann: Application Node]
eth1 90:e2:ba:85:fc:b8 192.168.53.100/24
eth2 90:e2:ba:85:fc:b9 192.168.54.100/24 [Ben: Storage Node]
eth1 90:e2:ba:a9:58:f0 192.168.53.110/24
eth2 90:e2:ba:a9:58:f1 192.168.54.110/24
注意: 存储结点Ben上神马工具都没有,没有vim, 没有wireshark, 没有tcpdump, 总之,你需要的一切工具都没有。但是,应用结点Ann上什么工具都可以有,只要需要,都可以自由地安装。
2. 定位过程
- 在应用结点Ann上ping -I 192.168.53.100 192.168.53.110; 然后在Ann上使用tcpdump抓包,用wireshark查看,发现arp请求包从Ann发出,但未收到arp响应包; (令人痛苦的是,存储结点Ben上没有tcpdump,只能从应用结点Ann上单方面抓包)
- 在Ann和Ben上手工配置arp记录,再ping, 可以相互ping通,说明网卡,光模块和光纤都没有问题,排除硬件故障;
- 03 检查Ann和Ben上的万兆网卡驱动(ixgbe.ko), 发现Ann上的网卡驱动版本比较低,于是升级Ann的操作系统,与Ben保持一致,再ping, 还是ping不通;
- 检查Ann和Ben上有没有SELinux设置,Ben没有,Ann有;于是关闭Ann上的SELinux设置,再ping, 还是ping不通;
- 检查Ann和Ben上有没有防火墙firewalld, Ben没有,Ann有;于是关闭Ann上的firewall设置并重启,再ping, 还是ping不通;
- 06 检查Ann和Ben上有没有iptables服务,Ben没有,Ann也没有;
- 在Ann上安装dropwatch, 启动一个ping -I 192.168.53.100 192.168.53.110; 然后启动dropwatch, 发现有丢包,而且是与arp错误密切相关,但是丢包原因不清楚;
- 坐下来研读ARP协议(RFC826) (耗时1个周末);
- 使用arping从Ben上向Ann发出arping, 成功;再使用arping从Ann上向Ben发出arping, 失败;好了,于是可以90%确定为是存储结点Ben的问题;
- 在存储结点Ben上查看arptables服务,发现正在运行,再使用arptables -L查看规则,发现了4条DROP的规则,与Ben上的82599网卡对应的网络接口正好对应,于是99%确定为存储结点Ben的问题;
- 在存储结点Ben上搜索源代码,找到root cause,原来是存储软件在启动的时候,发现82599网卡对应的网络接口(eth1, eth2)并没有配置IPv4地址,于是设置ARP规则将eth1, eth2的inbound和outbound的ARP包都通通drop掉,因此,从应用结点Ann上发出arp请求广播包,没有收到arp响应包就很好理解了 -- Ann发出去的arp请求包之所以石沉大海,是因为被Ben设置的ARP规则给drop掉了。
说明:
- 其实离root cause很近了,但是当时不知道使用arping进行错误定位, 所以与成功擦肩而过;
- 02 排除了可能存在的硬件故障问题,为完全转向查找软件问题给出了理论依据;
- 03-06 其实是病急乱投医,属于神农尝百草的做法,对最后成功定位帮助不大;
- 07 将注意力重新吸引到定位可能存在的ARP问题,本质上是回归到, 功不可没;
- 所谓“磨刀不误砍柴工”,让我坚定了在时候所做的猜测,一定是ARP问题。相对于实践,理论基础更重要;
- “差异化”是找出问题所在的关键,100次没有差异的ping操作抵不过1次有差异的arping操作, 成功就在眼前;
- 10 进一步求证,找出ARP包被DROP的证据,到达成功的彼岸只有一步之遥,但很多时候,这一步很难跨越;
- 没有代码证据,所有的猜测只是猜测而已,“Read The F*cking Source Code”才是王道。
3. 总结陈词
对于枯燥乏味的bugfix来说,最艰难的部分就是错误定位。那些只会搞硬件不会搞软件擅长于喊口号拉标语的人,永远也无法体会其中的艰辛和快乐。这就好比踢足球,进球是最让人振奋的事情,但在进球之前,大多是冗长艰难的奔跑和拼抢。成功定位上面所述问题的root cause,对我来说意义重大(满满的成就感),因为完全是从零开始摸索,在黑暗中前行,没有任何既有的经验可用。这需要坚韧不拔,需要百折不挠,非智力因素才是到达成功彼岸的关键。 当然,能找到最后的root cause, 也离不开同事和朋友的帮助与点化,在此对Zrf, Lmx, Yyg三位老师和Wjq兄弟表示由衷的感谢!
后记: 找到bug的root cause后,最后的解决方案异常简单,一行代码都没有改,因为不用做任何修改。原因是通过GUI管理界面,给存储结点Ben上的82599网卡的网络接口配置上IPv4地址后,存储软件系统会自动修改arptables里的ARP规则,而且修改后的ARP规则正是我们所期望的。那么问题就来了,当初这个bug是怎么报出来滴?遗憾的是,bug filer并没有把具体的重现步骤记录在案,那就没有办法回溯了。因此,对测试工程师来说,不懂具体的技术不要紧,但是把发现bug的具体步骤记录清楚无疑是最重要的基本功。于此同时,对开发工程师来说,拿到一个bug,搞清楚bug的重现步骤则是最关键的,不然很可能是在浪费时间做艰难的长途跋涉。这也给我的职业生涯上了很重要的一课,发人深省,值得好好反思和引以为鉴。
Intel万兆网卡背靠背连接ping不通那点事儿的更多相关文章
- SecureCRT连接虚拟机失败及虚拟机ping不通外网
背景: VMware上安装了centos,从学校的网络换到了家里后,用SecureCRT登录时发现 connection closed,然后在虚拟机里发现ping不通外网了,ping虚拟机IP是通的. ...
- 虚拟机和主机ping不通,SQL Server无法远程连接的解决方法
一.虚拟机网络的配置 这里只列一下自己的配置: 1.编辑---虚拟网络编辑器 进行设置 2.设置对应系统 3.还是Ping不通,最后关闭 虚机内的Windows防火墙,可以Ping通,看来Net模式下 ...
- 【教程】虚拟机安装CentOS 7 ping不通百度/并且使用Xshell 连接
最近需要在电脑虚拟机上安装CentOS 7 ,之前对虚拟机并不熟悉,捅咕了两天时间,如果终于安装成功. 之前遇到的坑:安装完CentOS 7 之后一直ping 不通www.baidu.com 网上查询 ...
- rhel8/centos8网络网卡设置ping不通,连接不上,各种问题
[解决问题]: 1-ping不通宿主机 2-ping不通外网 3-ping不通网关 4-网络中心VMnet8 VMnet1 VMnet0 不见了 5-rhel8网络设置全攻略 环境:win10宿主机+ ...
- 远程连接阿里云服务器ping不通ip解决方案
搭建了阿里云服务器,发现本地ping不通,查看半天才发现,原来是在阿里云上的安全组少了些东西. 在出入方向上新建一个安全组,就可以搞定了.
- 无法连接linux虚拟机,ping不通
尝试过多种方式,动态ip静态ip来回改,完了还是不好使,ping不通,请求不到主机. 如果使用桥接模式,当前虚拟机ip设置的和本地ip一样,会导致本地网络断开. 最后的解决方式是在vmware中,点击 ...
- cnentos中进行bond网卡配置,一切配置无问题,就是ping不通宿主机
服务器网口绑定 1. ifcfg-bond0 DEVICE=bond0 ONBOOT=yes IPADDR=192.168.100.64 NETMASK=255.255.255.0 2. ...
- 解决内网主机ping不通网关能ping内网
有一台笔记本电脑可以自动获取IP,可以和内网其他主机互相PING通,就是PING 不通网关,只能上内网,不能上外网,IP换到其他主机上也可以上外网,说明路由器上没什么限制.路由器也查了,电脑也重装了, ...
- 开发板ping不通主机和虚拟机的看过来(转载)!
前几天在做uboot下用tftp下载文件到开发板的实验时,为了能解决开发板ping不通主机和虚拟机的问题,可谓绞尽脑汁,正所谓久病成医,虽然为了这一小问题废了我那么长时间,但我在解决问题的同时也学到了 ...
随机推荐
- SSO单点登录三种情况的实现方式详解(转载)
单点登录(SSO——Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子系统——百度经验.百度知道.百度文库等 ...
- Android-SQLiteOpenHelper里增删改查
为什么要写一篇,Android-SQLiteOpenHelper里增删改查,的文章呢: 因为之前的方式是:MySQLiteOpenHelper(只负责 生成打开据库/生成打开表/升级表),在其他端:完 ...
- java向数据库插入N条数据
为了测试mysql的索引,要向数据库先插入上万条数据,然后再测试.手动插入太麻烦,写了一段代码. 先上代码: package action; import java.sql.Connection; i ...
- EAS系统环境的搭建
(一)应用服务器配置 1.先建立好程序需要部署的文件夹,如D:\AppServer\,此目录下包含如下几个子目录: XClient(客户端升级程序放置的目录,此目录下应包含Config和Files子目 ...
- 【javascript】点击复制内容的实现
各种站点有很多类似的代码,不过都是拿来即用,连个解释也没有.大概看了一下,现在主要使用的有两种办法: 1.documen.execCommand("Copy")或者window.c ...
- .Net 图片缩略图上传通用方法
日常开发中,经常碰到图片上传的需求,尤其在商城系统开发的时候,商品列表商品图片展示如果使用高清原图,由于高清原图比较大,加载原图时间会大大增加,直接导致系统性能底下,用户体验不好,并发量高的时候直接就 ...
- Ocelot 新手上路
新手上路,老司机请多多包含!Ocelot 在博园里文章特别多,但是按照其中一篇文章教程,如果经验很少或者小白,是没法将程序跑向博主的结果. 因此总结下 参考多篇文章,终于达到预期效果. Oce ...
- Django博客项目思路整理
首先明确一点,我目前学习Django是为了做一个博客,那么以博客为目标进行实践的话,按照Django的MTV模型的顺序来思考的话,要考虑如下几个事情: (Models) 1.在博客里的各种数据模型: ...
- G - 確率(水题)
原文链接 G - 確率 Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Submit S ...
- 【OCP-12c】2019年CUUG OCP 071考试题库(79题)
79.Which statement is true about transactions? A. A set of Data Manipulation Language (DML) statemen ...