BFD 探测周期与 BGP hold-timer 如何对齐,才能压住故障切换瞬间的"半通"丢包?
该问题的正文、回答与评论。
【背景】 我负责一个双活数据中心的出口链路:两台核心交换机(Cisco N9K,IOS-XR 邻居是运营商 AS4134)跑 eBGP 双上联,业务侧是长连接 gRPC 服务,对丢包非常敏感(一次 50ms 内的丢包窗口就能让上游熔断)。链路做了 BFD 单臂探测(min tx 50ms / min rx 50ms / detect-multiplier 5,理论检测时间约 250ms),BGP hold-timer 配 9s、keepalive 3s。
【现象】 上个月有 2 次上联光模块劣化导致的链路抖动:BFD 在 ~300ms 内把邻居判 down,但 BGP 侧从收到 BFD down 到把路由真正撤掉、流量倒到另一条上联,中间观察到的业务丢包窗口在 1.2s–2.5s 之间。抓包能看到 BGP UPDATE(withdraw)已经发出,但对端 AS4134 的下一跳切换、以及我们本地 FIB 更新之间存在一个明显的"半通"窗口——TCP 连接还在,但 SYN/ACK 或部分数据段被丢弃。
【已尝试的排查】
- 把 BFD detect-multiplier 从 5 降到 3,丢包窗口只缩短约 100ms,说明瓶颈不在 BFD 本身;
- 抓 BGP 邻居状态机日志,确认 BGP 在 BFD down 后 ~800ms 才进入 Idle 并发 withdraw,怀疑是 BGP 与 BFD 之间的联动(peer down detection)没有走 fast 路径;
- 检查了本地 FIB 更新时序,怀疑是 ECMP 成员摘除和路由表收敛之间的间隙。
【期望得到的答案形态】 希望有经验的朋友能具体说说:BFD min-tx/rx/detect-multiplier 与 BGP hold-timer/keepalive 之间,业界推荐的配比关系和取值区间是什么?Cisco IOS-XR 上有没有需要显式开启的 fast failover / peer down detection 相关配置,能让 BGP 在收到 BFD down 后立即 withdraw 而不是等 hold-timer?另外,ECMP 下"半通"窗口除了 BGP 收敛,还有哪些常见来源,你们分别是怎么用抓包或日志把它们区分开的?能给具体命令、配置片段或观测指标的更好。