新部署了几个接收服务器,因为以前的老业务都是nginx接收的,没法迁移到scribe或者fluentd上。所以,只能在这些服务器上部署hadoop的client,用fs -put的方法把nginx生成的NCSA日志定时放到HDFS里。也就是在nginx服务器上需要部署hadoop的client。


hadoop部署好了之后交给别人做日志的put脚本,然后一会报告我,put失败。而且是一会成功一会失败,不定。看了一下,主要是报了一个Java的TCP错误,No buffer space available。尝试ping了一下内网的机器,也是报这个故障,无法发送ICMP包,根本ping不通。考虑到这台服务器在担任hadoop client的同时还担负nginx的任务,应该是属于ARP表满的问题。OPS在新做机器的时候,都用了默认配置,没有做内核参数的优化才导致了这样的问题。


echo 512 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo 2048 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo 10240 > /proc/sys/net/ipv4/neigh/default/gc_thresh3


以root身份执行上述操作,问题解决。就是apr表超过了缓存大小了,可能是因为网络问题,没有及时进行连接的关闭,所以无法进行垃圾回收。


下面是关于这些参数的说明,以下内容摘自网络


gc_stale_time
决定检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。
gc_thresh1
存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是128。
gc_thresh2
保存在 ARP 高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字 5 秒。缺省值是 512。
gc_thresh3
保存在 ARP 高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是1024。


说到这里,又忍不住要吐槽了,这次季度的KPI考核,我们数据部门被别人打了不及格的分数。这事不吐不行,上面一边说数据是重中之重,一边把数据划归公司末流的支撑性部门,比行政还不如,对我来说这就跟一贪官在台上大谈廉政为民的感觉是一样的。nginx单台并发最高暴过80万,平时基本就是二三十万的并发,php并发最高到过8000/秒。别问我怎么做到的,我的确已经尽力了。就这样都死活不给加服务器,让我不丢数,臣妾做不到啊。算了一下,淘宝每天15万任务,4500台服务器,平均每一万任务需要300台服务器。现在我们一天将近一万个数据任务,跑在40台服务器上,让我保证任务无失败,臣妾做不到啊。臣妾多想把数据的基础平台搞好啊,可是啥东西都不给,臣妾真的做不到啊。