基于PFC和ECN搭建无损RoCE网络的工作流程分析

无损RoCE网络概念

RDMA(Remote Direct Memory Access,远程直接内存访问)是一种为了解决网络传输中服务器端数据处理延迟而产生的技术。RDMA 将用户应用中的数据直接传入服务器的存储区,通过网络将数据从一个系统快速传输到远程系统的存储器中,消除了传输过程中多次数据复制和文本交换的操作,降低了 CPU 的负载。基于RDMA的RoCE技术能在以太网上部署,相比IB网络节省了很大的资源和复杂度。RoCE的协议分两个版本:

  • RoCE v1 协议:基于以太网承载 RDMA,只能部署于二层网络。
  • RoCE v2 协议:基于 UDP/IP 协议承载 RDMA,可部署于三层网络。

当前 RDMA普遍使用 RoCEv2 协议。然而,由于 RDMA 起初是基于无损的 InfiniBand 网络设计的,RoCEv2 协议缺乏完善的丢包保护机制,任意一个报文的丢失都会造成大量的重传,严重影响数据传输性能。因此,以太网交换机需要支持无损网络的部署才能支持 RoCEv2 协议及其相关应用,PFC和ECN搭建无损网络常见的技术。

PFC和ECN

PFC和ECN分别属于流量控制和拥塞控制技术,区别是:

  • 流量控制是由接收端来控制数据传输速率,防止发送端过快的发送速率引起接收方拥塞丢包
  • 拥塞控制是一个全网设备协同的过程,所有主机和网络中的转发设备均参与控制网络中的数据流量,以达到网络无丢包、低时延、高吞吐的目的,在现网中,流量控制和拥塞控制需要配合应用才能真正解决网络拥塞

PFC概念

PFC(Priority-based Flow Control基于优先级的流量控制 能够逐跳提供基于优先级的流量控制。设备在进行报文转发时,根据报文的优先级进入对应映射关系的队列中进行调度转发。当某一优先级报文发送速率超过接收速率,导致接收方可用数据缓冲空间不足时,设备通过 PFC PAUSE 帧反馈给上一跳设备,上一跳设备收到 PAUSE 帧报文后停止发送本优先级报文,直到再收到 PFC XON 帧或经过一定的老化时间后才能恢复流量发送。通过使用 PFC 功能,使得某种类型的流量拥塞不会影响其他类型流量的正常转发,从而达到同一链路上不同类型的报文互不影响。

ECN概念

ECNExplicit Congestion Notification,显示拥塞通知)设备发生拥塞时,通过对 报文 IP 头中 ECN 域的标识,由接收端向发送端发出降低发送速率的 CNPCongestion Notification Packet,拥塞通知报文),实现端到端的拥塞管理,减缓拥塞扩散恶化。ECN 定义了一种基于 IP 层及传输层的流量控制及端到端拥塞通知机制。ECN 功能利用 IP 报文头中的 DS 域来标记报文传输路径上的拥塞状态。支持该功能的终端设备可以通过报文内容判断出传输路径上发生了拥塞,从而调整报文的发送方式,避免拥塞加剧。

流量控制和拥塞控制过程

以图中拓扑为例,介绍流量控制和拥塞控制的工作过程。

如果switch2的端口2发生了拥塞时,端口1接收的报文进入到某个队列因不能及时转发,处理能力慢于接收能力,如果此时switch2的端口1未配置PFC,可能会因为队列缓存不足导致丢包,而开启了PFC功能后,端口1会发送对应的PFC pause包给上一级switch1,switch1接收到pause包之后会暂停发送报文,此时暂停的报文会存放到HeadRoom缓存中,如果网络的拥堵没有恢复,触发了缓存门限,switch1也会向上游设备发送PFC pause包,主机A收到了pause包之后,暂停报文发送,如果没有开启ECN,则队列会因缓存不足导致丢包,而开启ECN后按照拥塞控制算法,控制发包的方式,降低发送速率。通过PFC和ECN的结合保证网络不会因为丢包导致网络瘫痪。

思考

虽然PFC和ECN的结合保障不丢包,但是也因引入新的问题:

1. PFC和ECN技术结合构建无损网络会导致网络吞吐降低或时延增加,如何有效的平衡吞吐和时延需要结合业务处理,在实际应用中需要找到合适的PFC水位线

2. 在网络比较复杂的情况可能导致PFC storm问题,网络性能急剧下降,阿里为了解决此问题直接放弃PFC,从降低因丢包导致的网络性能不足的思路着手

3. PFC可能出现死锁,尽管很多厂商已支持解决死锁的问题,但是都是事后处理,无法从根本上解决此问题

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

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

相关文章

Leetcode第136场双周赛题解(c++)

题外话 也是好久没有更新力扣比赛的题解了,前段时间也是比较忙(说的好像现在不忙一样哈哈),像我等菜鸟,一般都是保二进三四不写的,笑死。 题目一.求出胜利玩家的数目 给你一个整数 n ,表示在…

MySQL·事务

目录 事务是用来做什么的? 什么是事务? 为什么会出现事务 事务提交方式 事务操作前提了解 事务常见操作方式 读未提交(RU) 读提交(RC) 可重复读(RR) 串行化 一致性(Consistency) 事务是用来做什么的? CURD不加控制,会…

Phalco安装过程以及踩的一些坑(mac环境)

一 背景 公司用Phalcon框架好长时间了,中途发现了一些Phalcon使用的上的问题,于是想在本地搭建一套Phalcon的环境,方便排查问题使用。 二 Mac系统下的安装 看了很多说法,最终发现还是官网给力,安装Phalcon使用下列命令即可(前提条件是PHP已安装好,工具pecl也安装好了):…

