IP Neighbour Table Overflow

20 Apr 2014

偶然性的发现一个网络问题, 在大批量的 ping 不同 IP 的时候, 会偶发性的出现 No buffer space available 的错误:

[root@localhost]
# ping 61.139.2.69
connect: No buffer space available

简单的说, 这个报错的原因就是 ARP 表满了, 不能存新项导致的, No buffer space 指的就是 ARP 表.

那如何看 arp 表呢.?

[root@localhost /root]
#ip neighbor show
10.137.11.247 dev bond0 lladdr 00:00:0c:9f:f3:84 REACHABLE
10.110.71.247 dev eth2 lladdr 00:00:0c:07:ac:0a STALE
10.110.66.105 dev eth2 lladdr 00:e0:ec:25:80:0c STALE

[root@localhost /root]
#arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
10.137.11.247            ether   00:00:0c:9f:f3:84   C                     bond0
10.110.71.247            ether   00:00:0c:07:ac:0a   C                     eth2
10.110.66.105            ether   00:e0:ec:25:80:0c   C                     eth2

那 arp 表的上限是怎么定的呢.?

[root@localhost /root]
#sysctl net.ipv4.neigh.default | grep gc

## 失效时间, 每次 ARP 被引用时刷新,
## 简单说就是一个 ARP 表项超过这个时间之后就会被标记成"可清除"
net.ipv4.neigh.default.gc_stale_time = 60

## ARP 表清理间隔(30s)
net.ipv4.neigh.default.gc_interval = 30

## ARP Cache 下限, 低于此限就不会清理 ARP 表
net.ipv4.neigh.default.gc_thresh1 = 128

## ARP Cache 软上限
net.ipv4.neigh.default.gc_thresh2 = 512

## ARP Cache 硬上限
net.ipv4.neigh.default.gc_thresh3 = 1024

解这个问题

sysctl -w net.ipv4.neigh.default.gc_thresh1=256
sysctl -w net.ipv4.neigh.default.gc_thresh2=1024
sysctl -w net.ipv4.neigh.default.gc_thresh3=2048

参考资料

comments powered by Disqus