优化 TCP 以提高网络性能

news2024/11/25 0:57:33

本页面简要介绍了计算正确设置的方法,以缩短 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.coloradmin.cn/o/2125214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open CASCADE学习|通过指定点的曲线

在OpenCASCADE中&#xff0c;如果你想通过一系列指定的点来创建一条曲线&#xff0c;你可以使用Geom2dAPI_Interpolate类来实现二维曲线的插值&#xff0c;或者使用GeomAPI_Interpolate类来实现三维曲线的插值。这些类允许你定义一条B样条曲线&#xff0c;这条曲线将精确地通过…

内网安全:反弹shell

目录 一.Netcat反弹Shell 二.PowerCat反弹Shell PowerCat和nc正向连接 PowerCat和nc反向连接 PowerCat和PowerCat反向连接 三.Bash反弹shell 四.Python 反弹Shell 一.Netcat反弹Shell 在Windows容易被杀 介绍&#xff1a; Netcat简称NC,是一个简单、可靠的网络工具,被…

0V企业级别通配符证书

OV企业级别通配符证书&#xff0c;支持顶级域名下面的所有二级子域名&#xff0c;不限制二级子域名个数&#xff0c;证书显示单位实名名称。 加密算法支持2048bits&#xff1b;签名算法支持SHA256withRSA。 可提供各种服务器的证书文件安装格式。 加密支持协议&#xff1a;T…

微信如何转发群消息给其他群或其他好友?

使用微加机器人将群消息转发到其他群或好友 工具选择&#xff1a; 近期想做一个从某个微信群将消息自动转发到另一个微信群的效果&#xff08;一些课程群和线报群只有付费才能进&#xff09; 试了市面上很多免费的转发软件&#xff0c;发现免费还是很难有好东西&#xff0c;…

Nature Communications 可远程操控食欲的口服软体机器人

肥胖对人群的的影响是深远的&#xff0c;它不仅关系到个人的健康&#xff0c;还与全球公共卫生挑战密切相关。据世界卫生组织的数据&#xff0c;全球每8人中就有1人患有肥胖症。肥胖增加了患2型糖尿病、心血管疾病、某些癌症等多种健康问题的风险&#xff0c;并对社会经济产生重…

公开课 | 金九银十,测试开发面试秘籍大公开!

随着金九银十的求职旺季悄然来临&#xff0c;你是否已经摩拳擦掌&#xff0c;准备在职场上大展拳脚了呢&#xff1f;但面对激烈的竞争和复杂的面试环节&#xff0c;你是否也曾感到过迷茫和不安&#xff1f;别担心&#xff0c;我们懂你&#xff01; 本周四&#xff0c;我们特别…

Oracle与AWS和解! Oracle市场破历史新高 4350亿美金

数据库去o风风火火&#xff0c;然而似乎对甲骨文来讲并没有丝毫影响。很多人曾经都在嘲笑Oracle在云上发力的太晚太晚&#xff0c;错过了公有云的历史发展机遇。 今天看到群里有人分享一个消息说甲骨文老板想通了&#xff0c;跟三大云厂商合作了&#xff0c;看来是真的。 我们…

通过XMLHttpRequest和window.open在浏览器中打开文件流pdf以及下载pdf

1、浏览器预览pdf&#xff1a; 首先通过接口获取文件流数据 下发是源码 var xhr new XMLHttpRequest(); xhr.open("GET", http://www.baidut.com/downloadFile); xhr.responseType "blob"; xhr.onload function(){ if(this.status 200){ var blob…

全视通医院智慧后勤全场景管理+一体化解决方案,让医院管理提质增效

在 “十四五” 时期&#xff0c;公立智慧医院建设正如火如荼地进行着。2021年&#xff0c;国家卫生健康委医政医管局发布《医院智慧管理分级评估标准体系&#xff08;试行&#xff09;》&#xff0c;从政策层面给出了推进面向医务人员的“智慧医疗”、面向患者的“智慧服务”、…

Cadenza 项目:机器学习如何改善听力受损人士的音乐聆听体验

