网络传输,请每次都开启 TCP_NODELAY

news2025/1/16 17:48:54

在这里插入图片描述

原文:Marc Brooker - 2024.05.09

(注:不必过于担心这个问题,大部分现代库,语言(如 Go),代理(如 Envoy),都默认设置了 TCP_NODELAY。如果遇到网络延迟问题,可再检查该套接字选项。)

我们已经不再生活在上世纪 80 年代了,谢天谢地!

在调试分布式系统的延迟问题时,我首先检查的就是 TCP_NODELAY 是否启用。不仅仅是我,我认识的每个分布式系统构建者,都曾因为启用了这个简单的套接字选项而迅速修复了延迟问题,这说明默认行为是错误的,也许整个概念都过时了。

首先,要明确我们在讨论什么。没有比 John Nagle 1984 年的 RFC896 更好的资料来源了。下面是问题陈述:

有一个与小数据包相关的特殊问题。当 TCP 用于传输源自键盘的单字符信息时,典型的结果是每传输一个字节的有效数据,就要传输 41 个字节的数据包(1 个字节的数据,40 个字节的报头)。这 4000% 的开销虽然令人讨厌,但在负载较低的网络中还是可以忍受的。

简单地说,Nagle 想要更好地摊销 TCP 报头的成本,以便从网络中获得更好的吞吐量。吞吐量最多可提高 40 倍!造成这些微小数据包的主要原因有两个:一是像 shell 这样的人机交互应用程序,人们一次只输入一个字节;二是程序的实现不佳,通过多次 write 调用向内核发送信息。Nagle 提出的解决的方案既简单又聪明:

我们已经找到了一个简单且优雅的解决方案。

这个解决方案就是,当用户发送新数据时,如果网络连接上之前传输的任何数据仍未被确认,则禁止发送新的 TCP 段。

很多人在谈到 Nagle 算法时都会提到计时器,但 RFC896 并没有使用除网络往返时间以外的任何计时器。

Nagle 的算法与延迟确认

Nagle 清晰、简洁的提案与另一个 TCP 功能交互不畅:延迟确认。延迟确认背后的理念是延迟发送对数据包的确认,至少要等到有数据要回传(例如 telnet 会话回传用户输入的内容),或者等到计时器到期。1982 年的 RFC813 似乎是第一个提出延迟确认的文件:

数据接收方在某些情况下将不发送 ACK,在这种情况下,接收方必须设置一个计时器,使 ACK 在稍后发送。不过,接收方只有在可以合理推测会有其他事件介入,从而避免定时器中断的情况下,才应该这样做。

随后,在 1989 年的 RFC1122 中,得到了进一步的正式规定。这两个特性之间的相互作用引发了一个问题:Nagle 算法会阻止发送更多数据,直到收到一个 ACK;而延迟确认则会延迟该 ACK,直到准备好一个响应。这对于保持数据包满载很有帮助,但对于延迟敏感的高并发应用就没那么好了。

这也是 Nagle 自己多次提出的观点。例如在这个 Hacker News 评论 中:

这仍然让我感到恼火。真正的问题不是防止小报文。而是 ACK 延迟和那个愚蠢的固定计时器。这两个问题大约同时出现在 TCP 中,但各自独立。在 1980 年代初,我做了小报文优化的 Nagle 算法,伯克利做了延迟确认。两者的结合非常糟糕。

作为系统建设者,这种情况应该不陌生:系统中两个合理的特性相互作用,产生了不良行为。这种相互作用正是协议设计之所以如此困难的原因之一。

Nagle 算法真的无可指责吗?

遗憾的是,问题不仅仅在于延迟确认。即使没有延迟确认和那个愚蠢的固定定时器,在分布式系统中,Nagle 算法的行为可能也不是我们想要的。单个数据中心内的 RTT 通常约为 500 微秒,同一区域内的数据中心之间为几毫秒,全球范围内则高达数百毫秒。考虑到现代服务器在几百微秒内就能完成大量工作,即使延迟一个 RTT 发送数据也不会有明显的优势。

为了更清楚地说明这一点,让我们回到 Nagle 算法背后的理由:摊销报头成本,避免单字节数据包的 40 倍开销。但现在还有人发送单字节数据包吗?大多数分布式数据库和系统都不会。部分原因是它们有更多的数据,部分原因是 TLS 等协议的额外开销,部分原因是编码和序列化开销。但最主要的是,它们有更多的内容和数据。

