当前位置: 首页 > article >正文

调整TCP参数, 优化网络性能

在Linux系统中,调整TCP参数可以显著优化网络性能,特别是在面对特定网络条件(如高带宽延迟、频繁的数据包丢失或高延迟网络)时。

1. 调整TCP窗口大小

a. 发送和接收缓冲区大小

参数:

  • net.core.rmem_max:单个套接字接收缓冲区的最大值。
  • net.core.wmem_max:单个套接字发送缓冲区的最大值。
  • net.ipv4.tcp_rmem:TCP接收缓冲区的最小值、默认值和最大值。
  • net.ipv4.tcp_wmem:TCP发送缓冲区的最小值、默认值和最大值。

调整原因:
增加TCP窗口大小可以提高高带宽-延迟产品(BDP)网络的吞吐量。例如,在高带宽延迟网络(如跨洲连接)中,较大的缓冲区允许更多的数据在传输过程中被“挂起”,从而提高整体数据传输效率。

调整方法:

编辑/etc/sysctl.conf文件,添加或修改以下参数:

# 增大核心缓冲区大小
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# 增大TCP接收缓冲区
net.ipv4.tcp_rmem = 4096 87380 16777216

# 增大TCP发送缓冲区
net.ipv4.tcp_wmem = 4096 65536 16777216

应用更改:

sudo sysctl -p

2. 启用和优化窗口缩放

参数:

  • net.ipv4.tcp_window_scaling

调整原因:
TCP窗口缩放允许TCP窗口大小超过65,535字节,这是传统TCP窗口大小的上限。启用窗口缩放对于高带宽-延迟网络至关重要,因为它使得TCP可以利用更大的窗口,从而提高吞吐量。

调整方法:

确保窗口缩放已启用:

sudo sysctl -w net.ipv4.tcp_window_scaling=1

编辑/etc/sysctl.conf以永久启用:

net.ipv4.tcp_window_scaling = 1

然后应用更改:

sudo sysctl -p

3. 优化拥塞控制算法

参数:

  • net.ipv4.tcp_congestion_control

常见算法:

  • cubic:默认的拥塞控制算法,适用于高带宽和高延迟网络。
  • reno:较旧的算法,适用于一般网络条件。
  • bbr:基于带宽-延迟产品的先进算法,能够在高带宽和高延迟网络中提供更高的吞吐量和更低的延迟。

调整原因:
不同的拥塞控制算法在不同的网络条件下表现不同。例如,cubicbbr在高带宽-延迟网络中表现优异,而reno适用于较低带宽和延迟的环境。

调整方法:

查看当前拥塞控制算法:

sysctl net.ipv4.tcp_congestion_control

列出可用的算法:

sysctl net.ipv4.tcp_available_congestion_control

设置拥塞控制算法(例如设置为bbr):

sudo sysctl -w net.ipv4.tcp_congestion_control=bbr

编辑/etc/sysctl.conf以永久设置:

net.ipv4.tcp_congestion_control = bbr

然后应用更改:

sudo sysctl -p

启用BBR:

除了设置拥塞控制算法,还需要启用BBR模块:

sudo modprobe tcp_bbr

并确保在启动时加载:

编辑/etc/modules-load.d/modules.conf,添加:

tcp_bbr

4. 调整重传超时(Retransmission Timeout)

参数:

  • net.ipv4.tcp_retries1:决定TCP在发送了多少个重传包后放弃。
  • net.ipv4.tcp_retries2:决定在放弃前最多允许的数据包重传次数。
  • net.ipv4.tcp_syn_retries:决定发送SYN包尝试建立连接的次数。

调整原因:
在高延迟或不稳定的网络中,适当增加重传次数和超时可以避免过早地放弃连接尝试。然而,过多的重传可能会导致资源消耗和连接延迟增加。

调整方法:

编辑/etc/sysctl.conf,根据需要调整以下参数:

# 增加TCP重传的次数和时间
net.ipv4.tcp_retries1 = 6
net.ipv4.tcp_retries2 = 15

# 增加SYN重试次数
net.ipv4.tcp_syn_retries = 5

然后应用更改:

sudo sysctl -p

5. 调整FIN超时和保持活动设置

参数:

  • net.ipv4.tcp_fin_timeout:决定FIN-WAIT-2状态的超时时间。
  • net.ipv4.tcp_keepalive_time:决定开始发送keepalive探测的空闲时间。

调整原因:
减少FIN超时可以帮助更快地回收TIME-WAIT状态的连接,释放系统资源。调整keepalive设置可以帮助及时检测和清理挂起的连接。

调整方法:

编辑/etc/sysctl.conf,添加或修改以下参数:

# 减少FIN-WAIT-2状态超时
net.ipv4.tcp_fin_timeout = 30

# 调整TCP keepalive参数
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

然后应用更改:

sudo sysctl -p

6. 启用TCP快速打开(TCP Fast Open)

参数:

  • net.ipv4.tcp_fastopen