现代C++多线程编程:C++20 jthread全面解析

目录 一、引言 二、jthread 的基本特点和优势 自动 join 机制 线程取消功能 相对于 std::thread 的改进和便利 三、jthread 的工作原理 线程的生命周期管理 线程取消机制的实现和使用方法 四、jthread 的实际应用案例 服务器编程中的应用 高性能计算中的应用 实时系…

JVM知识总结(内存结构)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 内存模型 内存结构 堆: 存放对象实例, 几乎所有的对象…

GUI:Tkinter(一)

Tkinter文档 一,Tkinter基本流程 1. 创建应用程序主窗口对象 from tkinter import * window Tk() window.mainloop()#开启主循环 2. 在主窗口中,添加各种可视化组件,比如:按钮(Button)、文本框&#x…

[CP_AUTOSAR]_系统服务_DEM模块(三)功能规范之诊断事件定义

目录 1、诊断事件定义1.1、Event priority(事件优先级)1.2、Event occurrence(事件发生计数器)1.3、Event kind(事件类别)1.4、Event destination(故障内存)1.5、Diagnostic monitor…

springboot系列教程(三十):springboot整合Zookeeper组件,管理架构中服务协调

一、Zookeeper基础简介 1、概念简介 Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务。从设计模式角度来审视:该组件是一个基于观察者模式设计的框架,负责存储和管理数据,接受观察者的注册,一旦数据…

【数据结构】链表篇

文章目录 1.链表的概念以及结构2.链表的分类2.1 单向或者双向2.2 带头或者不带头2.3 循环或者不循环2.4 无头单向非循环链表和带头双向循环链表 3.单链表的实现3.1 准备工作3.2 节点的创建3.3 单链表的释放3.4 打印链表3.5 单链表的尾插3.6 单链表的尾删3.7 单链表头删3.8 单链…

TiDB系列之:TiCDC同步TiDB数据库数据到Kafka集群Topic

TiDB系列之:TiCDC同步TiDB数据库数据到Kafka集群Topic 一、Changefeed 概述Changefeed 状态流转操作 Changefeed 二、同步数据到Kafka创建同步任务,复制增量数据 KafkaSink URI 配置 kafka最佳实践TiCDC 使用 Kafka 的认证与授权TiCDC 集成 Kafka Connec…

搭建高可用OpenStack(Queen版)集群(一)之架构环境准备

一、搭建高可用OpenStack(Queen版)集群之架构环境准备 一、架构设计 二、初始化基础环境 1、管理节点创建密钥对(方便传输数据) 所有控制节点操作 # ssh-keygen #一路回车即可 Generating public/private rsa key pair. Enter f…

算法通关:016:设计循环双端队列

文章目录 题目思路代码运行结果问题为什么能直接调用方法名 题目 leetcode641 设计循环双端队列 思路 代码 import java.util.Deque; import java.util.LinkedList;/*** Author: ggdpzhk* CreateTime: 2024-08-03* 641 双端队列:利用双向链表和动态数组实现*/ pu…

C#和S7-1200PLC S7.NET通信

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先创建一个窗体应用。_s7协议批量…

【uniapp离线打包】(基于Android studio)

文章目录 uniapp打包官方教程入口一、准备工作(工具三大件)Android Studio版本推荐 二、准备工作(Android壳和uniapp包)导入Android壳生成uniapp包将uniapp包导入android壳降低jdk版本 三、准备工作(证书)准备Android平台离线签名…

SpringSecurity-1(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity 1 初识权限管理1.1 权限管理的概念1.2 权限管理的三个对象1.3 什么是SpringSecurity 2 SpringSecurity第一个入门程序2.1 SpringSecurity需要的依赖2.2 创建web工程2.2.1 使用maven构建web项目2.2.2 配置web.xml2.2.3 创建springSecurity.xml2.2.4 加载springSe…

50 选择结构

常见的选择结构有单分支选择结构、双分支选择结构、多分支选择结构及嵌套的分支结构,也可以构造跳转表来实现类似的逻辑。循环结构和异常处理结构中也可以实现带有 else 子句,可以看作特殊形式的选择结构。 所有的 Python 合法表达式都可以作为条件表达…

一篇文章让你搞懂原码,反码,补码!

目录 1.机器数和机器数真值 1.1机器数 1.2机器数的真值 2.原码,反码,补码的计算方法 2.1原码 2.2反码 2.3补码 3.为什么要使用反码和补码? 3.1原码不能让符号位参与运算的问题: 3.2为了解决原码作减法,引入…

SAP支出管理,企业成本控制的智能钥匙

在企业运营中,有效的支出管理是确保财务健康和提升竞争力的关键。SAP支出管理系统作为企业资源规划的核心组成部分,提供了一套全面的解决方案,帮助企业实现成本控制、风险管理和合规性监督。实现支出管理流程自动化,并主动管理更多…

python爬虫预备知识三-序列化和反序列化

序列化和反序列化 序列化是为了将内存中的数据保存在磁盘上或者用于传输,实现程序状态的保存和共享。反序列化反之。 序列化后的变量再被反序列化回来之后,两者之间已经没有任何关系。 序列化后的文件是在不同程序或者说不同语言之间传递数据的关键方…

分享5款.NET开源免费的Redis客户端组件库

前言 今天大姚给大家分享5款.NET开源、免费的Redis客户端组件库,希望可以帮助到有需要的同学。 StackExchange.Redis StackExchange.Redis是一个基于.NET的高性能Redis客户端,提供了完整的Redis数据库功能支持,并且具有多节点支持、异步编…