Linux 调整网络堆栈(缓冲区大小)以提高网络性能
我有两台服务器,分别位于两个不同的数据中心。两台服务器都处理大量并发大文件传输。但是网络性能对于大文件来说非常差,处理大文件时性能会下降。如何在 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 套接字时分配的内存量:
# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
您还需要设置最小大小、初始大小和最大大小(以字节为单位):
打开窗口缩放,这可以是扩大传输窗口的选项:启用
RFC1323 中定义的时间戳:
启用选择确认:
默认情况下,TCP 在连接关闭时在路由缓存中保存各种连接指标,以便在不久的将来建立的连接可以使用这些指标来设置初始条件。通常,这会提高整体性能,但有时可能会导致性能下降。如果设置,TCP 将不会在关闭连接时缓存指标。
当接口接收数据包的速度快于内核处理数据包的速度时,设置在 INPUT 端排队的最大数据包数。
现在重新加载更改:
使用 tcpdump 查看 eth0 的更改:
# 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
# echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf
# echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
# sysctl -p
# tcpdump -ni eth0
推荐阅读:
- 请参阅文档/networking/ip-sysctl.txt中的内核文档以获取更多信息。
- 手册页 sysctl