大多数Linux发行版都定义了适当的缓冲区和其他TCP参数,可以通过修改这些参数来分配更多的内存,从而改进网络性能。设置内核参数的方法是通过proc接口,也就是通过读写/proc中的值。幸运的是,sysctl可以读取/etc/sysctl.conf
中的值并根据需要填充/proc,这样就能够更轻松地管理这些参数。
下面展示了在互联网服务器上应用于Internet服务器的一些比较激进的网络设置。
# Use TCP syncookies when needed
net.ipv4.tcp_syncookies = 1
# Enable TCP window scaling
net.ipv4.tcp_window_scaling = 1
# Increase TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# Increase linux autotuning TCP buffer limits
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65535 16777216
# Increase number of ports available
net.ipv4.ip_local_port_range = 1024 65000
将这些设置添加到/etc/sysctl.conf
的现有内容中。
第一个设置启用TCP SYN cookie。
当从客户机发来新的TCP连接时,数据包设置了SYN位,服务器就位这个半开的连接创建一个条目,并用一个SYN-ACK数据包进行响应。在正常操作中,远程客户机用一个ACK数据包进行响应,这回使得半开的连接转换为全开的。
有一种称为SYN泛滥(SYN flood)的网络攻击,它使ACK数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。SYN cookie特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间,大多数系统都默认启用这个特性,但是确保配置这个特性更可靠。
第二个设置启用TCP窗口伸缩
启用TCP窗口伸缩可以使客户机能够以更高的速度下载数据。TCP允许在未从远程端收到确认的情况下发送多个数据包,默认设置是最多64KB,在与延迟比较大的远程客户机进行通信时这个设置可能不够,窗口伸缩会在头中启用更多的位,从而增加窗口大小。
后面四个配置项增加TCP发送和接收缓冲区
这使应用程序可以更快地丢掉它的数据,从而为另一个请求服务,还可以强化远程客户机在服务器繁忙时发送数据的能力。
最后一个配置项增加可用的本地端口数量
这样就增加了可以同时服务的最大连接数量。
在下一次引导系统时,或者下一次运行sysctl -p /etc/sysctl.conf
时,这些设置就会生效。
所有的TCP/IP调优参数都位于/proc/sys/net
目录,例如下面是最重要的一些调优参数:
# 最大的TCP数据接收缓冲
/proc/sys/net/core/rmem_max
# 最大的TCP数据发送缓冲
/proc/sys/net/core/wmem_max
# 时间戳在TCP的包头增加12个字节
/proc/sys/net/ipv4/tcp_timestamps
# 有选择的应答
/proc/sys/net/ipv4/tcp_sack
# 支持更大的TCP窗口,如果TCP窗口最大超过65535,必须设置该数值为1
/proc/sys/net/ipv4/tcp_window_scaling
# 默认的接收窗口大小
rmem_default
# 接收窗口的最大大小
rmem_max
# 默认的发送窗口大小
wmem_default
# 发送窗口的最大大小
wmem_max
/proc目录下的所有内容都是临时性的,所以重启系统后任务修改都会丢失
建议在系统启动时自动修改TCP/IP参数,将下面代码增加到/etc/rc.local
文件中,然后保存文件,系统重新引导的时候回自动修改下面TCP/IP参数:
echo 256960 > /proc/sys/net/core/rmem_default
echo 256960 > /proc/sys/net/core/rmem_max
echo 256960 > /proc/sys/net/core/wmem_default
echo 256960 > /proc/sys/net/core/wmem_max
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 1 > /proc/sys/net/ipv4/tcp_sack
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
TCP/IP参数都是自解释的,TCP窗口大小设置为256960,禁止TCP的时间戳(取消在每个数据包的头中增加12字节),支持更大的TCP窗口和TCP有选择的应答。
上面数值的设定是根据互联网连接和最大带宽/延迟率来决定的。
另外一个方法:使用/etc/sysctl.conf
在系统启动时将参数设置成需要设置的值。
net.core.rmem_default = 256960
net.core.rmem_max = 256960
net.core.wmem_default = 256960
net.core.wmem_max = 256960
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1