我正在操作基于运行 Debian 稳定版 (Buster) 的 Linux 服务器的路由器。它使用 Quagga 将 BGP4 与四个对等体进行通信(其中一个对等体发送整个 IPv4 和 IPv6 互联网路由表,其他对等体发送的路由少得多)。
每天大约有一两次,服务器会丢失 IPv6 连接,持续约五分钟。
发生这种情况时,服务器似乎无法向 IPv6 地址发送任何数据包。这似乎会影响所有地址和接口 - 连接到 Internet 的主以太网适配器以及连接到内置管理适配器(Lenovo XClarity 控制器)的特殊“以太网-over-USB”接口。但是,它可以 ping ::1 以及它自己的任何地址(本地链接和路由地址)。
此外,“ip -6 neigh ls”没有显示任何“REACHABLE”信息,只有“STALE”或“DELAY”。不过,路由器本身的 tcpdump 似乎没有显示任何邻居请求数据包发出。当我尝试访问同一 LAN 上的另一台机器时,目标上的 tcpdump 也没有显示收到任何邻居请求数据包。
此状态持续约五分钟,之后一切都恢复正常,无需任何人工干预。
IPv4 连接似乎不会受到影响。
我尝试通过运行分析工具(ping、vmstat、perf record)、保存其输出并将它们与时间关联起来,对此进行更多分析。以下是我目前能说的:
问题发生时,网络流量似乎没有过多
似乎没有出现任何类型的 RAM 或 CPU 使用率峰值
互联网的正常运行偶尔会导致一些增量路由表更改,这些更改由 quagga 执行;它们似乎与中断无关;此类中断也会在变化相对较小的时期后发生
在任何时间点,perf 都会将 fib6_walk_continue 显示为顶部符号之一;通常开销约为 5%。然而,几乎就在 IPv6 连接停止时,以下符号会到达顶部:
fib6_walk_continue(约 30%)native_queued_spin_lock_slowpath(约 10%)fib6_age(约 10%)
最初它们似乎都属于“swapper”命令。大约一分钟后,quagga 注意到它无法再访问对等点并开始删除 IPv6 路由;当这种情况发生时,perf 输出中会出现相同的三个符号,表示属于 zebra。
当正常的 perf 输出返回时(intel_idle 在顶部),连接性几乎恢复。
以前有人见过这样的事情吗?
软件:Debian Buster 带有最新的软件包,特别是 linux-image-4.19.0-9-amd64 和 quagga-core 以及 quagga-bgpd 1.2.4-3
硬件:联想 SR550,配备 6 核“Intel(R) Xeon(R) Bronze 3104 CPU @ 1.70GHz”和 32 GB RAM
编辑:ServerFault 关闭了这个问题,并附上评论“寻求安装、配置或诊断帮助的问题必须包括期望的最终状态、具体的问题或错误、有关配置和环境的足够信息以便重现它,以及尝试的解决方案。”
我相信“具体的问题或错误,以及关于重现它的配置和环境的足够信息”已经在原始描述中提供了。
“期望的最终状态”是机器不会失去 IPv6 连接。
对于“尝试的解决方案”:目前,我已将 Linux 内核恢复为 Debian 9“Stretch”的版本(linux-image-4.9.0-13-amd64 版本 4.9.228-1),同时将其余软件包保留在 Debian 10“Buster”中的当前版本。
至此,症状已消失。
如果这种情况持续几周,我假设该行为是 Linux 内核错误,出现在 Linux 4.9(来自 Stretch)和 4.19(来自 Buster)之间,看看它是否已在更高版本的内核中修复。