说说过量 tcp pure ack 的利弊

tcp 的 ack 实在太多了,如果互联网上 80% 报文是 tcp,那么其中 1/3 的报文都是 ack,此前写过几篇短文,比如 丢弃一些 pure ack 和 注入或利用 pure ack。

简单说,tcp 依靠 ack 提供 self-clock,发送 data 越多,ack 越多,如果 ack 与 data 不同步,将出现各种问题,详见 rfc2525-Stretch ACK violation。

正如哥斯拉将会压垮自身一样,tcp 的 pure ack 也会随着带宽进一步提高对系统带来越来越大的重负。pure ack 是小包,与 data 数量线性同步的 pure ack 对系统带来不对称的压力,系统最怕高频小包。

典型的三种场景不得不防,pure ack 在 sender/receiver 端与 data 竞争 cpu,pure ack 在 wifi 等 csma 网络与同流 data 竞争信道,pure ack 在交换节点与 data 竞争 buffer 和带宽。无论哪一种问题,都因摩尔定律落后于带宽发展而日趋严重。

在端侧,pure ack 的每次处理需要一次 cpu 中断,而定期轮询将损害 delivery rate 计算并降低灵敏度;在 wifi,每个反向 pure ack 都要和正向 data 竞争时隙,以 2:1 为例将侵占系统 1/3 的带宽资源;在交换节点,大量资源用于管理大量 pure ack,对 data 照顾不周将加剧拥塞。

固定资源的系统,tcp 最终吞吐将被自身 ack 限制在固定比例,ack 损耗随处理器和带宽的不对称发展趋向增加。
lro,wifi frame-aggregation 等治标不治本的技术来掩盖问题也不知是福是祸,很少有人能认识上述三个场景的问题,甚至很少有人意识到它们存在。

tcp 在 100Gbps+ 的理论吞吐有一半,另一半资源用来处理 pure ack 了,允许 tso/lro/ack-aggregation/big-tcp 再挤出些带宽,勉强到 70% 甚至 90%,但挤牙膏皮显然毫无意义,就看 1.6Tbps 网络中 tcp 如何应对。问题在 tcp self-clock 对 ack 太过依赖。

问题的意义在于新协议而不是如何改进 tcp。你会将 tcp 某特征抄进新协议吗?教科书里教的都是这特征解决了什么问题,而只字不提它是哪些问题的所在。因此我们看到一个又一个的 yet another tcp。

同样基于 tcp ack 太多的问题,果真百害无一利吗?

tcp ack 实在太多,但并非没用,正如 self-clock 顾名思义,流量由 ack 触发。在如 clos/spine-leaf 这种规整且局域对称的拓扑下,路径也对称,交换机可分析 ack 提前预期大流量,对反向的 ack 整形即可对未来流量整形,从而提前避免拥塞。这比等大流量真正到了再反压或者丢包要好太多。

对于 tcp 长连接,上述方法可以捕捉源自同一 receiver 但目标却是不同 sender 的大量 pure ack 从而预期一次潜在的 incast,对这些扇出的 pure ack 进行 pacing 整形,就可消除未来的扇入 incast,是不是很有趣。

这思路适用于一切规则拓扑下的传输协议用来消除 incast,规则拓扑下,交换机可分析途径的 request 而提前预知 response 流量特征,在获知将来潜在拥塞后,交换机可对这些 request 整形,间接控制 response 流量。

看起来像是在利用 pure ack,实际是在利用规则拓扑,规则拓扑中,交换机比端对流量具有更全局且精确的预期,得益于交换机知道流量源自哪里去往哪里。在同一尺度的网络中,规则相通,问题也相通。在广域网中,分布式特征更倾向于端到端控制,因为传播时延太大,拓扑不对称,交换机它算不准。

周末的文章 incast,拥塞控制,内存墙的秘密 我的一个回复 “数据中心服务器扇出每个 request 都携带唯一的 expired id,这个id 在请求端生成,每个 id 均唯一,该 id 表示一个时间戳,指示在发送 response 前等待多久…”,expired id 只为放大波动,每台服务器都受负载随机波动而波动,将这个波动放大到交换机带宽的粒度,incast 随之消失。这事实在广域网能得到印证,广域网没有 incast,原因就是多级链路,长距离放大了波动,从而消除了全局同步。随机修剪光纤长度就是想在数据中心人为放大随机波动。

