对那些整天喊着“玩大的,玩狠的”口号的人来说,我下面要说的这点事儿,根本就不算事儿。所以,如果你正好喜欢喊口号,就不要往下看了,因为我要讲述的,你可能不感兴趣,也可能看不懂。

今天,是我加入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不通那点事儿的更多相关文章

  1. SecureCRT连接虚拟机失败及虚拟机ping不通外网

    背景: VMware上安装了centos,从学校的网络换到了家里后,用SecureCRT登录时发现 connection closed,然后在虚拟机里发现ping不通外网了,ping虚拟机IP是通的. ...

  2. 虚拟机和主机ping不通,SQL Server无法远程连接的解决方法

    一.虚拟机网络的配置 这里只列一下自己的配置: 1.编辑---虚拟网络编辑器 进行设置 2.设置对应系统 3.还是Ping不通,最后关闭 虚机内的Windows防火墙,可以Ping通,看来Net模式下 ...

  3. 【教程】虚拟机安装CentOS 7 ping不通百度/并且使用Xshell 连接

    最近需要在电脑虚拟机上安装CentOS 7 ,之前对虚拟机并不熟悉,捅咕了两天时间,如果终于安装成功. 之前遇到的坑:安装完CentOS 7 之后一直ping 不通www.baidu.com 网上查询 ...

  4. rhel8/centos8网络网卡设置ping不通,连接不上,各种问题

    [解决问题]: 1-ping不通宿主机 2-ping不通外网 3-ping不通网关 4-网络中心VMnet8 VMnet1 VMnet0 不见了 5-rhel8网络设置全攻略 环境:win10宿主机+ ...

  5. 远程连接阿里云服务器ping不通ip解决方案

    搭建了阿里云服务器,发现本地ping不通,查看半天才发现,原来是在阿里云上的安全组少了些东西.  在出入方向上新建一个安全组,就可以搞定了.

  6. 无法连接linux虚拟机,ping不通

    尝试过多种方式,动态ip静态ip来回改,完了还是不好使,ping不通,请求不到主机. 如果使用桥接模式,当前虚拟机ip设置的和本地ip一样,会导致本地网络断开. 最后的解决方式是在vmware中,点击 ...

  7. cnentos中进行bond网卡配置,一切配置无问题,就是ping不通宿主机

    服务器网口绑定   1. ifcfg-bond0   DEVICE=bond0 ONBOOT=yes IPADDR=192.168.100.64 NETMASK=255.255.255.0   2. ...

  8. 解决内网主机ping不通网关能ping内网

    有一台笔记本电脑可以自动获取IP,可以和内网其他主机互相PING通,就是PING 不通网关,只能上内网,不能上外网,IP换到其他主机上也可以上外网,说明路由器上没什么限制.路由器也查了,电脑也重装了, ...

  9. 开发板ping不通主机和虚拟机的看过来(转载)!

    前几天在做uboot下用tftp下载文件到开发板的实验时,为了能解决开发板ping不通主机和虚拟机的问题,可谓绞尽脑汁,正所谓久病成医,虽然为了这一小问题废了我那么长时间,但我在解决问题的同时也学到了 ...

随机推荐

  1. 8.使用Exists监控ZNode的三大Change事件

    一. zookeeper是一个分布式的协调程序(所有程序都是通过订阅它来相互感知)   1. tcp(长链接) + watcher server ->client client ->ser ...

  2. 遇到了IE10不能登录的问题,很早就有解决方案了

    1..net 2.0 的程序,请打开项目,打开vs开发环境的工具菜单下的  Package Manager Console ,中文名:程序包管理控制台,在打开的控制台中输入如下命令:Install-P ...

  3. 不写代码也能爬虫Web Scraper

    https://www.jianshu.com/p/d0a730464e0c web scraper中文网 http://www.iwebscraper.com/category/%E6%95%99% ...

  4. shell脚本修改文件

    https://blog.csdn.net/qq_37674858/article/details/80066264 2.2 使用sed命令对文件中的字符替换 例如:将aaaa字符串修改为bbbb [ ...

  5. [node.js]express+mongoose+mongodb的开发笔记

    时间过得很快,6月和7月忙的不可开交,糟心的事儿也是不少,杭州大连来回飞,也是呵呵. 希望下个阶段能沉浸下来,接着学自己想学的.记一下上几周用了几天时间写的课设.因为课设的缘故,所以在短时间里了解下e ...

  6. 配置git使用socks5代理

    git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'socks5://1 ...

  7. loadrunner代理录制

    loadrunner在使用过程中会受到浏览器版本的限制,有些web服务在低版本的浏览器上不能兼容,可通过代理录制的方式解决此问题. 注: (1)本文中的ip仅作示例,要按实际测试情况填写ip. (2) ...

  8. ASP.NET MVC 发布后 IE 访问出现布局错乱问题

    ASP.NET MVC 网页debug启动跑一切正常,[Chrome],[FireFox],[Edge],[IE11] 发布后,使用机器名访问,[IE11]出现布局不正常的问题, 在head里:加↓可 ...

  9. [CISCO] 转载:冲突域与广播域(区别、知识要点)

    [CISCO] 转载:冲突域与广播域(区别.知识要点) 1.传统以太网操作(Ethernet Connection Ethernet) 传统共享式以太网的典型代表是总线型以太网.在这种类型的以太网中, ...

  10. 总结day7 ---- 函数的内容 ,初识,返回值,进阶(一)

    内容大纲: 一: 函数识别 二: 函数的结构 三: 函数的返回值, 四: 函数的参数 五: 动态参数 六: 形参的顺序 七: 名称空间 八: 作用域 九: 加载顺序和取值顺序 十: 内置函数 十一: ...