偶然性的发现一个网络问题, 在大批量的 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