Linux下的TCP\IP优化

Open files 

这是Linux下调优时需要修改的一个最基本参数。用 ulimit -a 命令可以查看到当前open files的数量上限值。由于通常每一个TCP连接都会多使用一个文件句柄,一般系统的默认值在真实应用环境里是不够用的。

修改的方式,以CentOS为例,/etc/security/limits.conf 文件里存储了一些系统限制参数的配置。在这个文件中加入

*	soft	nofile	65535
*	hard	nofile	65535

但是这个修改未必会对bash的当前用户生效,由当前用户启动的进程,可能open files的限制仍然是比较小的值。所以比较常见的方式是在/etc/profile中加入如下两句。

ulimit -c unlimited
ulimit -n 65535

为了保险,可以通过命令  cat /proc/[pid]/limits 查看某个进程的open files等相关信息,作为最终的确认。

 

Ports & TIME_WAIT State

通常系统默认动态分配的端口在32768到61000之间,这个值根据系统内核版本不同可能会有变化。通过sysctl命令可以手动修改内核的参数, 增加可以动态分配的端口号。我们可以将18000到65535都作为可分配的,18000以下的端口保留给应用程序本身使用。

TCP连接有许多的状态,这在使用 netstat 命令时可以看到。通常经过handshake的过程后,达到ESTABLISHED的状态。当经过一系列连接结束的变化后,最终会处于一个TIME_WAIT的状态。按照默认值,这个TIME_WAIT状态会持续两倍于Maximum Segment Lifetime。这通常是120秒,对于连接数多的应用来说,这个时间太长了些。若按照之前指定的可分配端口,意味着如果每秒如果有400个连接请求,那么很快就会把可使用的端口号耗尽。因此,根据应用实际情况,需要把这个参数值设低。这对于比较高并发的Web应用更明显。

以上内容可以通过sysctl添加如下参数:

net.ipv4.ip_local_port_range = 18000 65535
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 1

 

Keepalive Timeout

如果应用指定了Tcp连接使用Keepalive,那么系统的keepalive超时时间需要调低一些。例如Centos中默认值是7200秒,实在太长了,会发现一些连接在TIME_WAIT状态长时间存在。

同样,可以通过sysctl改变以下系统参数:

net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 30

 

Connection Tracking

我们通常都会使用iptables,iptables会追踪建立的连接,这些跟踪信息被储存在一个connection tracking table里。在不同内核里,控制这个上限值的系统参数名可能不一样。如果conntrack_count超过了上限,系统将无法接受新的TCP连接。而且如果不去仔细查看syslog,可能还找不到原因。

以Centos为例,确认以下参数得到合理设置:

net.ipv4.netfilter.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 600

这些参数的调整与其说是优化,不如说是系统默认设置本身并没有考虑在高负载情况下对资源的充分利用。其它还有一些系统参数对性能也会有影响,但总体上而言,其它一些参数的设置需要根据应用情况实际调整,并没有太一致的经验准则。