优化 TCP 以提高网络性能

本页面简要介绍了计算正确设置的方法,以缩短 Google Cloud 和混合场景中 TCP 连接的延迟时间。本页面还可帮助您了解如何缩短 Google Cloud 中流程之间的连接延迟时间。

现代微服务架构主张,开发者应该构建处理单一任务的小型服务。服务应根据系统的可靠性预期使用 TCP 或 UDP 进行通信。因此,确保基于微服务的系统能够可靠且低延迟地进行通信就变得至关重要。

Google Cloud 通过提供全球网络来实现可靠性和低延迟,这意味着您的应用用户也可以在全球布局。拥有全球网络意味着您可以创建跨区域和可用区的 Virtual Private Cloud (VPC) 网络。应用可以跨区域和地区相互连接,甚至都无需离开 Google Cloud 网络。

针对传统数据中心环境编写的应用在迁移到混合云环境后可能会变得性能缓慢。混合云环境是指一些应用组件在企业数据中心运行,而其他组件在云端运行。性能缓慢可能是许多因素造成的。本文重点讨论往返延迟,以及延迟如何影响在网络各部分移动大量数据的应用中的 TCP 性能。

问题:延迟和 TCP 行为

TCP 使用窗口机制来防止快速发送方超越慢速接收方。接收方通告发送方在必须等待来自接收方的窗口更新之前,应发送多少数据。因此,在接收方应用无法通过连接收到数据时,可排队等待应用的数据量是有一定限制的。

TCP 窗口使得发送方和接收方系统上的内存能得到更高效的利用。当接收方应用处理数据时,将向发送方发送窗口更新。窗口更新最快可在一次往返之内发生,从而得出以下公式,这是 TCP 连接的批量传输性能受到的限制之一:

吞吐量 <= 窗口大小/往返时间 (RTT) 延迟

在 TCP 的原始设计中,此窗口的大小上限为 65535 字节 (64 KiB - 1)。这是发送方在收到允许发送更多数据的窗口更新之前,可以发送的最大数据量。

TCP 自引入以来发生的改变

TCP 自引入以来,一些关键功能已经改变:

  • 典型的网络速度增加了四个数量级。
  • 系统中的典型内存增加了四个数量级。

第一项改变的结果是原始 TCP 窗口大小导致网络资源的使用效率低下。发送方会在网络条件下以尽可能最快的速度发送一个窗口的数据,然后在等待 TCP 窗口更新期间闲置相当长的时间。第二项改变的结果是发送方和接收方可以使用更多的内存进行联网,以解决第一项改变所暴露的限制。

下图说明了这种改变。

发送方无法充分利用网络,因为它需要等待 TCP 窗口更新才能发送更多数据。

一次发送更多数据

解决方案是一次发送更多数据。随着网络带宽的增加,更多数据可以容纳到管道(网络)中,并且随着管道变得越来越长,确认收到数据需要更长的时间。这种关系称为带宽时延乘积 (BDP)。该值的计算方法是,用带宽乘以往返时间 (RTT),得到的值就代表为填满管道应发送的最佳位数。公式如下:

BDP(位)= 带宽(位/秒)* RTT(秒)

计算得出的 BDP 用作优化建议的 TCP 窗口大小。

例如,假设您有一个 10 Gbps 的网络,RTT 为 30 毫秒。对于窗口大小,请使用原始 TCP 窗口大小的值(65535 字节)。该值远不能充分利用带宽能力。此链接上可能的最大 TCP 性能如下:

(65535 字节 * 8 位/字节)= 带宽 * 0.030 秒
带宽 =(65535 字节 * 8 位/字节)/0.030 秒
带宽 = 524280 位/0.030 秒
带宽 = 17476000 位/秒

换句话说,这些值产生的吞吐量略超过每秒 17 Mbit,这仅发挥了 10 Gbps 网络的一小部分能力。

解决方案:TCP 窗口大小缩放

为了解决 TCP 窗口大小的原始设计所施加的性能限制,我们引入了 TCP 协议的扩展,允许将窗口大小扩张到更大的值。窗口缩放支持将窗口扩大到最多 1,073,725,440 字节(接近 1 GiB)。RFC 7323 中的 TCP 窗口缩放选项部分简要介绍了此功能。

窗口缩放扩展将 TCP 窗口的定义扩展为使用 30 位,然后使用隐式缩放比例在 TCP 标头的 16 位窗口字段中包含此 30 位值。要查看是否在基于 Linux 的系统上启用了该功能,请使用以下命令:

sudo sysctl net.ipv4.tcp_window_scaling

默认情况下,所有 Google Cloud Linux 虚拟机都已启用此功能。返回值 1 表示该选项已启用。如果该功能被停用,则可以使用以下命令进行启用:

sudo sysctl -w net.ipv4.tcp_window_scaling=1

具有更大窗口大小的吞吐量

您可以使用前面的示例来演示窗口缩放的好处。如前所述,假设一个具有 30 毫秒延迟的 10 Gbps 网络,然后使用以下公式计算新的窗口大小:

(链接速度 * 延迟)/8 位 = 窗口大小

如果代入示例数字,会得到:

(10 Gbps * 30 毫秒/1000 秒)/8位/字节 = 窗口大小
(10000 Mbps * 0.030 秒)/8 位/字节 = 37.5 MB

将 TCP 窗口大小增加到 37 MB 可以将 TCP 批量传输性能的理论限制提高到接近网络性能上限的值。当然,许多其他因素也可能会限制性能,包括系统开销、平均数据包大小以及共享链接的其他流的数量,但正如您所看到的,该窗口大小可以显著减轻先前受限窗口大小所施加的限制。

设置 Linux 可调参数以更改 TCP 窗口大小

在 Linux 中,TCP 窗口大小受以下 sysctl(8) 可调参数的影响:

net.core.rmem_max
net.core.wmem_max
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem

前两个可调参数会影响尝试直接控制 TCP 窗口大小的应用的最大 TCP 窗口大小,方法是将应用的请求限制为不超过这些值。后两个可调参数会影响允许 Linux 自动调整运行的应用的 TCP 窗口大小。

最佳窗口大小值取决于您的具体情况,但您可以从希望系统发送数据的一条或多条路径的最大 BDP(带宽时延乘积)着手。在这种情况下,可使用以下步骤设置可调参数:

  1. 确保您具有 root 权限。
  2. 获取当前缓冲区设置。保存这些设置以备您想要回滚这些更改。

    sudo sysctl -a | grep mem
    
  3. 将环境变量设置为要使用的新 TCP 窗口大小:

    MaxExpectedPathBDP=8388608
    
  4. 为所有类型的连接设置最大 OS 接收缓冲区大小:

    sudo sysctl -w net.core.rmem_max=$MaxExpectedPathBDP
    
  5. 为所有类型的连接设置最大 OS 发送缓冲区大小:

    sudo sysctl -w net.core.wmem_max=$MaxExpectedPathBDP
    
  6. 设置 TCP 接收内存缓冲区 (tcp_rmem):

    sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 $MaxExpectedPathBDP"
    

    tcp_rmem 设置使用三个值:

    • 可以为 TCP 套接字分配的最小接收缓冲区大小。在此示例中,该值为 4096 字节。
    • 默认接收缓冲区大小,它还会替换其他协议使用的 /proc/sys/net/core/rmem_default 值。在该示例中,值为 87380 字节。
    • 可以为 TCP 套接字分配的最大接收缓冲区大小。在该示例中,该值设置为您之前设置的值(8388608 字节).
  7. 设置 TCP 发送内存缓冲区 (tcp_wmem):

    sudo sysctl -w net.ipv4.tcp_wmem="4096 16384 $MaxExpectedPathBDP"
    

    tcp_wmem 设置使用三个值:

    • 可用于单个 TCP 套接字的最小 TCP 发送缓冲区空间。
    • 单个 TCP 套接字允许的默认缓冲区空间。
    • 最大 TCP 发送缓冲区空间。
  8. 设置可调参数,以便后续连接使用您指定的值:

    sudo sysctl -w net.ipv4.route.flush=1
    

要使这些设置能够在重新启动后保留,请将先前设置的命令附加到 /etc/sysctl.conf 文件中:

sudo bash -c 'cat << EOF >> /etc/sysctl.conf
net.core.rmem_max=8388608
net.core.wmem_max=8388608
net.ipv4.tcp_rmem=4096 87380 8388608
net.ipv4.tcp_wmem=4096 16384 8388608
net.ipv4.route.flush=1
EOF'

使用更新的窗口大小测试 RTT

当 TCP 窗口足够大,可以充分利用 BDP 时,局面就会发生变化,如下图所示:

TCP 窗口大小始终可以根据所涉及的过程可用的资源和使用的 TCP 算法进行调整。如图所示,窗口缩放功能使连接远远超出原始 TCP 规范中定义的 65 KiB 的窗口大小。

您可以自己测试一下。首先,确保您已通过在本地机器和远程机器上设置可调参数,更改了两个机器的 TCP 窗口大小。然后运行以下命令:

dd if=/dev/urandom of=sample.txt bs=1M count=1024 iflag=fullblock
scp sample.txt your_username@remotehost.com:/some/remote/directory

第一个命令创建一个包含随机数据的 1 GB sample.txt 文件。第二个命令将该文件从本地机器复制到远程机器。

请注意控制台上的 scp 命令输出,其中显示的带宽单位为 Kbps。您应该看到 TCP 窗口大小更改之前和之后的结果相差甚远。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】dismiss多级的方法

前言 上次笔者总结过push和pop推入和推出界面的方法&#xff0c;这里对于dismiss多级的方法进行一个总结&#xff0c;推入推出方法可以看看笔者这篇博客&#xff1a;【iOS】UI学习——界面切换 dismiss推出多级的原理 当我们使用pop推入新的界面的时候&#xff0c;连续pop推…

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef 1. AOSPXRef1.1. http://aospxref.com/android-14.0.0_r2/1.2. build/envsetup.sh 2. AndroidXRef2.1. http://androidxref.com/9.0.0_r3/2.2. build/envsetup.sh 3. HELLO AndroidReferences 1. AOSPXRef http://aospx…

YOLOv5/v8 + 双目相机测距

yolov5/v8双目相机测距的代码&#xff0c;需要相机标定 可以训练自己的模型并检测测距&#xff0c;都是python代码 已多次实验&#xff0c;代码无报错。 非常适合做类似的双目课题&#xff01; 相机用的是汇博视捷的双目相机&#xff0c;具体型号见下图。 用的yolov5是6.1版本的…

QT --- 初识QT

一、通过代码构建helloworld界面 一般通过代码来构造界面的时候&#xff0c;通常会把构造界面的代码放到Widget/MainWindow的构造函数中。 Qt中每个类都有对应同名的头文件 上古时期&#xff0c;Qt用的是这种风格的文件。1998年之后&#xff0c;C标准成立了&#xff0c;C98标准…

jenkins入门

CI 、CD入门 一:jenkins实现CI操作 1.在jenkins环境安装jdk 、maven ,同事修改maven里的settings.xml中的两个配置:添加jdk插件版本并开启和私服镜像(也可以在jenkins页面的全局配置选择自动安装,但是自动安装速度很慢,所以这里选择手动安装,后面直接在全局配置指定目…

太阳下山还有月光,月亮睡了还有朝阳

最近听到一首歌《GooGoo-不要慌太阳下山有月光》&#xff0c;觉得里面的歌词很有意思&#xff0c;这也是标题的由来。截取歌词片段&#xff1a; 不要迷茫 不要慌张 太阳下山 还有月光 它会把人生路照亮 陪你到想去的地方 不要彷徨 不要沮丧 月亮睡了 还有朝阳 抬头看天一定会亮…

如何正确使用MMPI量表进行测试?

1、需要初中以上学历&#xff0c;能对测试题准确的理解。 2、应在安静、无干扰的环境中进行&#xff0c;确保自己能够集中注意力完成测试。 3、尽量不要选择“无法回答”这个选项&#xff0c;当然如果确实有无法回答的&#xff0c;也可以选&#xff0c;但是总数不要超过22个。…

Python计算机视觉 第9章-图像分割

Python计算机视觉 第9章-图像分割 图像分割是将一幅图像分割成有意义区域的过程。区域可以是图像的前景与背景或图像中一些单独的对象。这些区域可以利用一些诸如颜色、边界或近邻相似性等特征进行构建。 9.1 图割&#xff08;Graph Cut&#xff09; 图割&#xff08;Graph…

一步一步自制py脚本并且并且修改为exe可执行文件教学外附带SHA-1解密exe文件资源

第一步&#xff1a;安装 Python 下载 Python&#xff1a;访问 Python 官网 下载并安装最新版本的 Python。安装时选择添加到环境变量 PATH&#xff1a;在安装过程中&#xff0c;确保勾选“Add Python to PATH”选项。 第二步&#xff1a;编写 Python 脚本 创建一个新的 Pyth…

基于BiGRU+Attention实现风力涡轮机发电量多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

参赛心得和思路分享:2021第二届云原生编程挑战赛2: 实现一个柔性集群调度机制

关联比赛: 2021第二届云原生编程挑战赛2&#xff1a;实现一个柔性集群调度机制 参赛心得 历时快两个月的第二届云原生编程挑战赛结束了&#xff0c;作为第一次参赛的萌新&#xff0c;拿下了28名的成绩&#xff0c;与第一名差了19万分&#xff0c;因为赛制时间太长&#xff0c…

基于python+django+vue的社区爱心养老管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的社…

103.WEB渗透测试-信息收集-FOFA语法(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;102.WEB渗透测试-信息收集-FOFA语法&#xff08;2&#xff09; FOFA使用实例 组件框架 …

eureka.client.service-url.defaultZone的坑

错误的配置 eureka: client: service-url: default-zone: http://192.168.100.10:8080/eureka正确的配置 eureka: client: service-url: defaultZone: http://192.168.100.10:8080/eureka根据错误日志堆栈打断电调试 出现两个key&#xff0c;也就是defaultZone不支持snake-c…

cmd命令

常用命令 查看电脑名称&#xff1a; hostname 查看网卡信息&#xff1a; ipconfig 快速打开网络设置界面&#xff1a; control.exe netconnections 或 rundll32.exe shell32.dll,Control_RunDLL ncpa.cpld 打开防火墙设置&#xff1a; wf.msc 指定网卡设置IP地址&#…

Vue:使用v-model绑定的textarea在光标处插入指定文本

一、问题描述 使用v-model绑定的textarea如果需要改变其内容&#xff0c;一般只要改变v-model对应的变量即可&#xff0c;但如果需要在textarea的当前光标位置插入指定文本&#xff0c;那就需要操作DOM了。于是我们写了一段js&#xff1a; const insertTextAtCursor (text) …

基于TCP发送北斗消息给船舶设备终端

文章目录 引言I 自定义动态数据交换协议信息交换接口通信格式消息发送指令状态码错误信息返回指令II Netty实现TCP客户端III Java 原始API实现TCP客户端知识扩展: 基于Netty的定位数据平台通信协议定位方式移动定位设备see also引言 需求:发送北斗消息给船舶设备终端 动态信…

windows安装docker、elasticsearch、kibana、cerebro、logstash

文章目录 1. 安装docker1.1. 两大要点1.1.1. 安装启用hyper-v电脑不存在hyper-v的情况 1.1.2. 下载安装docker 2. 在docker里面安装elasticSearch&#xff0c;kibana&#xff0c;cerebro3. 安装logstash-将数据导入到elasticSearch3.1 安装logstash3.1.1 注意事项3.1.1.1. 等了…

【VSCode】VSCode Background 背景插件辅助窗口程序

前排贴上Github项目链接 GitHub窗口项目链接 这是一个基于VSCode上由shalldie上传的background扩展制作的windows窗口程序。 该程序旨在通过窗口程序尽可能的完善该扩展原有的功能。 background - shalldie 的最大优势是我目前仅在其扩展上发现了UseFront的选项&#xff0c;这…

从汇编语言到高级语言:人类计算机科学的伟大探索

从20世纪中叶第一台电子计算机的诞生&#xff0c;到如今的智能设备遍布全球&#xff0c;计算机科学的发展历程是一部充满着人类探索精神的伟大史诗。计算机语言作为人类与机器交流的桥梁&#xff0c;见证并推动了这一切。从最早的汇编语言到如今多样的高级语言&#xff0c;我们…