调整原因:
TCP快速打开可以减少TCP握手延迟,加快数据传输的启动速度,特别适用于需要频繁建立短连接的应用场景。

调整方法:

启用TCP快速打开:

sudo sysctl -w net.ipv4.tcp_fastopen=3

永久启用:

编辑/etc/sysctl.conf,添加:

net.ipv4.tcp_fastopen = 3

然后应用更改:

sudo sysctl -p

注意: 应用TCP快速打开需要应用程序支持该功能。

7. 其他有用的TCP参数

a. 增加最大端口号范围

参数:

  • net.ipv4.ip_local_port_range

调整原因:
在高并发连接的服务器上,增大可用的端口范围可以减少端口耗尽的问题。

调整方法:

编辑/etc/sysctl.conf,添加或修改:

net.ipv4.ip_local_port_range = 1024 65535

然后应用更改:

sudo sysctl -p

b. 启用TCP时间戳

参数:

  • net.ipv4.tcp_timestamps

调整原因:
TCP时间戳可以帮助更准确地计算往返时间(RTT),从而优化重传超时和拥塞控制。

调整方法:

确保TCP时间戳已启用:

sudo sysctl -w net.ipv4.tcp_timestamps=1

永久启用:

编辑/etc/sysctl.conf,添加:

net.ipv4.tcp_timestamps = 1

然后应用更改:

sudo sysctl -p

调整参数的具体原因总结

  1. 增加缓冲区大小(rmem_maxwmem_max

    • 原因:适应高带宽-延迟产品网络,提高数据传输的吞吐量。
  2. 启用窗口缩放(tcp_window_scaling

    • 原因:允许更大的TCP窗口,从而支持更高的吞吐量,特别是在高BDP网络中。
  3. 选择合适的拥塞控制算法(tcp_congestion_control

    • 原因:不同的算法在不同网络条件下表现不同,选择适合当前网络状况的算法以优化性能。
  4. 调整重传超时(tcp_retries1tcp_retries2

    • 原因:在不稳定或高延迟网络中,适当增加重传次数和延迟,以避免过早放弃连接。
  5. 优化连接关闭和保持活动设置

    • 原因:加快连接资源的回收,及时检测和清理挂起的连接,释放系统资源。
  6. 启用TCP快速打开(tcp_fastopen

    • 原因:减少TCP握手延迟,提升短连接的建立速度。
  7. 扩展本地端口范围(ip_local_port_range

    • 原因:在高并发环境下,防止端口耗尽,支持更多的并发连接。
  8. 启用TCP时间戳(tcp_timestamps

    • 原因:提高RTT测量的精确度,优化重传和拥塞控制算法的表现。

调整参数的注意事项

  1. 谨慎调整:不当的参数调整可能导致网络性能下降或系统不稳定。在修改之前,建议在测试环境中进行验证。

  2. 逐步调整:一次只调整一个或少数几个参数,以便准确评估每个调整的影响。

  3. 监控系统:在调整参数后,持续监控网络性能和系统资源使用情况,确保调整带来了预期的效果。

  4. 了解应用需求:不同的应用有不同的网络需求,根据具体应用场景进行优化。例如,数据库服务器可能需要不同的优化策略与Web服务器。

通过合理调整上述TCP参数,可以显著提升Linux系统在特定网络条件下的TCP性能,满足高效稳定的数据传输需求。


http://www.kler.cn/a/389698.html

相关文章:

  • PostgreSQL 开启密码验证插件
  • 基于Qt/C++全局键盘和鼠标事件监控工具
  • 怎么监控员工电脑?分享5个监控员工电脑的绝佳方法(立竿见影!建议收藏!)
  • 【Python】爬虫通过验证码
  • 超子物联网HAL库笔记:定时器[外部模式]篇
  • Python如何用正则表达式匹配并处理文件名
  • 基于springboot的家装平台设计与实现
  • 【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)
  • 整合本地市场机会 同城小程序打造社区商圈
  • Uniapp去除顶部导航栏-小程序、H5、APP适用
  • 专业140+总分430+复旦大学875信号与系统考研经验原957电子信息通信考研,真题,大纲,参考书。
  • ssm基于BS的仓库在线管理系统的设计与实现+vue
  • 单链表算法题(数据结构)
  • 【网络安全 | 漏洞挖掘】Google SSO用户的帐户接管
  • 人工智能学习--分类模型的训练和应用
  • 了解 Open RAN 架构中的 DU 和 CU
  • c语言编程题(函数)
  • 如何在MT4中实现神经网络EA?
  • AI与隐私:Facebook如何在数据保护中平衡创新与安全
  • stm32对EV1527波形进行解码
  • 贪心算法-汽车加油
  • oneplus6总结记录-Lineage19.1-android12
  • 密码学的基本原理
  • [ARM-2D 专题]6.脏矩形定义的宏使用技巧和分析
  • node.js电子发票(铁路电子客票)查验接口,让您的企业报销流程更顺畅
  • Java List——针对实习面试