回到 pure ack 过多问题,如果数据中心可利用 pure ack 度量或预测潜在流量特征是因为网络足够规则,那么在广域网,1:2 的 data/ack 比例则没必要,广域网波动性被放大而损害的预测精度损失不会随样本增加而缓解,按照大数定律,样本增加只能更精确测量波动本身,而波动是滞后的,拥塞控制要做的是在更粗粒度感知波动而不是精确测量波动。

以我的从业经验,细粒度度量和粗粒度度量相比,对于预测未来链路画像,并不能更精确。用历史预测未来更多的是经验走势,而它本就是粗粒度的。

足球场的面积,腿脚的灵活性决定了球门的大小,同时也约束了上场人数,因为人数不能改变每一个次射门的进球概率,人数过少或过多都将降低观赏性。这是尺度决定的,相反,将桌球打进直径 10cm 的洞却是每一个桌球玩家的基本要求。

tcp 说旧不旧,quic 几乎就是 yet another tcp,但 tcp 确实很旧,当我们要优化 tcp 或迭代一个新协议时,不能被表面现象牵着鼻子走,一定要回到 1970 年代彼时彼刻的现实,你会发现 tcp 几乎一切的设计都出自四个字,简单能用。所以也就没有那么多为什么和好不好了。tcp 后来的问题并不影响它的可用性,可如今人们几乎把高性能 tcp 玩成了烟花特效,但当人们真去设计一个试图取代 tcp 的新协议时,却把那些导致低性能的特性也一并抄了去,结果新协议也只是可用,并不简单,在它针对的范围外也不高效。

浙江温州皮鞋湿,下雨进水不会胖。

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

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

相关文章

ARM异常模型

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 — 适合小白入门【目录】ARMv8/ARMv9架构高级进阶-[目录]👈👈👈 — 高级进阶、小白勿买【加群】ARM/TEE…

Docker和Kubernetes:区别与优势对比

在现代软件开发和部署中,Docker和Kubernetes是两个备受关注的技术。本文将对Docker和Kubernetes进行比较,探讨它们的区别和各自的优势。 引言 在过去的几年中,容器技术得到了迅速的发展,并且在现代软件交付和部署中扮演着越来越重…

LVS-DR实验

实验前准备 DR服务器:192.168.188.11 192.168.188.15 NFS服务器:192.168.188.14 Web服务器1:192.168.188.12 Web服务器2:192.168.188.13 Vip:192.168.188.188 客户端:192.168.188.200 配置负载均衡调度…

leetCode 77.组合 + 回溯算法 (bactracking) + 剪枝 + 图解 + 笔记

77. 组合 - 力扣(LeetCode) 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] …

Unity EventSystem的一些理解和使用

Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一,可以用于捕捉和分发各种事件,例如点击、拖拽、按键、射线等。 常用的属性和方法有以下这些: 属性: current: 获取当前的EventSystem实例。…

HuggingFace学习笔记--datasets的使用

目录 1--datasets的使用 1-1--加载数据集 1-2--查看数据集 1-3--打乱和排序数据集 1-4--选择和筛选数据集 1-5--划分数据集 1-6--修改数据集 1-7--导出数据集 1--datasets的使用 1-1--加载数据集 代码: from datasets import load_dataset, load_from_di…

C#中的TaskFactory

在C#中,TaskFactory是一个用于创建异步任务的类。它提供了一种方便的方式来创建Task对象,这些对象表示可以异步执行的操作。TaskFactory类位于System.Threading.Tasks命名空间下。 要使用TaskFactory,您需要导入相应的命名空间: …

uni-app+vue3 封装全局函数(详细完整的方法)

在uni-app和vue3中,我们可以封装全局函数来复用代码。以下是详细的步骤: 首先,我们需要在main.js文件中引入我们封装的全局函数。这样我们就可以在整个项目中使用这些函数。 import globalFunctions from ./globalFunctionsVue.prototype.$g…