不发送微小信息的核心问题依然存在,但我们已经非常有效地将其推向了应用层。无论 Nagle 算法如何处理,一次发送一个用 JSON 封装的字节都不会非常高效。

还需要 Nagle 算法吗?

首先,没有争议的观点是:如果你正在构建一个对延迟敏感的分布式系统,并在现代数据中心级别的硬件上运行,那么请放心启用 TCP_NODELAY(禁用 Nagle 算法)。你不必感到难过,这不是罪过。没关系,放手去做吧。

更有争议的是,考虑到流量和应用程序的组合,以及我们今天所拥有的硬件能力,我怀疑现代系统并不需要 Nagle 算法。换句话说,TCP_NODELAY 应该是默认设置。这将使一些“写入每个字节”的代码变得比原来更慢,但如果我们关心效率,无论如何都应该是修复这些应用。

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

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

相关文章

ubuntu编译pcl时报错

报错如下 cc1plus: warning: -Wabi wont warn about anything [-Wabi] cc1plus: note: -Wabi warns about differences from the most up-to-date ABI, which is also used by default cc1plus: note: use e.g. -Wabi11 to warn about changes from GCC 7 在网上找到了一封邮件…

深度剖析进程概念与进程状态

文章目录 1. 前言2. 什么是进程2.1 进程概念2.2 进程描述——PCB 3. 进程的一些基本操作3.1 查看进程3.2 结束进程3.3 通过系统调用获取进程标示符3.4 通过系统调用创建子进程 4. 进程状态4.1 普适的操作系统层面4.2 具体Linux操作系统层面 5. 两种特殊的进程5.1 僵尸进程5.2 孤…

2024第二届区块链、物联网与金融管理国际会议(ICBITFM2024)

2024第二届区块链、物联网与金融管理国际会议(ICBITFM2024) 会议简介 2024第二届区块链、物联网与金融管理国际会议(ICBITFM 2024)是一个重要的学术会议,旨在促进区块链、物联网和金融管理领域的交流和合作,对于推动这些领域的发展和创新具有重要意义。…

云商店如何让更多企业摘到技术普惠的“果实”?

文 | 智能相对论 作者 | 沈浪 现阶段,越是工业体系发达的地区,越需要加速技术普惠的步伐。比如,在苏州,华为云就在联合当地政府、企业伙伴打造以华为云云商店为重要链接的智能化商业增长底座。 华为云云商店以“电商式”的购物…

vue自定义权限指令

