hhvm频繁告警,iostat正常,vmstat正常,实在是想不出什么地方出问题了。经过诊断是网络出现了问题,出现了大量TIME_WAIT和CLOSE_WAIT,
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
原理:redis的客户端close一个链接以后,这个链接就会进入TIME_WAIT状态,而TIME_WAIT状态的链接会在Max Segment Lifetime内都没有活跃包的情况下关掉。Linux这个默认值貌似很长,具体的数值还真不知道,似乎是分钟级的。。。
悲剧的是,一条TCP链接是死是活由源IP和端口,目标IP和端口四个变量决定。那客户端和服务器的这四个值都是固定的,所以每次建立新链接的同时,处在TIME_WAIT的链接也被告知,你还不能死。所以执行上述命令,让tw状态的链接可以reuse
补充:/proc/sys/net/ipv4/tcp_tw_recycle 如果设成1的话,就是快速回收tw链接,应该也能解决问题
http://segmentfault.com/q/1010000000095255 为何redis的TIME_WAIT值如此之高
http://blog.csdn.net/shootyou/article/details/6622226 再谈应用环境下的TIME_WAIT和CLOSE_WAIT