Vue简易的车牌输入键盘,可以根据需要修改

效果图如下&#xff1a; 代码如下&#xff1a; <template><div><div class"carNoBoxInput"><div style"padding: 6px;border: 2px solid #fff;border-radius: 6px;margin: 6px 3px 6px 6px;"><input class"inputBox"…

小航助学题库蓝桥杯题库stem选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

利用ambari搭建Hbase高可用

初始环境&#xff1a; 节点名称服务名ambari-hadoop1ambari-hadoop2region serverambari-hadoop3hmater、 region server 计划为ambari-hadoop1添加hmaster&#xff0c;以避免hmaster的单点故障、 step1&#xff1a;添加备用Hmaster step2&#xff1a;选择ambari-hadoop1作为…

【一周AI简讯】OpenAI奥特曼王者归来,马斯克AI模型Grok下周开放测试,ChatGPT语音对话功能向所有用户免费开放

OpenAI奥特曼王者归来&#xff0c;董事会改组 终于&#xff0c;经历大约5天的极限拉扯&#xff0c;年底AI界吃瓜大戏落下帷幕&#xff0c;奥特曼确认回归。 ChatGPT语音对话功能向所有用户免费开放 ChatGPT 语音输入最初于 9 月份推出&#xff0c;标题是“ChatGPT 现在可以看…

尚硅谷大数据项目《在线教育之实时数仓》笔记008

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第10章 数仓开发之DWS层 P066 P067 P068 P069 P070 P071 P072 P073 P074 P075 P076 P077 P078 P079 P080 P081 P082 第10章 数仓开发之DWS层 P066 第10章 数仓开发之DW…

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一&#xff08;暴力求解&#xff09;代码实现&#xff1a; 思路二&#xff08;数列的思想&#xff09;代码实现&#xff1a; 思路三&#xff08;异或的运用&#xff09;代码实现&#xff1a; 二、轮转数组 思路一&#xff08;暴力求解&#xff09…

Vue3 + Scss 实现主题切换效果

Vue3 Scss 实现主题切换效果 先给大家看一下主题切换的效果&#xff1a; 像这样的效果实现起来并不难&#xff0c;只是比较麻烦&#xff0c;目前我知道的有两种方式可以实现&#xff0c;分别是 CSS 变量、样式文件切换&#xff0c;下面是该效果的核心实现方法 CSS变量 给…

电脑如何定时关机?

电脑如何定时关机&#xff1f;我承认自己是个相当粗心的人&#xff0c;尤其是在急于离开时经常会忘记关闭电脑&#xff0c;结果就是电量耗尽&#xff0c;导致电脑自动关机。而且&#xff0c;在我使用电脑的时候&#xff0c;经常需要进行软件下载、更新等任务。如果我一直坐等任…

设计模式—迪米特原则(LOD)

1.背景 1987年秋天由美国Northeastern University的Ian Holland提出&#xff0c;被UML的创始者之一Booch等普及。后来&#xff0c;因为在经典著作《 The Pragmatic Programmer》而广为人知。 2.概念 迪米特法则&#xff08;Law of Demeter&#xff09;又叫作最少知识原则&…

c语言,输入整数n(行数,本例为4),按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16

c语言&#xff0c;输入整数n(行数&#xff0c;本例为4&#xff09;&#xff0c;按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 以下是使用C语言编写的程序&#xff0c;根据输入的行数打印数字图片的规则&#xff1a; #include <stdio.h>int main() …

【LeeCode】59.螺旋矩阵II

给定一个正整数 n&#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 解&#xff1a; class Solution {public int[][] generateMatrix(int n) {int[][] ar…

Mysql编写过程和解析过程顺序刨析

我们在平时的编写sql语句当中&#xff0c;编写顺序都是知道&#xff0c;先select …… from …… join……where 等等 &#xff0c;那么它的解析过程顺序是什么样的呢&#xff1f;先说一下mysql解析顺序大致为&#xff1a; FROM 子句的解析&#xff1a; 解析 FROM 子句时&…