音乐&#xff0c;作为全人类共享的文化瑰宝&#xff0c;具有强大的凝聚力&#xff0c;它不仅塑造了我们的社会风貌&#xff0c;更为我们的身心健康带来诸多益处。然而&#xff0c;听力损失却无情地削弱了这份美妙的体验。据世界卫生组织预测&#xff0c;到2050年&#xff0c;全…

大模型技术场景与商业应用(2024):赋能千行百业产业链升级

大模型技术场景与商业应用&#xff08;2024&#xff09;&#xff1a;赋能千行百业产业链升级 引言 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已成为推动各行业数字化转型的关键驱动力。从2023年的ChatGPT大模型爆火至…

低代码平台与统一待办:提升工作效率的新趋势

什么是低代码平台&#xff1f; 低代码平台是一种允许用户通过图形化界面和简单的拖放操作创建应用程序的开发工具。它极大地简化了应用程序的开发过程&#xff0c;使得非技术背景的用户也能够参与到应用开发中来。低代码平台通常包括预建的组件、模板和集成功能&#xff0c;大…

【论文阅读】视觉分割新SOTA: Segment Anything(SAM)

导言 随着基于对比文本—图像对的预训练&#xff08;CLIP&#xff09;方法或者模型、聊天生成预训练转换器&#xff08;ChatGPT&#xff09;、生成预训练转换器-4&#xff08;GPT-4&#xff09;等基础大模型的出现&#xff0c;通用人工智能&#xff08; AGI&#xff09;的研究…

web项目如何部署到服务器上呢?——麻烦的方法

只需关注web项目如何部署到服务器上&#xff0c;因为服务器运行时就可以访问web项目了。 一、麻烦的方法 1、首先启动服务器 &#xff08;1&#xff09;找到bin文件夹 &#xff08;2&#xff09;双击运行startup.bat文件 &#xff08;3&#xff09;运行之后的界面如下&#…

MongoDB日志级别

日志 查看当前的日志级别 根据你提供的 MongoDB 命令结果&#xff0c;命令 db.adminCommand({ getParameter: "logComponentVerbosity" }) 返回了 "ok" : 0&#xff0c;这意味着命令执行失败&#xff0c;没有成功获取到日志级别的配置信息。错误信息 &quo…

simulink基础-代码生成

模型相关设置 求解器设置 求解器选择设置为&#xff1a;定步长 离散 求解器详细设置为&#xff1a;0.01 (task1s&#xff0c;需要计数器100次) 保证仿真结果&#xff0c;在代码中无体现 代码生成设置 系统目标文件 grt.tlc 用于HIL或RCP 无法进行精确的调度要求 嵌入式选择…

深入理解TCP三次握手

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一个可靠的、面向连接的协议&#xff0c;它保证了数据包的顺序和完整性。为了建立一个稳定的连接&#xff0c;TCP 使用了一个被称为 三次握手&#xff08;Three-W…

[项目实战]EOS多节点部署

文章总览&#xff1a;YuanDaiMa2048博客文章总览 EOS多节点部署 &#xff08;一&#xff09;环境设计&#xff08;二&#xff09;节点配置&#xff08;三&#xff09;区块信息同步&#xff08;四&#xff09;启动节点并验证同步EOS单节点的环境如何配置 &#xff08;一&#xf…

828华为云征文|华为云Flexus X搭建借贷管理系统、二次开发借贷小程序 前端源码uniapp

在华为云828 B2B企业节的盛宴中&#xff0c;Flexus X实例以其卓越的算力性能和灵活的资源配置脱颖而出。对于追求极致性能、渴望在借贷管理、电商交易等场景中脱颖而出的您来说&#xff0c;Flexus X无疑是最佳拍档。搭载创新加速引擎&#xff0c;让您的自建MySQL、Redis、Nginx…

MYTHOLOGICAL CREATURES PACK

这个包收集了5种神话生物:奇美拉、狮鹫、哈比、螳螂和狼人。型号注定是高端设备。支持PBR和LEGACY着色器。高分辨率4096*4096纹理,根运动动画以及到位。 下载:​​Unity资源商店链接资源下载链接 效果图: