linux内核arp缓存大小由gc_thresh1、gc_thresh2、gc_thresh3三参数协同控制:gc_thresh1为gc启动最小值,gc_thresh2为软上限,gc_thresh3为硬上限;须同步调整三者并按接口或default配置,永久生效需写入sysctl.conf。

Linux 内核 ARP 缓存表大小不是单一参数控制的,而是由三个协同工作的阈值参数共同决定:`gc_thresh1`、`gc_thresh2` 和 `gc_thresh3`。只改其中一个无效,必须同时调整三者才能稳定扩容或缩容。
三个关键阈值的作用
这三个参数位于 /proc/sys/net/ipv4/neigh/<dev>/</dev> 目录下(如 eth0)或通用模板 default 中,单位均为条目数:
-
gc_thresh1:垃圾回收器启动的最小条目数。低于此值,GC 不运行;设为
0可强制始终启用老化逻辑(但不推荐生产环境长期为 0) - gc_thresh2:软上限。缓存条目超过该值时,GC 会更积极扫描,但允许短暂超限(默认容忍 5 秒)
-
gc_thresh3:硬上限。一旦达到或超过,GC 立即触发清理,否则新增 ARP 条目会失败(报错
SIOCSARP: No buffer space available)
按接口或全局统一配置
ARP 参数按网络接口隔离。有多个网卡(如 eth0、ens33)时,必须明确指定目标接口,否则改 default 只影响后续新建接口:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 查当前活跃接口:
ip link show | awk -F': ' '/^[0-9]/ && !/lo$/ {print $2}' - 临时修改 eth0:
echo 512 > /proc/sys/net/ipv4/neigh/eth0/gc_thresh1echo 2048 > /proc/sys/net/ipv4/neigh/eth0/gc_thresh2echo 10240 > /proc/sys/net/ipv4/neigh/eth0/gc_thresh3 - 若需所有接口(含未来新增)生效,改 default:
echo 512 > /proc/sys/net/ipv4/neigh/default/gc_thresh1echo 2048 > /proc/sys/net/ipv4/neigh/default/gc_thresh2echo 10240 > /proc/sys/net/ipv4/neigh/default/gc_thresh3
永久生效与验证方法
写入 /etc/sysctl.conf 实现重启不丢失:
- 追加配置行(注意格式无空格):
net.ipv4.neigh.default.gc_thresh1 = 512net.ipv4.neigh.default.gc_thresh2 = 2048net.ipv4.neigh.default.gc_thresh3 = 10240 - 加载新配置:
sysctl -p - 验证是否生效:
sysctl net.ipv4.neigh.default.gc_thresh3或直接读文件:cat /proc/sys/net/ipv4/neigh/eth0/gc_thresh3 - 观察内核是否仍报溢出:
dmesg | grep -i "ARP_CACHE.*OVERFLOW"—— 出现该日志说明仍需调大
配套建议:避免缓存堆积引发连通问题
大子网(如 /21 含 2046 可用地址)容易填满默认 1024 条限制,导致同网段 ping 不通。除调大阈值外,还应:
- 确认 ARP 表真实状态用
ip neigh show,而非arp -a(后者不显示条目状态) - 若发现大量
FAILED或INCOMPLETE条目,可能需检查链路层连通性或邻居设备响应能力 - 高密度场景(如 Mininet、K8s 节点密集)建议将
gc_thresh3设为预估峰值的 1.5 倍以上










