Diff 排障为什么有效
网络配置的「正确」很少能凭直觉判断,多数时候是靠与已知正常值一致来定义的。找一台角色相同、版本一致的正常设备做基线,逐项比对地址、路由、解析配置、内核参数、命令输出与抓包特征,差异点自然成为嫌疑点。这个方法特别适合两类场景:曾经正常却突然异常,以及集群里一台坏一台好。
基本信息
| 为什么有效 | 配置正确性靠与正常值一致来定义,差异直接缩小排查范围 |
|---|---|
| 对比维度 | 配置文本、命令输出、抓包特征、性能计数器 |
| 前提 | 基线机与问题机的版本、角色、承载业务尽量一致 |
| 工具 | 标准输出重定向加 diff,或用配置管理系统的期望状态 |
| 结论要求 | 每条差异必须单独验证因果,不能一次性全部改掉 |
典型使用场景
- 集群中单台节点异常:与健康节点逐项对比找出差异
- 变更后功能异常:把变更前后的配置快照做 diff
- 内核参数相关的问题:对比两台机器的网络参数取值
- 抓包特征对比:比较正常连接与异常连接的握手与窗口差异
- 接管陌生环境:先采集基线,后续问题都有参照
配置与状态对比(Linux)
配置与状态对比(Linux)
ssh good-host 'ip -br a; ip route; cat /etc/resolv.conf' > /tmp/baseline.txt
ip -br a; ip route; cat /etc/resolv.conf > /tmp/current.txt
diff -u /tmp/baseline.txt /tmp/current.txt
# 连接与监听状态对比:
ss -lnt > /tmp/listen.current; ssh good-host 'ss -lnt' > /tmp/listen.good
diff -u /tmp/listen.good /tmp/listen.current内核网络参数对比
内核网络参数对比
sysctl -a 2>/dev/null | grep -E 'net.ipv4|net.core' | sort > /tmp/sysctl.current
ssh good-host "sysctl -a 2>/dev/null | grep -E 'net.ipv4|net.core' | sort" > /tmp/sysctl.good
diff -u /tmp/sysctl.good /tmp/sysctl.current
ethtool -k eth0 > /tmp/offload.current; ethtool eth0 | head -5 >> /tmp/offload.current # 链路与卸载差异对比维度与产出
| 维度 | 采集方式 | 典型差异点 |
|---|---|---|
| 地址与路由 | ip -br a 与 ip route | 缺默认路由、掩码不同 |
| 解析配置 | resolv.conf 与 resolved 状态 | 指向不同 DNS 或搜索域缺失 |
| 监听与连接 | ss -lnt 与状态统计 | 服务未监听或队列参数不同 |
| 内核参数 | sysctl 网络相关项 | 队列上限、保活与复用开关 |
| 链路与卸载 | ethtool 与错误计数 | 速率双工差异、卸载开关不同 |
| 抓包特征 | 两端抓包比对 | MTU、TOS 与重传行为差异 |
对比法对「曾经正常、突然异常」和集群里「一台坏一台好」的场景效果最好,因为基线天然具备可比性。
把差异一次性全部改平是危险做法:多个变量同时变化后,既无法确认根因,也无法回滚,建议一次只改一项并立即验证。