| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> It‘s Time to Replace TCP in the Datacenter 读后 -> 正文阅读 |
|
[网络协议]It‘s Time to Replace TCP in the Datacenter 读后 |
从经理那了解到一个有趣的分享: It’s Time to Replace TCP in the Datacenter 以及与它相关的论文:It’s Time to Replace TCP in the Datacenter[PDF] 对 TCP in DC 的吐槽,就我这水平,大致内容和 John Ousterhout 的分享相差亦无几,看起来已是共识。基本上,TCP in DC 的问题在于:
此外,还有拥塞控制的 issues,不再评论原文。 抛开人文和历史,论文中每一个细节都能作为一个主题来优化,至少可写一篇长文。但这是加薪晋升和公众号涨粉的事,我还是喜欢讲形而上和历史。 DC 和 Internet 有什么本质不同,以至于非要一个 Replacement for TCP in the Datacenter。 微服务分布式部署,分布式的愿景是 “不同的部分完成同一件事”,两台机器保存相同的数据意味着冗余,这与分布式愿景背道而驰。只传递指令少传递数据的传输是 DC 中高尚的传输,典型的是 RPC。 多核服务器中,Core 负责计算,Mem 负责数据,无论 Core 间通信,还是 Core 和 Mem 通信,很容易理解减少甚至避免大块内存拷贝的意义,仅做计算以及 Load/Store 指令,换做 DC 网络传输,同理,流式大块数据传输即内存拷贝,趋向减少,尽可避免。 这就是 “TCP in DC 不再适合” 的根本(读一读《云原生模式-设计拥抱变化的软件》是高尚的)。因为场景与 Internet 完全不一致。 要在 DC 传输流式大块数据时,先别问如何优化传输,先问这次传输真的必要吗?为什么不能本地处理,非要传输到远端?如需分布式存储,数据落盘就应散列落盘才对,不同的设计会影响行为制定。 总之,在 DC 网络中很少需要流式大块数据传输,甚至一个 “TCP 连接” 都是转瞬即逝的。 对于短消息传输,Connless 至关重要!它亦是 “颠倒一下” 的典型案例,从而将 per-peer Connection 转换为了 per-call Connection,甚至 per-message Connection。由此,内存的消耗将仅受并发的限制。 试想,如果短消息大扇入的同时又大扇出,若保持 per-peer Connection,为保存 state 的内存占用即 O(n^2),如果 per-call Connection,state 的生命周期便和 call/message 生命周期一致了。 说下拥塞控制相关 issue。 TCP 那套拥塞控制是反馈式的,Rate-based 也好,AIMD 也好,都在一条持续的流上起作用。对于 DC 网络典型的短消息传输,尚未获取到足够的反馈信息,传输已结束,任何高尚算法的初始参数便同盲猜无异。 So? 拥塞控制的思路一定要改。 和 TCP 长流的慢启动策略相反,对短消息传输,线速突发反而更有效。DC 网卡带宽越来越大,以 25Gbps 为例,DC 内普遍 RTT 在 50us,1 个 RTT 内可发送 100 个 1500B 的报文。现实中,这已是一笔很大的数据。更普遍的场景,一则 RPC 消息在一次突发传输结束的概率非常大。 TCPer 们写了高尚的算法,非常精细地测量和使用 ACK 信息,还没等到 ACK,来不及运作,传输已结束,到头来只有一个 init cwnd 有用,DC 内有效的拥塞控制工作绝大多数时刻只是确定一个 init cwnd。 至于拥塞控制的实际实施,交换机只要支持 “越短消息越优先” 就能保证足够公平,剩下的交给 PFC,ECN,Host-AIMD。 最后,关于可靠传输,这也是循惯了 TCP 的影子后,最令人纠结的一点,连接都没了,哪里保存 Timer,哪里保存重传信息。就好像传输协议必须是 yet another TCP 一样。 早些时候我也没想通,后来从远处看就想通了。 首先,传输不一定必须可靠,应用更懂该怎么做。应用在时间阈值后没得到回复,请求别的目标可能优于死等,换句话说,传输可以失败,只要应用知道如何应对失败即可。 其次,如果应用需要传输层保证可靠,以 per-call 作为事务进行可靠传输即可。该策略亦衍生自短消息特征。每一次传输将消息数量和大小作为元数据,这很容易帮助接收端检测空洞并发起 NAK,同时,发送端在时间阈值内未收到 response 即重传。 下图展示 Homa 的做法: TCP 没有被轻易换掉的原因不是技术,而是成本。若真因为技术,TCP 早被替换好几回了,不光在 DC,在 Internet 或许也早就没了影子。问题在于,罗列对错是一回事,撼动合理的当下是另一回事。 当然,大多数程序员不屑于讨论和技术细节无关的投入产出问题,换句话说,程序员更倾向于识别正确的方案并实现,而不管值不值得。 幸运的是,人们已经认识到一辆普通的车也好于一匹更快的马,将更多资源投入 DC transport 而不是优化 TCP。相反,但凡拿着 TCP 那套可怜而受限的机制迭代优化,其行为便无异于寻找更快的马了。 信惯了 TCP,别的模型都不对。复杂性从主机加诸网卡和交换机,与 Internet 端到端原则背道而驰,会引起很多不适,但事情要从根本去问,端到端原则普遍正确吗? 端到端原则最大的收益是扩展性,这是 Internet 快速发展的核心。但 DC 相对固定,没有异构新节点频繁接入的需求,另一方面,DC 服务器属计算资源,倾向于将传输协议 Offloading 到底层和中心,保持服务器计算密度最大化。这个视角看,端到端原则岂不是罪过? 抛开场景不能谈原则。 我假设上面已经描述清楚。接下来重新审视 DC 传输。 所谓 DC 传输,将一笔数据传到不远处的对端,这笔数据分割,打包,发送,这是显而易见的做法,没有任何理由需要事先建立一个连接,让这笔数据以流的方式按序流入对端内存,说实话,TCP 才是奇怪的方式。 回到 1970年代,以那时主机的内存水平,网络带宽,基于虚电路的流式传输是一个创新之举,但现在不是,无论对 DC 而言,or Internet。
浙江温州皮鞋湿,下雨进水不会胖。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 15:28:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |