Yet another PFC(新样式 PFC)

ops/2024/12/14 21:34:38/

PFC 在依靠简单廉价兼容性而成功的以太网上弄巧成拙,但有 101 种优化它的方法,但代价是交换机越来越复杂。以太网的基因是简单廉价,这体现在以太帧的结构上,以太帧结构决定了交换机的能力上限,这是核心。核心认知不够,交换机玩出花也解决不了问题。

不光依赖交换机,而让每一个数据包都分担一些拥塞控制的责任,100 种新的流控,拥塞控制机制就出来了,本文介绍一种随意想到的另一个 PFC,这里的 P 不是 Priority 优先级的意思,而是 Path,即 Path-aware Flow Control。

本质上,它是一种 “横竖一颠倒,柳暗花明” 的方法论指导下的想法,既然端信息不够用,那就用网络信息。

为了最小化时延,数据中心传输经由交换机跳数不会太多,无论传统三层结构,还是 Spine-Leaf,VL2,几乎都是 2~3 跳可达,用 16bit 做 id 唯一标识一台交换机就 ok 的,不够就 17~18bit(不纠结),6~8 个 16bit 存一路上所有的 path 是 ok 的,一共消耗不了多少空间,反正比 TCP 少得多:
在这里插入图片描述

下图是一个解释:
在这里插入图片描述

在最短路径优先以及规则拓扑(不规则拓扑没考虑过,不代表不行)的假设下,每个交换机收到数据帧:

  • 递增 curr_index;
  • 若 path_list 的 curr_index 为空或与实际 node id 不一致,update 它为当前 node 实际 id;
  • 若处在 pause 状态,比对 path_list2 中 curr_len 开始直到 pause 帧的 path_len 是否与 pause 帧的 path_list 一致,若一致,pause,不一致,放行。

主机协议收到数据帧:

  • 保存 path_list,待有去往 sender 的数据发送时,reply path_list;

如此配合,便轻易实现了不连累无关受害流,同时交换机上也省去了复杂的 hash 运算,流分类等操作,直接一个 and 操作完事。

收益是源抑制信息以最快的速度到达 sender,代价是简单修改了协议。

这种方法实现了传输协议和网络紧耦合,这几乎是彻底提高性能的唯一正确途径,而源自 TCP/IP 的传输协议和网络解耦合的 XX over Ethernet(oE) 几乎不可能彻底提高性能,原因正在解耦实际上是一种丢失信息的行为。oE 的成功之处在于它已经足够好,而不是它超级棒。足够好的意思是,与 IB 相比时延,吞吐性能肯定要差一点,但差得不多,但在简单,兼容性,廉价方面,它却有非常大的优势。

与 oE 的 PFC 相比,Path-aware FC 没有扩展性问题,任何上层协议都可以被包装在该协议中进行传输,而 oE PFC 若要更精细地控制每一条数据流,需要支持一种新的非 TCP/IP 传输协议时,便要扩展模块增加对 hash 字段的检索和计算,比如那些没有所谓五元组的协议。

也可以把本文描述的方法看做是 yet another 标签算法。另外,还有一种 “换 hash 种子” 的算法用来支持 oE PFC 优化,后面再说吧。

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


http://www.ppmy.cn/ops/141914.html

相关文章

优化Go语言中的网络连接:设置代理超时参数

网络连接优化的重要性 在分布式系统和微服务架构中,网络请求的效率直接影响到整个系统的响应速度。合理的超时设置可以防止系统在等待网络响应时陷入无限期的阻塞,从而提高系统的吞吐量和用户体验。特别是在使用代理服务器时,由于增加了网络…

【橘子容器】如何构建一个docker镜像

你肯定打过docker镜像是吧,作为一个开发这很正常,那么你用的什么打包方式呢,这里我们来梳理几种常用的docker镜像构建方式。 ps:这里不是太讲原理,更多的是一种科普和操作。因为讲原理的东西网上已经够多了。 一、Dock…

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写

问&#xff1a; 我按在要在template中v-for循环遍历这个centrerTopdata&#xff0c;我希望自循环前面三个就可以了怎么写&#xff1f; 回答&#xff1a; 问&#xff1a; <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…

php仿199万年历程序源码的实现方法和成品黄历站展示

以下是一个简单的方案&#xff0c;包含了前端设计思路、后端逻辑和黄历计算的基本实现。 设计方案 1. 项目架构 核心文件: Calendar.php: 封装黄历计算逻辑。index.php: 入口文件&#xff0c;处理用户输入并调用黄历类。 2. 黄历类设计 (Calendar.php) 属性: date: 存储用户…

Redis篇-1--入门介绍

1、Redis概述 ‌Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;全称为远程字典服务。‌是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 Redis提供了多种数据类型的存储&#xff0c;来适应不同场景下的存储需…

【efinance一个2k星的库】

efinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库&#xff0c;回测以及量化交易的好帮手 但没有等比复权的&#xff0c;不用。 import efinance as ef ef.stock.get_quote_history(510880,fqt2)

Oracle11.2.0.4.0的版本,RAC ADG备库mrp进程出现应用日志卡主的问题

Oracle11.2.0.4.0的版本&#xff0c;RAC ADG备库mrp进程出现应用日志卡主的问题 问题原因分析: 1、查看当前mrp进程的状态&#xff0c;当前在应用日志14450 SYShddbsz2> select process,pid from V$managed_standby where process like %MRP%; PROCESS PID ---…

go开发中interface和方法接收器的使用

Go 语言中的接口和方法接收器学习 Go 中的 interface 就像是一个神奇的魔法杖&#xff0c;能让你轻松地将不同的类型拉到同一个阵营里。与其他语言的接口不同&#xff0c;Go 的接口无需显式声明“我实现了你”&#xff0c;只要你满足了接口规定的方法&#xff0c;Go 就会自动认…