ARP表溢出
问题描述:路由器连接clients变大时,出现部分人无法分配IP或无法上网;查看日志dmesg有很多“ipv4: Neighbour table overflow.”打印
问题原因:ARP表条目达到限制,新连接的client在路由器上无法正常解析、存储ARP,导致网络异常
解决方法:把默认的ARP条目限制提高
-
root@RippleTek:~# sysctl net.ipv4.neigh.default.gc_thresh1
-
net.ipv4.neigh.default.gc_thresh1 = 128
-
root@RippleTek:~# sysctl net.ipv4.neigh.default.gc_thresh2
-
net.ipv4.neigh.default.gc_thresh2 = 512
-
root@RippleTek:~# sysctl net.ipv4.neigh.default.gc_thresh3
-
net.ipv4.neigh.default.gc_thresh3 = 1024
-
root@RippleTek:~# sysctl net.ipv4.neigh.default.gc_interval
-
net.ipv4.neigh.default.gc_interval = 30
-
root@RippleTek:~# sysctl net.ipv4.neigh.default.gc_stale_time
-
net.ipv4.neigh.default.gc_stale_time = 60
见上文,ARP几个常见配置参数和默认值。其中:
net.ipv4.neigh.default.gc_thresh1:存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是128。
net.ipv4.neigh.default.gc_thresh2:保存在 ARP 高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字 5 秒。缺省值是 512。net.ipv4.neigh.default.gc_thresh3:保存在 ARP 高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是1024。
net.ipv4.neigh.default.gc_interval:每次运行GC后的停顿时间,缺省是30秒。
net.ipv4.neigh.defalut.gc_stale_time:决定检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。
根据实际使用人数调整ARP表条目上限:
-
vi /etc/sysctl.conf
-
net.ipv4.neigh.default.gc_thresh3 = 4096
-
net.ipv4.neigh.default.gc_thresh2 = 2048
-
net.ipv4.neigh.default.gc_thresh1 = 1024
-
-
sysctl -p
TIME_WAIT连接过多导致路由器dhcps无法分配IP
问题描述:路由器在有大量client连接后,出现新client接入时分配IP地址缓慢或无法分配IP地址的情况。日志dmesg打印“No buffer space available”;使用netstat查看系统中有大量TIME_WAIT状态的连接。
问题原因:大量TIME_WAIT状态的连接存在占用了系统资源,导致DHCP发送报文失败。
解决方案:配置tcp TIME_WAIT状态的连接快速回收:
sysctl改两个内核参数就行了,如下:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
简单来说,就是打开系统的TIMEWAIT重用和快速回收,至于怎么重用和快速回收,这个问题我没有深究,实际场景中这么做确实有效果。用netstat或者ss观察就能得出结论。
还有些朋友同时也会打开syncookies这个功能,如下:
net.ipv4.tcp_syncookies = 1
打开这个syncookies的目的实际上是:“在服务器资源(并非单指端口资源,拒绝服务有很多种资源不足的情况)不足的情况下,尽量不要拒绝TCP的syn(连接)请求,尽量把syn请求缓存起来,留着过会儿有能力的时候处理这些TCP的连接请求”。
如果并发量真的非常非常高,打开这个其实用处不大。
阅读(4194) | 评论(0) | 转发(0) |