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

今天,是我加入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. Oracle索引技术研究

    Oracle索引类型 B树索引 特定类型索引 确定索引列 主键和唯一键值列的索引 外键索引 其他合适的索引列 B树索引 B树索引算法 B树是指B-tree(Balanced Tree),B树的存在是为 ...

  2. 转载:爬虫技术浅析(Python)

    http://drops.wooyun.org/tips/3915 0x00 前言 网络爬虫(Web crawler),是一种“自动化浏览网络”的程序,或者说是一种网络机器人.它们被广泛用于互联网搜索 ...

  3. sweetalert 快速显示两个提示, 第二个显示不出的问题

    今天在使用 sweetalert 做提示框的时候, 有个操作快速做了两次提示, 发现第二次显示不出: sweetAlert({}, function() { $.get('', function() ...

  4. sql server还原到指定时间

    BACKUP LOG yjxy_1010 TO DISK='d:\yixy_log.bak' WITH FORMAT 数据库右击->任务->还原->还原事务日志.

  5. C#Encoding

    1.Encoding (1).如何生成一个Encoding即一种编码 Encoding位于System.Text命名空间下,是一个抽象类,它的派生类如下图: 要实例化一个Encoding一共有以下两种 ...

  6. 4-C#格式处理

    本篇博客对应视频讲解 前言 前几篇文章及对应视频是带大家快速体验了一下C#,了解编程语言最基础的内容及面向对象的概念. 接下来我会进一步演示和说明C#还能做些什么. 实际上,C#就一门语言来讲,除去面 ...

  7. LockBox的安装

    LockBox是一套加密解密库,下载地址:http://sourceforge.net/projects/tplockbox/ 我的安装的操作系统:win7 64位 安装步骤如下: 一,安装: 安装时 ...

  8. [Objective-C语言教程]多态(26)

    多态性这个词表示有许多形式. 通常,当存在类的层次结构并且通过继承相关时,会发生多态性. Objective-C多态表示对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对象的类型. 考虑下 ...

  9. mxonline实战6 , 忘记用户密码时进行重置

        对应github地址:密码重置   原理:  1. 一个需要输入用户邮箱和注册码的密码忘记页面 2. 点击提交后,用户邮箱收到一个邮件,包含重置密码的链接 3. 点击链接进入密码重置页面   ...

  10. 极其简单的用JS在浏览器中创建下载文件的方法

    有这样一个需求,在js中动态创建一个页面,然后下载该页面为word文档,研究了一上午,最后发现实现起来如此简单. 在js中创建如下方法:(直接复制即可) function downloadFile(f ...