Home

zhangyiqun

Thoughts, stories and ideas.

Notes Blog Archives About
09 Aug 2009

Linux网络性能调优

#老外写的文章,看过后觉得非常不错,国内大部分是转载的英文版,我翻译过来造福一下大众吧。

我有两台服务器放在不同的机房.在两台服务器间会有一些大文件需要传输,每当这个时候我的网络性能就变的很差劲.在linux下我将如何通过调节TCP来改善这个问题呢?

其实linux默认的网络设置并不适用于大文件在广域网中传递,通常只是为了节省内存资源.现在你可以通过调节Linux的网络协议栈的缓冲区大小,增加网络的高速网络连接的服务器系统,以处理更多的数据包。

linux系统的默认tcp缓冲非常小,这个数值是根据系统内存算出来的.可以通过下面的命令查看一下

$ cat /proc/sys/net/ipv4/tcp_mem

通过下面两个命令可以看到默认和最大的系统套接字缓冲区(收取)

$ cat /proc/sys/net/core/rmem_default

$ cat /proc/sys/net/core/rmem_max

通过下面两个命令可以看到默认和最大的系统套接字缓冲区(发送)

$ cat /proc/sys/net/core/wmem_default

$ cat /proc/sys/net/core/wmem_max

socket buffer的最大初始化值

$ cat /proc/sys/net/core/optmem_max

调优

我将上文提到的(收取)和(发送)缓冲调到12MB,系统套接字缓冲区的调整将会对所有协议有影响.也就是说以后TCP发送或者接收数据时的缓冲都是用这个数值.

注意! rmem_max 和 wmem_max的默认大小是128 KB,在大多数情况下并不需要修改,在web或者dns服务器中使用默认值也不错。不过当你感到有明显的延迟时便可以根据以下的参数修改,修改后会增大内存的开销。

增大系统套接字缓冲区

# echo ‘net.core.wmem_max=12582912’ » /etc/sysctl.conf

# echo ‘net.core.rmem_max=12582912’ » /etc/sysctl.conf

增大TCP接收和发送缓冲区

# echo ‘net.ipv4.tcp_rmem= 10240 87380 12582912’ » /etc/sysctl.conf

# echo ‘net.ipv4.tcp_wmem= 10240 87380 12582912’ » /etc/sysctl.conf

开启window scaling

# echo ‘net.ipv4.tcp_window_scaling = 1’ » /etc/sysctl.conf

时间戳在(请参考RFC 1323)TCP的包头增加12个字节

# echo ‘net.ipv4.tcp_timestamps = 1’ » /etc/sysctl.conf

启用有选择的应答

# echo ‘net.ipv4.tcp_sack = 1’ » /etc/sysctl.conf

默认情况下一个tcp连接关闭后,把这个连接曾经有的参数比如慢启动门限snd_sthresh,拥塞窗口snd_cwnd 还有srtt等信息保存到dst_entry中, 只要dst_entry 没有失效,下次新建立相同连接的时候就可以使用保存的参数来初始化这个连接.通常情况下是关闭的。

# echo ‘net.ipv4.tcp_no_metrics_save = 1’ » /etc/sysctl.conf

每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

# echo ‘net.core.netdev_max_backlog = 5000’ » /etc/sysctl.conf

好了,现在重新加载配置文件

# sysctl -p

使用tcpdump看看修够后带来的变化

# tcpdump -ni eth0

其他说明:

关于window scaling可以参考http://kerneltrap.org/node/6723 ,其实看看tcp/ip详解就啥都明白了。

在对net.ipv4.tcp_no_metrics_save描述时我没有忠于原文

By default, TCP saves various connection metrics in the route cache when the connection closes, so that connections established in the near future can use these to set initial conditions. Usually, this increases overall performance, but may sometimes cause performance degradation. If set, TCP will not cache metrics on closing connections.

原文地址:http://www.cyberciti.biz/faq/linux-tcp-tuning/

Notes Blog Archives About