调整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性能,满足高效稳定的数据传输需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

json转excel,读取json文件写入到excel中【rust语言】

一、rust代码 将json文件写入到 excel中。(保持json :key原始顺序) use indexmap::IndexMap; use serde::Deserialize; use serde_json::{Value, from_str}; use std::error::Error; use std::io::{self, Write}; use std::path::{Path}; u…

理想火车站定位(字节青训)

题目 小F是A市的市长,正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整,形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| |y1 - y2|,即曼哈顿距离。 在初步考察后,…

5位机械工程师如何共享一台工作站的算力?

在现代化的工程领域中,算力已成为推动创新与技术进步的关键因素之一。对于机械工程师而言,强大的计算资源意味着能够更快地进行复杂设计、模拟分析以及优化工作,从而明显提升工作效率与项目质量。然而,资源总是有限的,…

使用微信云开发,实现链接激活微信小程序(微信内部和外部H5访问)

首先小程序项目开发,需得支持云开发如何开通云开发?(网上教程很多,也很全面,这里仅带过) 配置云函数在项目根目录找到 project.config.json 文件,新增 cloudfunctionRoot 字段,指定本…

NVM 介绍及使用指南

在日常的开发工作中,我们往往会遇到需要在同一台机器上同时管理多个版本的 Node.js 的情况。为了解决这个问题,我一个同事推荐了NVM(Node Version Manager)。NVM 是一个用于管理 Node.js 版本的工具,可以方便地在不同的…

vscode 全局搜索的用法:

搜索栏最右边功能是区分大小写,全字匹配(比如搜索abc,就不会显示abcd或者ab这些内容),使用正则表达式。变成高亮就是开启对应功能。包含的文件:这栏里如果最右边高亮填入带路径的文件,指的是在文…

如何从 Nutanix 迁移至 SmartX 超融合?解读 4 类迁移方案和 2 例迁移实践

随着 Nutanix(路坦力)将大陆区域的销售和部分维保工作交由联想负责,不少用户也在寻求 Nutanix 的替代方案。现阶段是否有必要换掉 Nutanix?有哪些成熟的国产替代方案?这些方案在性能和功能上是否具备与 Nutanix 同等的…

C++常见概念问题(3)

C常见概念问题(3) 1. 构造函数的初始化顺序 基类构造函数:在派生类的构造函数中,基类的构造函数在派生类构造函数体执行之前调用。 成员变量初始化:类中的成员变量会按照其在类中声明的顺序进行初始化,而…

「QT」几何数据类 之 QVector2D 二维向量类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

运维智能化转型:AIOps引领IT运维新浪潮

1. AIOps是什么? AIOps(Artificial Intelligence for IT Operations),即人工智能在IT运维中的应用,通过机器学习技术处理运维数据(如日志、监控信息和应用数据),解决传统自动化运维…

C++练习 二维数组的应用

1&#xff09;超女有3个小组&#xff0c;每组有4名选手&#xff0c;请提供一个界面&#xff0c;输入每个超女的体重&#xff0c;然后&#xff0c;计算出每组的超女的平均体重和全部超女的平均体重。 #include <iostream> using namespace std;int main() {float sum1 0…

Vue3安装、创建到使用

vue安装 npm install vuenext # 全局安装 vue-cli npm install -g vue/cli #更新插件 项目中运行 vue upgrade --nextvue create 命令 vue create [options] <app-name> options 选项可以是&#xff1a; -p, --preset <presetName>&#xff1a; 忽略提示符并使用已…

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

视频播放相关的杂记

基于QT FFMPEG设计一款 RTMP协议推流、视频录制软件 实现的功能&#xff1a; &#xff08;1&#xff09;将摄像头视频流 麦克风音频流合并&#xff0c;并推到流媒体服务器 &#xff08;2&#xff09;将摄像头视频流 麦克风音频流保存到本地磁盘 基于QtFFMPEG设计一款RTM…

oracle如何创建两个数据库,以及如何用navicat连接,监听、数据泵

项目背景oracle11g, 已经非常老了&#xff0c; 2017年的左右&#xff1b;谨慎参考 W11直接搜索就行 dbca唯一需要注意的地方就是一定一定一定要以管理身份运行&#xff0c;否则会提示各种因为文件权限问题报的错误 然后弹出程序提示&#xff0c;图形化开始操作了&#xff1b; …

LeetCode 509.斐波那契数

动态规划思想 五步骤&#xff1a; 1.确定dp[i]含义 2.递推公式 3.初始化 4.遍历顺序 5.打印dp数组 利用状态压缩&#xff0c;简化空间复杂度。在原代码中&#xff0c;dp 数组保存了所有状态&#xff0c;但实际上斐波那契数列的计算只需要前两个状态。因此&#xff0c;我们…

Qml 中的那些坑(七)---ComboBox嵌入Popup时,滚动内容超过其可见区域不会关闭ComboBox弹窗

【写在前面】 最近在写信息提交 ( 表单 ) 的窗口时发现一个奇怪的 BUG&#xff1a; 其代码如下&#xff1a; import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")B…

Softing工业将在纽伦堡SPS 2024上展示Ethernet-APL现场交换机

今年&#xff0c;Softing工业将在纽伦堡SPS贸易展览会上展示aplSwitch Field —— 一款先进的过程自动化解决方案。这款16端口以太网高级物理层&#xff08;APL&#xff09;现场交换机的防护等级高达IP30&#xff0c;可提供从应用到现场级别的无缝以太网连接&#xff0c;专为Ex…

Local Transfer 致力于更加便捷地共享传输文件

软件主页&#xff1a;https://illusionna.github.io/LocalTransfer