定义v-hasPermi指令 /*** v-hasPermi 操作权限处理*/import useUserStore from /store/modules/userexport default {mounted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions useUserStore().permissions&#xff…

[IMX6ULL驱动开发]-GPIO子系统和Pinctrl子系统

目录 Pinctrl子系统的概念 GPIO子系统的概念 定义自己的GPIO节点 GPIO子系统的函数 引脚号的确定 基于GPIO子系统的驱动程序 驱动程序 设备树修改 之前我们进行驱动开发的时候,对于硬件的操作是依赖于ioremap对寄存器的物理地址进行映射,以此来达…

VRRP协议-负载分担配置【分别在路由器与交换机上配置】

VRRP在路由器与交换机上的不同配置 一、使用路由器实现负载分担二、使用交换机实现负载分担一、使用路由器实现负载分担 使用R1与R2两台设备分别进行VRRP备份组 VRRP备份组1,虚拟pc1的网关地址10.1.1.254 VRRP备份组2,虚拟pc2的网关地址10.1.1.253 ①备份组1的vrid=1,vrip=…

图片压缩工具,这三款软件简单好用!

在数字化时代,图片已成为我们生活和工作中不可或缺的一部分。无论是社交媒体上的分享,还是工作中的文件传输,图片都扮演着重要的角色。然而,随着图片质量的提高,其占用的存储空间也越来越大,这给我们的存储…

ChatGPT官网5月14日凌晨1点发布会推出最新GPT4o大模型,贾维斯时刻要来了?

就在今天北京时间2024年5月14日凌晨1点中,OpenAI进行了发布会,这次发布会的内容炸裂,一起来看下吧! GPT4o多模态大模型发布 首先公开的是GPT4o多模态大模型的发布,相较于GPT-4turbo速度更快,更便宜。我刚开…

OIDC 与 OAuth2.0学习

OpenID Connect (OIDC) 和 OAuth 2.0 是两种不同的协议,它们通常一起使用,但服务于不同的目的。下面是它们的 主要区别和联系: OAuth 2.0 OAuth 2.0 是一个授权框架,它允许第三方应用代表用户获取对服务器资源的有限访问权限。…

深度践行“IaaS on DPU”理念,中科驭数正式发布“驭云”高性能云异构算力解决方案

5月10日至14日,由国家发展改革委联合国务院国资委、市场监管总局、国家知识产权局共同主办的第八届中国品牌日活动在上海世博展览馆举行。中科驭数高级副总裁张宇在中国品牌日新品首发首秀环节正式发布驭云高性能云异构算力解决方案,为企业提供更快部署、…

AWS ECS On Fargate 监控可观测最佳实践

概述 Amazon ECS on Fargate 为用户提供了简单、高效且可靠的容器化解决方案,使用户能够专注于应用程序开发和运行,而无需担心基础设施管理的复杂性。与其同时,用户需要实时了解在该环境中应用程序运行的性能、可用性、健康状况和资源使用情…

虾皮选品:Shopee首季盈利2.4亿;TikTok美区电商权限要求降低

2024年5月14号,跨境电商日报: 1.Ozon已成功回款 2.TikTok降低美区达人开通电商权限要求 3.Shopee首季盈利2.4亿 4.6月1日起,亚马逊退货处理费收取标准更新 5.欧盟委员会对从中国台湾地区和越南进口的不锈钢冷轧产品征收反补贴和反倾销税…

[Cesium]Cesium基础学习——Primitive

Cesium开发高级篇 | 01空间数据可视化之Primitive - 知乎 Primitive由两部分组成:几何体(Geometry)和外观(Appearance)。几何体定义了几何类型、位置和颜色,例如三角形、多边形、折线、点、标签等&#xf…

最佳实践 | 用HelpLook构建一体化企业知识中台

企业知识中台是内容与数据的双向交流的重要载体,它不仅能够让企业的内容说话,也能够倾听和分析数据。 你是否因寻找建立企业内部知识库/知识中台和说明文档平台的合适工具而苦恼?HelpLook数字内容平台正是你的理想之选。该平台以其简洁且用户…

一个开箱即用的已集成全部主流前端工具、类库的vue3+nuxt3服务端渲染ssr项目

项目背景: 需实现公司国际官网项目的seo如果是react就选用next,因为我最近在用vue3,就试试使用nuxt在网上找了很多模版,发现都不理想,缺的东西比较多,没法做到开箱即用,所以自己造个模版项目采…

【Java基础】枚举类的方法及应用

如何实现让一个类有固定个数的对象 手动封装构造方法(private) → 创建静态对象 → final修饰静态对象,使其成为常量 class Season { //枚举类public final static Season SPRING new Season();public final static Season SUMMER new Se…

【前端】打砖块游戏:实现细节介绍

打砖块游戏:实现细节介绍 在本文中,我将详细介绍如何使用HTML、CSS和JavaScript技术构建一个简单的打砖块游戏。我们将重点讨论游戏的三个核心技术方面:碰撞检测、画图和事件监听。 完整代码我放在:github可以直接拉取代码测试。 游戏概览 打砖块游戏中,玩家通过控制底…

如何用Rust获取本机CPU、内存在Web网页中显示?

目录 一、需求描述 二、具体操作步骤 三、知识点 1、systemstat 2、Actix 一、需求描述 需求: 1、需要使用Rust进行后端开发获取本机CPU和内存信息; 2、使用WEB框架发布API; 3、然后使用HTML/CSS/JavaScript进行前端开发&#xff0…

2024 年中国大学生程序设计竞赛全国邀请赛(郑州)暨第六届CCPC河南省大学生程序 设计竞赛Problem A. Once In My Life

//构造 #include<bits/stdc.h> using namespace std; #define int long long int a,b,c ; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a;while(a--){cin>>b>>c;int mb,k0;while(m){m/10;k;}int v0;for(int i1;i<9;…