我正在运行基于运行 Debian stable (Buster) 的 Linux 服务器的路由器。它使用 Quagga 将 BGP4 与四个对等方(其中一个发送 IPv4 和 IPv6 的整个 Internet 路由表,其他发送的路由少得多)。
每天大约一到两次,服务器会在大约五分钟内失去 IPv6 连接。
发生这种情况时,服务器似乎无法向 IPv6 地址发送任何数据包。看来这会影响任何地址和接口 - 连接到 Internet 的主要以太网适配器以及连接到内置管理适配器(Lenovo XClarity 控制器)的特殊“Ethernet-over-USB”接口。但是,它可以 ping ::1 以及它自己的任何地址(本地链接和路由地址)。
此外,“ip -6 neigh ls”不显示任何“REACHABLE”,只显示“STALE”或“DELAY”。尽管如此,路由器本身上的 tcpdump 似乎没有显示任何邻居请求数据包出来。当我尝试访问同一 LAN 上的另一台机器时,目标上的 tcpdump 也没有显示收到任何邻居请求数据包。
这种状态持续约五分钟,之后一切恢复正常,无需任何人工干预。
IPv4 连接似乎不受此影响。
我试图通过运行分析工具(ping、vmstat、perf 记录)、保存它们的输出并将它们与时间相关联来对此进行更多分析。到目前为止,我可以说的是:
问题发生时似乎没有过多的网络流量
似乎没有任何类型的 RAM 或 CPU 使用率峰值
Internet 的正常运行会每隔一段时间导致一些增量路由表更改,这些更改由 quagga 执行;它们似乎与中断无关;这种中断也会发生在变化相对较小的时期之后
在任何时候,perf 都将 fib6_walk_continue 显示为最重要的符号之一;通常大约 5% 的开销。但是,几乎就在 IPv6 连接停止时,以下符号出现在顶部:
fib6_walk_continue(大约 30%) native_queued_spin_lock_slowpath(大约 10%) fib6_age(大约 10%)
最初它们似乎都属于“交换器”cmd。大约一分钟后,quagga 注意到它无法再访问对等方并开始删除 IPv6 路由;发生这种情况时,相同的三个符号出现在 perf 输出中,属于斑马。
当正常的 perf 输出返回时(intel_idle …