架构 F5 -> ( bond0 -> Nginx -> lo -> tomcats ) x4

目前的LB配额需要在F5上定制,修改的审批手续比较麻烦。 今天发现新配置的服务器5上出现了奇怪的表现

nginx error log

2014/12/30 15:03:55 [error] 12695#0: *1678885 upstream timed out (110: Connection timed out) while connecting to upstream, client:

查找原因:

dmesg error log

dmesg出现大量提示:

ip_conntrack: table full, dropping packet

rc.loca加载了以下字段,但/proc/sys/net/ipv4/ip_conntrack_max不知何缘故被重载了,数字不符。

ulimit -SHn 131070
modprobe ip_conntrack
echo '262144' > /proc/sys/net/ipv4/ip_conntrack_max

问题原因, 由于服务器在之前已经加载了ip_conntrack模块,并启用了ip_nat和iptable_nat,所以导致不能卸载ip_conntrack的模块。

临时解决方法

echo '262144' > /proc/sys/net/ipv4/ip_conntrack_max

处理方法

  • 关闭ip_conntrack,ip_nat和iptable_nat;
  • 由于不熟悉该业务,所以无法判断能否关闭ip_conntrack,ip_nat和iptable_nat;

临时处理方法

  • 建议, 按建议不处理。

临时架构1 F5 -> ( bond0 -> nginx -> bond0 -> tomcat ) x4

  • 参考
  • 得知我们架构的nginx只是proxy架构,和内核<->io使用无关系,所以应当停止使用sendfile和nopush,改用nodelay。
  • 文件服务器或者css,jpg等静态页可以使用sendfile, 这里不适合。
  • 业务量大可以使用nopush, 这里不适合。
#sendfile        on; 
#tcp_nopush     on;
tcp_nodelay     on;

内部访问缓慢,出现丢包

  • 内部网络间访问缓慢,判断为交换机带宽不足或服务器间的tcp资源耗尽;

临时解决方法

还原

临时架构2 F5 -> ( bond0 -> nginx -> bond0 -> tomcat ) x4 and tcp fixed

在调整架构1的情况下,调整内核参数以修改fin2的数量,

修改条目

有建议修改以下项, 参考这里修改 关于tcp time wait的简单描述,特别留意下net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle的使用

net.ipv4.tcp_fin_timeout = 3
net.ipv4.tcp_keepalive_time = 10
net.ipv4.ip_local_port_range = 1024  65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.tcp_max_tw_buckets = 100

修改前

  • timeout 和 fin2 很大,负载约3.6 ;
          'SYN-SENT' => 8,
          'ESTAB' => 2373,
          'State' => 1,
          'FIN-WAIT-1' => 10,
          'LAST-ACK' => 1,
          'FIN-WAIT-2' => 1207,
          'TIME-WAIT' => 59157,
          'SYN-RECV' => 402,
          'LISTEN' => 24

修改后

  • 修改后,改善了fin的值和timewait的值,负载约2.8
          'CLOSING' => 1,
          'SYN-SENT' => 7,
          'ESTAB' => 1463,
          'State' => 1,
          'FIN-WAIT-1' => 45,
          'FIN-WAIT-2' => 895,
          'TIME-WAIT' => 103,
          'SYN-RECV' => 386,
          'LISTEN' => 24

存在问题

出现dmesg报错

$ sudo dmesg -c
printk: 17661 messages suppressed.
TCP: time wait bucket table overflow
printk: 17931 messages suppressed.
TCP: time wait bucket table overflow

抓包

应当确定相应网卡端口间的数据是否正确,并确认内网间使用http1.1 keepalive(没有 S S. F.)的存在。

sudo /usr/sbin/tcpdump -n -i bond0 tcp port xxxx