邻居缓存的过期与回收
邻居表保存同网段地址与链路层地址之间的映射,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 看不到容器内的条目,排查容器网络时先进入对应的命名空间。