首页/系统/Linux 内核与性能调优速查/邻居缓存 GC 与 stale 时间
网络栈调优98 条

邻居缓存 GC 与 stale 时间

邻居表(ARP/ND)条目过期后先标记 stale 再回收; 用 ip neigh 与 gc_stale_time 排查地址无法解析与缓存积压。

邻居缓存的过期与回收

邻居表保存同网段地址与链路层地址之间的映射,IPv4 下就是 ARP 表,IPv6 下是 ND 表。条目过期后不会立刻删除,而是先标记为 STALE,之后再依据 gc_stale_time 等参数决定何时由垃圾回收清理。STALE 属于正常的中间状态,表示下次用到时会重新确认,并不代表该地址不可达。

基本信息

查看条目ip neigh show
查看参数sysctl net.ipv4.neigh.default.gc_stale_time
清理条目ip neigh flush dev eth0
命名空间容器场景需进入对应 netns 查看
关联参数net.ipv4.neigh.default.gc_thresh1/2/3 控制邻居表容量水位

典型使用场景

  • 同网段地址解析异常,确认邻居表里是否存在 FAILED 条目
  • 地址迁移后旧条目仍在,流量短暂发往错误主机
  • 邻居表条目持续膨胀,核对容量水位参数是否偏小
  • 容器或虚拟网络排障,确认是否进对了命名空间
  • 更换交换机或网关后清理陈旧条目,加快收敛

查看与清理

查看与清理
ip neigh show | head                        # 查看邻居表条目与状态
ip neigh show dev eth0                      # 只看指定接口上的条目
sysctl net.ipv4.neigh.default.gc_stale_time # 查看 stale 转回收的时间
ip neigh flush dev eth0                     # 需要时清理,之后条目会自动重建

状态含义

状态含义是否异常
REACHABLE近期确认过,可直接使用正常
STALE已过期但未删除,使用时再确认正常中间态
DELAY / PROBE正在确认或探测中短暂出现属正常
FAILED解析无响应需要排查链路与对端
PERMANENT静态配置的条目不会过期

判读顺序

  • 先看有没有 FAILED 条目,它才是真正的问题信号
  • STALE 数量多不等于故障,要结合地址变更时间一起判断
  • 清理前确认是否存在静态配置条目,避免把刻意保留的映射删掉
  • 清理后观察条目能否自动重建,不能重建说明链路层存在问题
看到大量 STALE 不必处理:这是内核节省探测开销的设计,真正用到该条目时会再次确认,只有 FAILED 才说明解析确实没有响应。
邻居表属于网络命名空间,在宿主机上执行 ip neigh show 看不到容器内的条目,排查容器网络时先进入对应的命名空间。

易错点

  • 把 STALE 条目当成故障清空,引起瞬时的广播流量
  • 在容器场景未进入对应 netns,查错位置得出错误结论
  • 地址漂移后不清理陈旧条目,流量继续发往旧主机
  • 容量水位参数偏小而条目持续增长,触发频繁回收影响性能

数据来源与参考

  • man ip-neighbour
  • Linux Documentation/networking/ip-sysctl.txt
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