一次扩容引发的ARP Cache问题

当某个EMR客户进行扩容时,机器接近上千台时,造成了网络通信问题,甚至有机器ping自己都平不通的情况。根据提示,原因是对于大集群来说,默认的centos arp cache配置不适合,需要调整相关参数。
现象是在给一个大客户进行扩容的时候,当机器接近千台的时候,NameNode主节点突然间通信变慢,请求堆积,最后zkfc直接将NameNode进行了failover了,另一台NameNode也是不定期的failover。
查看dmesg,发现了大量的异常日志:

[76391312.109413] net_ratelimit: 97 callbacks suppressed
[76391319.885189] net_ratelimit: 37 callbacks suppressed
[76391325.104167] net_ratelimit: 62 callbacks suppressed
[76391330.508496] net_ratelimit: 60 callbacks suppressed
[76391335.694525] net_ratelimit: 50 callbacks suppressed
[76391343.815606] net_ratelimit: 108 callbacks suppressed

dmesg报错

 

另外,NameNode的gmond metrics 收集也一直报错,无法发送metrics。对于gmond的metrics发送,其实对网络压力很小,如果依然无法发送,说明网络出现了较严重问题。
经过跟其他部门、兄弟团队合作,发现了是由于ARP Cache overflow造成的问题,从而严重的影响了网络性能。
ARP Cache的作用为,ARP表存储了IP地址和MAC地址的映射关系,ARP Cache有以下几个参数:
net.ipv4.neigh.default.gc_thresh1 ARP表小于该数值的时候不做垃圾回收
net.ipv4.neigh.default.gc_thresh2 ARP表大于该数值时,5s内进行垃圾回收
net.ipv4.neigh.default.gc_thresh3 ARP表的最大限额

再从我们系统中取得默认值发现:
net.ipv4.neigh.default.gc_thresh1 = 128
net.ipv4.neigh.default.gc_thresh2 = 512
net.ipv4.neigh.default.gc_thresh3 = 1024

默认配置偏小,导致了集群机器超过1000台后,网络丢包,不稳定现象,修改相关配置。

追加 /etc/sysctl.conf
net.ipv4.neigh.default.gc_thresh1 = 512
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh3 = 10240
net.nf_conntrack_max = 524288

sysctl -p 更新配置