Linux Tune网络堆栈(缓冲区大小)以提高网络性能

时间:2020-01-09 10:42:00  来源:igfitidea点击:

我有位于两个不同数据中心的两个服务器。
两台服务器都处理大量并发的大文件传输。
但是对于大文件,网络性能非常差,并且大文件会降低性能。
如何在Linux下调整TCP以解决此问题?
默认情况下,Linux网络堆栈未配置为通过WAN链接进行高速大文件传输。
这样做是为了节省内存资源。
您可以通过增加连接服务器系统以处理更多网络数据包的高速网络的网络缓冲区大小,轻松地调整Linux网络堆栈。

默认的最大Linux TCP缓冲区大小太小。

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

选项内存缓冲区的最大数量:

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

调整值

将所有协议上的队列的最大OS发送缓冲区大小(wmem)和接收缓冲区大小(rmem)设置为12 MB。
换句话说,设置在传输文件时打开或者创建每个TCP套接字时分配给每个TCP套接字的内存量:

警告!在大多数Linux发行版中,rmem_max和wmem_max的默认值约为128 KB,这对于低延迟通用网络环境或者DNS/Web服务器等应用程序可能已足够。
但是,如果等待时间很大,则默认大小可能会太小。
请注意,以下设置将增加服务器上的内存使用量。

# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf

您还需要设置最小大小,初始大小和最大大小(以字节为单位):

# echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf

打开窗口缩放,可以选择放大传输窗口:

# echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf

启用RFC1323中定义的时间戳记:

# echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf

启用选择确认:

# echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf

默认情况下,当连接关闭时,TCP会将各种连接度量标准保存在路由缓存中,以便不久的将来建立的连接可以使用它们来设置初始条件。
通常,这会提高整体性能,但有时可能会导致性能下降。
如果设置,TCP将不会在关闭连接时缓存指标。

# echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf

当接口接收数据包的速度快于内核处理数据包的速度时,设置在INPUT端排队的最大数据包数。

# echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf

现在重新加载更改:

# sysctl -p

使用tcpdump查看eth0的更改:

# tcpdump -ni eth0