今天,一直服务正常的一台服务器突然频繁报警重启

查看系统负载和IO,都略微偏高,但也不是特别高

查看后台服务器的Log,也没能看出什么问题

开始怀疑是压力问题,于是增加了一台新服务器

但仍旧没能解决问题,服务仍然是时断时续

后来发现从该服务器ping或者telnet后面的服务器,经常会出现超时或异常情况

ping: sendmsg: Operation not permitted 

64 bytes from 10.11.156.46: icmp_seq=6 ttl=60 time=0.241 ms

ping: sendmsg: Operation not permitted

64 bytes from 10.11.156.46: icmp_seq=8 ttl=60 time=0.234 ms

而从同一机房的其它服务器连接后面的服务器,则一切正常

在确定了非网络问题后,又经过一番排查,发现,该服务器上起了iptables

-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT

限制了转发的tcp包的速度,由于该服务器的并发量非常大

使用从/var/log/message或者dmesg可以看到如下错误:

ip_conntrack: table full, dropping packet.

最后将iptables服务关掉后,一切就正常了

对于高并发的服务器,最好不要启用iptables,因为这样会导致链接跟踪表满

如果一定需要启用iptables,则可以用以下方法来处理:

1. 增大 ip_conntrack_max 值

echo "393216" >; /proc/sys/net/ipv4/ip_conntrack_max

 

vi /etc/sysctl.conf

net.ipv4.ip_conntrack_max = 393216

(2): 降低 ip_conntrack timeout时间

vi /etc/sysctl.conf

 

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300

net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120

net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60

net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120