Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811

标签: 技术实现

技术手册-RoCEv2 / EVPN-VXLAN / MC-LAG 部署


关注星融元


本文主要描述如何在Asterfusion CX306P-48S(以下简称CX306P)搭建的模拟网络上部署如下解决方案:

  • RoCEv2:在模拟网络上承载RDMA应用,通过CX306P的PFC和ECN功能,为所承载的RDMA应用构建无损的RoCEv2环境。
  • BGP EVPN和VXLAN:在模拟网络上承载VXLAN网络,将原本在Open vSwitch上进行的封装、去封装全部从Server端卸载到CX306P内的VTEP上,并且在模拟网络上启动BGP EVPN,自动化地创建VXLAN隧道、传递虚拟网络路由。
  • MC-LAG:在模拟网络上为服务器创建一个高可靠环境,确保每台服务器都能通过标准LAG双上联到两台CX306P上,这两台CX306P通过MC-LAG被虚拟化成一台高可靠的交换节点。

如上解决方案共用一个物理拓扑,如图1所示:

CX-N的部署拓扑图

部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:

设备名称接口IP地址
交换机A管理口192.168.4.102
交换机B管理口192.168.4.105
Server1管理口192.168.4.2
Server2管理口192.168.4.133
Server3管理口192.168.4.150

RoCEv2 / EVPN-VXLAN / MC-LAG部署的硬件与软件环境

部署环境中涉及到的硬件和软件如下表所示:

名称型号硬件指标数量备注
交换机CX306P《参见产品彩页》2
服务器1、至少8G内存
2、磁盘不少于500G
3、Server1和Server3的BIOS开启CPU嵌套虚拟化(INTEL:VT-x, AMD:AMD-V)
3Server1和Server3各需要安装一块Mellanox ConnectX-4网卡(25G)
光模块10GSFP+12
100GQSFP284
光纤多模10G/25G适用6
多模100G适用2
软件版本备注
操作系统Centos7.6安装时选择Compute Node 模式,根目录/至少500G
iperf3可以直接yum install iperf3安装,3台server均需要安装
Mellanox网卡驱动4.7-3.2.9.0具体参考《解决方案-Mellanox网卡驱动安装-e-20200211-v1.1》
tcpdump可以直接yum install tcpdump

RoCEv2的配置部署

逻辑组网与配置思路

RoCEv2的配置部署 逻辑组网与配置思路

配置思路:

  • 为交换机A和交换机B配置IP和路由
  • 分别为Server1、Server2、Server3配置IP和路由网关
  • 配置Server1的PFC功能
  • 配置交换机A的ACL打标DSCP功能
  • 使能交换机A和交换机B的QOS功能
  • 先在Server1发送IB流量,观察队列流量
  • 停掉Server1上的流量发送,在Server2发送普通TCP背景流量,观察队列流量
  • 观察ACL规则匹配情况
  • 将Server1和Server2的流量都打起来,观察交换机B的出口拥塞情况
  • 配置交换机A和交换机B的PFC功能
  • 观察测试PFC功能
  • 关闭交换机A和交换机B的PFC功能,配置交换机B的ECN功能
  • 配置服务器ECN相关设置
  • 测试ECN功能

BGP EVPN和VXLAN配置部署

逻辑组网与配置思路

BGP EVPN和VXLAN配置部署逻辑组网与配置思路

配置思路:

  • 配置交换机A和交换机B的HOSTNAME
  • 配置交换机A的EVPN
  • 配置交换机B的EVPN
  • Server1上创建虚机和VLAN
  • Server3上创建虚机和VLAN
  • 测试Server1和Server3的连通性
  • 查看交换机A的路由信息
  • 查看交换机B的路由信息

MC-LAG的配置部署思路

逻辑组网与配置思路

MC-LAG的配置部署思路 逻辑组网与配置思路

配置思路:

  • 分别为Server1、Server3配置LAG
  • 交换机A创建PortChannel,并添加接口
  • 交换机A创建VLAN,并添加成员
  • 交换B创建PortChannel,并添加接口
  • 交换机B创建VLAN,并添加成员
  • 交换机A配置MC-LAG
  • 交换机B配置MC-LAG
  • 测试链路故障
  • 测试设备故障

全文请注册/登录后获取:https://asterfusion.com/d-20220617/

相关文章

测试报告-HPC高性能计算测试方案(CX-N系列云交换机)


关注星融元


一位来自金融行业的客户,他们希望可以实时地模拟和响应风险,以实现企业金融风险管理能力的提升。事实上,不管是金融行业还是其他行业,要想加快步伐满足快速数字化世界中的客户需求,就必须能够比标准计算机更快地处理大量数据。高性能计算(HPC)解决方案,正在受到企业们的青睐。

HPC通用架构主要由计算、存储、网络组成,而HPC之所以能够提高计算速度,更多是采用了“并行技术”,使用多个计算机协同工作,采用十台、百台,甚至成千上万台计算机“并行工作”。各个计算机之间需要互相通信,并对任务进行协同处理,这就需要建立一套对时延、带宽等有着严格要求的高速网络。

高带宽、低时延和低资源使用率的RDMA模式(主要体系架构:InfiniBand协议和以太网协议),往往是HPC网络的最佳选择。而星融元CX-N 超低时延交换机(简称CX-N)采用了标准以太网协议和开放软硬件技术,支持无损以太网技术和网络无损防拥塞技术,充分满足用户HPC应用下对网络带宽、时延等的高要求。为验证这一事实,我们选用Mellanox的InfiniBand交换机,与其进行了相同HPC应用下的运行速度的对比测试。

我们在CX-N和Mellanox的MSB7800交换机(简称IB交换机)分别搭建的网络上,进行了E2E转发测试、MPI基准测试和HPC应用测试。结果证明:CX-N 的时延和对方达到了同一个量级,运行速率较对方仅低3%左右,产品性能与对方交换机不相上下,能够满足绝大多数的HPC应用场景。而有必要补充一点的是,星融元更加注重产品成本的把控,星融元HPC解决方案在性价比方面有显著的优势。

HPC场景测试方案全过程:

1、目标与物理网络拓扑

  • E2E转发测试
    测试两款交换机在相同拓扑下E2E(End to End)的转发时延和带宽,本次方案测试点采用Mellanox IB发包工具进行发包,测试过程遍历2~8388608字节。
  • MPI基准测试
    MPI基准测试常用于评估高性能计算性能。本次方案测试点采用OSU Micro-Benchmarks来评估CX-N和IB两款交换机的性能。
  • HPC应用测试
    本次测试方案在每个HPC应用中运行相同任务,并比较CX-N和IB两款交换机的运行速度(时间更短)。

1.1 IB交换机物理拓扑

如上解决方案的IB交换机物理拓扑,如图1所示:

IB交换机物理网络拓扑

图1:IB交换机物理网络拓扑

1.2 CX-N物理拓扑

如上解决方案的CX-N物理拓扑,如图2所示:

CX-N物理网络拓扑

图2:CX-N物理网络拓扑

1.3 管理网口IP规划

部署过程中所涉及到的设备、接口及管理网口的IP地址如下表1所示:

设备管理口列表

表1:设备管理口列表

2、 硬件和软件环境

部署环境中涉及到的硬件和软件如表2和表3所示:

硬件环境

表2:硬件环境

软件环境

表3:软件环境

3、测试环境部署

在两台Server服务器上,安装部署HPC三种测试场景所需的基础环境。

补充说明:以”[root@server ~]#”为开头的命令表示两台服务器都要执行。

3.1 E2E转发测试环境部署

在两台Server服务器上安装Mellanox网卡的MLNX_OFED驱动程序,网卡驱动安装完成之后检查网卡及驱动状态,确保网卡可以正常使用。

  • 网卡MLNX_OFED驱动程序安装:网卡MLNX_OFED驱动程序安装
  • 检查网卡及网卡驱动状态:检查网卡及网卡驱动状态检查网卡及网卡驱动状态

3.2 MPI基准测试环境部署

在两台Server服务器上安装HPC高性能集群基础环境,安装OSU MPI Benchmarks MPI通信效率测评工具,测试方式分为点对点通信和组网通信两种方式,通过执行各种不同模式的MPI,来测试带宽和时延。

  • HPC集群高性能基础环境:HPC集群高性能基础环境
  • OSU MPI Benchamarks工具安装OSU MPI Benchamarks工具安装

3.3 HPC应用测试环境部署

在两台Server服务器上安装HPC测试应用。本次方案部署WRF开源气象模拟软件和LAMMPS原子分子并行模拟器来进行数据测试。

WRF安装部署:

WRF全称Weather Research and Forecasting Model, 是一个天气研究与预报模型的软件。

  • 修改Docker网络配置
    本方案两台Server服务器WRF部署采用Docker容器部署,需要修改Docker配置文件,将虚拟网桥绑定到Mellanox网卡上,通过直接路由方式实现跨主机Docker容器通信。修改Docker网络配置
  • WRF应用部署WRF应用部署
  • LAMMPS安装部署:LAMMPS即Large-scale Atomic/Molecular MassivelyParallel Simulator,大规模原子分子并行模拟器,主要用于分子动力学相关的一些计算和模拟工作。
  • 安装GCC-7.3安装GCC-7.3
  • 安装OpenMPI安装OpenMPI
  • 安装FFTW安装FFTW
  • 安装LAMMPS安装LAMMPS

随着云计算技术的成熟,HPC正在从应用于大规模科学计算场景,转变为适用各种科学和商业计算场景。《星融元HPC解决方案》将重磅发布,敬请期待!

全文请注册/登录后获取:https://asterfusion.com/d-20220527/

相关文章

技术手册-BGP路由协议


关注星融元


BGP全称BorderGatewayProtocol,也叫边界网关协议,是一种路径矢量路由协议,最新版本是BGPv4。BGP是互联网上一个核心的去中心化自治路由协议。BGP是最复杂的路由协议,属于应用层协议,其传输层使用TCP,默认端口号是179。BGP是唯一使用TCP作为传输层的路由协议。

BGP的分类介绍

BGP按照运行方式分为eBGP(External/Exterior BGP)和iBGP(Internal/Interior BGP)。

  • eBGP:运行于不同AS之间的BGP称为eBGP。为了防止AS间产生环路,当BGP设备接收eBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。
  • iBGP:运行于同一AS内部的BGP称为iBGP。为了防止AS内产生环路,BGP设备不将从iBGP对等体学到的路由通告给其他iBGP对等体,并与所有iBGP对等体建立全连接。为了解决iBGP对等体的连接数量太多的问题,BGP设计了路由反射器和BGP联盟。

应该注意的是,使用内部 BGP 不是使用外部 BGP 的前提条件。自治系统可以从多种内部协议中进行选择,以连接其内部网络上的路由器。

BGP的相关概念

AS(Autonomous sydstem)

自治系统,指在一个(有时是多个)组织管辖下的所有IP网络和路由器的全体,它们对互联网执行共同的路由策略。一个AS是一个独立的整体网络。每个AS有自己唯一的编号。通常一个自治系统将会分配一个全局的唯一的16位号码, ASN范围:1-65535;其中1-64511属于公有ASN,64512-65535属于私有ASN。

AS_Path

路由每通过一个AS范围都会产生一个记录。

BGP报文交互中的角色

BGP报文交互中分为Speaker和Peer两种角色。

  • Speaker:发送BGP报文的设备称为BGP发言者(Speaker),它接收或产生新的报文信息,并发布(Advertise)给其它BGP Speadker。
  • Peer:相互交换报文的Speaker之间互称对等体(Peer)。若干相关的对等体可以构成对等体组(Peer Group)。

BGP的路由器号(Router ID)

  • BGP的Router ID是一个用于标识BGP设备的32位值,通常是IPv4地址的形式,在BGP会话建立时发送的Open报文中携带。对等体之间建立BGP会话时,每个BGP设备都必须有唯一的Router ID,否则对等体之间不能建立BGP连接。
  • BGP的Router ID在BGP网络中必须是唯一的,可以采用手工配置,也可以让设备自动选取。缺省情况下,BGP选择设备上的Loopback接口的IPv4地址作为BGP的Router ID。如果设备上没有配置Loopback接口,系统会选择接口中最大的IPv4地址作为BGP的Router ID。一旦选出Router ID,除非发生接口地址删除等事件,否则即使配置了更大的地址,也保持原来的Router ID。

BGP的报文

  • BGP对等体间通过以下5种报文进行交互,其中Keepalive报文为周期性发送,其余报文为触发式发送:
  • Open报文:用于协商BGP参数,包括版本,AS号,hold time等,然后建立BGP对等体连接。
  • Update报文:用于在对等体之间交换路由信息。
  • Notification报文:用于中断BGP连接。
  • Keepalive报文:用于保持BGP连接。
  • Route-refresh报文:用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文。

BGP的3张表

  • 邻居表(adjancy table):保存所有的BGP邻居信息。
  • BGP表(forwarding database):保存从每一个邻居学到的路由信息。
  • 路由表(routing table):BGP默认不做负载均衡,会从BGP表中选出一条到达各个目标网络最优的路由,放入路由表保存。路由器只需按路由表保存的路由条目转发数据即可。

全文请注册登录后获取:https://asterfusion.com/d-20230427/

资料下载

相关文章

一文梳理基于优先级的流量控制(PFC)


关注星融元


什么是PFC(基于优先级的流量控制)

丢包对不同协议的影响有所不同,应用会以不同的方式作出响应:一些应用可以容忍这一情况,通过重新发送所丢数据包得以恢复。以太网能够支持这些情况,但有些应用不能容忍任何丢包情况,要求保证端到端传输没有丢包。为了使以太网能够满足应用的无丢包要求,需要制定一种方法来通过以太网提供无损服务。基于优先级的流量控制PFC就产生了。PFC(Priority-based Flow Control,基于优先级的流量控制)功能是一种精细的流量控制机制,在IEEE 802.1Qbb标准文档中的定义是:对传统流控暂停机制的一种增强。PFC是基于优先级为不同的业务来提供不同服务的,可以解决传统以太网流控机制和该需求之间的冲突。

PFC工作原理

PFC是暂停机制的一种增强,PFC允许在一条以太网链路上创建8个虚拟通道,为每条虚拟通道指定一个优先等级并分配专用的资源(如缓存区、队列等等),允许单独暂停和重启其中任意一条虚拟通道而不影响其他虚拟通道流量的传输,保证其它虚拟通道的流量无中断通过。这一方法使网络能够为单个虚拟链路创建无丢包类别的服务,使其能够与同一接口上的其它流量类型共存。

数据中心场景中发生网络拥塞的原因

产生拥塞的原因有很多,在数据中心场景里比较关键也是比较常见的原因有三点:

  • 进行数据中心网络架构设计时,如果采取非对称带宽设计,即上下行链路带宽不一致。也就是说当下联服务器上行发包总速率超过上行链路总带宽时,就会在上行口出现拥塞。
  • 当前数据中心网络多采用Fabric架构,采用ECMP来构建多条等价负载的链路,并HASH选择一条链路来转发,是简单的。但这个过程没有考虑到所选链路本身是否已经拥塞,对于已经产生拥塞的链路来说,会加剧链路的拥塞。
  • TCP Incast是Many-to-One(多对一)的通信模式,在数据中心云化的大趋势下这种通信模式常常发生,尤其是那些分布式存储和计算应用,包括Hadoop、MapReduce、HDFS等。如图1所示,当一个Parent Server向一组节点发起请求时,集群中的节点会同时收到请求,并且几乎同时相应。所有节点同时向Parent Server发送TCP数据流,使得交换机上连Parent Server的出端口缓存不足,造成拥塞。

TCP Incast多对一通信模式

图1:TCP Incast多对一通信模式

为了实现端到端的无损转发,避免因为交换机中的Buffer缓冲区溢出而引发的数据包丢失,交换机必须引入其他机制,如流量控制,通过对链路上流量的控制,减少对交换机Buffer的压力,来规避丢包的产生。

PFC流量控制的工作机制

一旦出现瞬时拥塞,即某个设备的队列缓存消耗较快,超过一定的阈值,设备即向数据进入的方向发送反压信息,上游设备收到反压信息,会根据反压信息指示停止发送或延迟发送数据,并将数据存储在本地端口buffer,如果本地端口buffer消耗超过阈值,则继续向上反压。直到网络终端设备,从而消除网络节点因拥塞造成的丢包。

如图2所示,交换机Switch-1和Switch-2的连接端口分别创建8个优先级队列,并为每个队列分配相应的buffer,业务报文通过数据流中携带的优先级字段进行标识,buffer大小使得各队列有不同的数据缓存能力。

PFC工作机制

图2:PFC工作机制

Switch-2的第5优先级队列出现拥塞时,本端报文处理方式:

  • 如果Switch-2使能了PFC功能,向上游设备Switch-1发送PFC Pause帧,通知对端设备暂时停止发送第5优先级队列的报文。对端设备在接收到PFC Pause帧后,将暂时停止向本端发送该类报文,暂停时间长短信息由PFC Pause帧所携带。当拥塞仍然存在时,此过程将重复进行,直至拥塞解除;
  • 如果Switch-2没有使能PFC功能,则直接将报文丢弃。

当Switch-1收到PFC Pause帧时,其报文处理方式是:

  • 若Switch-1使能了PFC功能,且尚未暂停发送第5优先级的报文,则暂停发送该优先级的报文,并根据PFC Pause帧中对应的暂停时间启动定时器。当定时器到期后,将恢复相应优先级报文的发送;
  • 若Switch-1使能了PFC功能,且已经暂停发送第5优先级的报文,则根据PFC Pause帧中对应的暂停时间更新对应定时器的到期时间;
  • 若PFC Pause帧中对应的暂停时间为0,则相当于使对应的暂停定时器立即到期,立即恢复相应优先级报文的发送;
  • 若PFC Pause帧中对应的暂停时间不为0,则相当于复位对应的暂停定时器。也就是说,只要本端一直拥塞,则对端会因不断收到PFC Pause帧而持续暂停发送相应优先级的报文;
  • 若Switch-1没有开启相应优先级的PFC功能,则不会暂停发送相应优先级的报文。

PFC的帧格式

Pause帧实际上是一个以太帧,IEEE802.1Qbb中定义了PFC帧的格式,如图3所示:

PFC帧格式

图3:PFC帧格式

  • Destination MAC Address:目的MAC地址,为01-80-C2-00-00-01;
  • Source Mac Address:源MAC地址,为本设备MAC地址;
  • Ethernet type:以太网帧长度或类型域,为88-08,用于标明本帧的类型为MAC控制帧;
  • Control opcode:MAC控制操作码,PFC Pause帧仅是MAC控制帧的一种,其在MAC控制帧中的操作码为01-01;
  • Priority enable vector:优先级使能向量,高字节置0,低字节的每个位代表相应的Time[n]是否有效。E[n]代表优先级n,当E[n]为1时,表示Time[n]有效,处理该优先级的数据流,即停止流量发送;当E[n]为0,表示Time[n]无效,忽略该优先级的数据流,即流量不受影响继续发送;
  • Time:时间,包含Time[0]至time[7]的8个数组单元,每个数组单元为2字节。当E[n]为0时,Time[n]没有意义。当E[n]为1时,Time[n]代表接收站点抑制优先级为n的报文发送的时间,时间的单位为物理层芯片发送512位数据所需要的时间;
  • Pad(transmit as zero):预留,传输时为0;
  • CRC:循环冗余校验。
  • PFC死锁

PFC死锁,是指当多个交换机之间因微环路等原因同时出现拥塞,各自端口缓存消耗超过阈值,而又相互等待对方释放资源,从而导致所有交换机上的数据流都永久阻塞的一种网络状态。

正常情况下,当一台交换机的端口出现拥塞时,数据进入的方向(即下游设备)将发送PAUSE帧反压,上游设备接收到Pause帧后停止发送数据,如果其本地端口缓存消耗超过阈值,则继续向上游反压。如此一级级反压,直到网络终端服务器在Pause帧中指定Pause Time内暂停发送数据,从而消除网络节点因拥塞造成的丢包。

但在特殊情况下,例如发生链路故障或设备故障时,如图4所示,当4台交换机都同时向对端发送Pause帧,这个时候该拓扑中所有交换机都处于停流状态,由于PFC的反压效应,整个网络或部分网络的吞吐量将变为零。

PFC死锁

图4:PFC死锁

相关文章

连接SONiC与P4交换芯片的SDE


关注星融元


SONiC作为近几年来在云网络领域最重要的开源网络操作系统,获得了业界足够多的关注,基于P4语言的数据平面可编程技术与架构,也是开放网络生态正在讨论的热点话题之一。随着开源、开放网络的进一步发展,SONiC与P4可编程的全方位融合逐渐出现在产业发展的思考范畴之内,并且逐渐开始了一些初步的尝试。

什么是P4 SDE

自2013年创建以来,网络编程语言P4凭借其优异的抽象能力以及灵活性,将网络的可编程性下压到了数据平面,让数据包的解析和转发流程也能通过编程控制,为实现SDN的终极目标提供了有力支撑。

随着芯片巨头Intel出手收购Barefoot,Tofino系列芯片以及P4生态将获得持续的支持与长久的发展。

Barefoot社区提供的SDE(Software Development Environment)可以用P4语言对数据面进行编程,然后编译好的数据面程序就可以运行在Barefoot Tofino芯片上或是SDE中的模拟芯片上。

Barefoot SDE包括了一系列用于开发P4的组件,包括:

  • 核心组件
  • Reference Code
  • 测试框架
  • 一系列代码教程示例

其中核心组件包括了:P4语言开发环境(编译器和模拟芯片环境),系统库以及相关驱动;Reference Code包括了:P4源码以及一组层次分明向上提供的API。

Barefoot SDE P4的核心组建展示图

SONiC中的SDE

SONiC中的SDE

SONiC使用了Redis中机制来完成系统内各个模块间信息的传递。

在这里我们只需要知道在SONiC中syncd容器是与ASIC通信的唯一通道,控制面的业务进程想将数据下发ASIC时,最终处理流程都是将数据按照SAI标准接口格式写入Redis中的ASIC_DB,syncd容器中的同名主进程syncd订阅ASIC_DB中的相关表项并处理这些下发的数据,调用ASIC SDK对SAI API的实现,并通过ASIC driver下发到ASIC。

其中SDE就包括了ASIC SDK以及运行在Tofino ASIC上的tofino.bin(由P4源码编译生成的二进制程序)。

SDE包括了ASIC SDK以及运行在Tofino ASIC上的tofino.bin

Barefoot SDE在SONiC中表现为deb包的形式,在编译生成SONiC镜像时,由Barefoot SDE编译生成的deb包将会安装在syncd容器中,安装目录如下:

/opt/bfn/install

|– bin

|– include

|– lib

`– share

其中ASIC SDK会以动态链接库的形式放在lib目录下面,被syncd主进程链接;由P4源码编译生成的tofino.bin放在share/switch目录下,运行时通过PCIE通道下发到ASIC中运行。

下面我们以SONiC下发二层MAC表为例来演示SONiC中的P4工作流程。

从SONiC上用命令行配置MAC表到P4转发芯片中的转发流表生效,这一整个流程可以分成下面三个部分进行说明。

  1. 第一步:SONiC通过命令行下发一条静态的MAC表,对应数据经过SONiC的业务进程处理,最终将会写入Redis中的ASIC_DB,即1号DB,DB中MAC表的组织形式如下:DB中MAC表的组织形式其中对接口参数的定义与SAI接口定义(如下所示)一致:包括一条fdb_entry以及对应count数量的key-value键值对,由上可知,我们下发了三对键值对,分别为BRIDGE_PORT_ID、TYPE和PACKET_ACTION接口参数的定义与SAI接口定义
  2. 第二步:syncd容器中的同名主进程syncd订阅ASIC_DB中的相关表项并调用ASIC SDK对SAI API的实现(如下所示)来处理ASIC_DB中的数据。ASIC_DB中的相关表项并调用ASIC SDK对SAI API的实现这一步的处理包括两个部分:参数转换和数据存储。首先做参数转换,将标准SAI接口定义的参数转换成Barefoot SDE中的接口层使用的参数格式,然后将其放入内存结构中进行存储,如下图:将标准SAI接口定义的参数转换成Barefoot SDE中的接口层使用的参数格式于是我们得到最终存储的数据结构如下:最终存储的数据结构数据存储完成之后就会调用P4源码对应的语义接口层(与P4源码中table的语法结构一一对应),即SDE中的API层进入第三步。SDE中的API层
  3. 第三步:在SDE中的API层对应P4源码的语义结构接口中,将上一步写入内存DB结构里的数据读取出来,将其转义为P4源码定义的table的语法结构,通过ASIC driver下发到ASIC。API层对应P4源码table的语义结构接口如下:

class dmac : {

public:

dmac(const switch_object_id_t parent, switch_status_t &status){

//读取上一步存储在内存中的数据

status |= switch_store::v_get(

parent, SWITCH_MAC_ENTRY_ATTR_VLAN_HANDLE, vlan_handle);

status |= find_auto_oid(vlan_handle, SWITCH_OBJECT_TYPE_BD, bd_handle);

status |= switch_store::v_get(

parent, SWITCH_MAC_ENTRY_ATTR_MAC_ADDRESS, match_mac);

status |= switch_store::v_get(

parent, SWITCH_MAC_ENTRY_ATTR_PORT_LAG_HANDLE, handle);

//转义为P4源码定义的table的语法结构

//生成流表的match_key

status |= match_key.set_exact(smi_id::F_DMAC_IG_MD_BD, compute_bd(bd_handle));

status |= match_key.set_exact(smi_id::F_DMAC_DST_ADDR, match_mac);

//生成流表的action

action_entry.init_action_data(smi_id::A_DMAC_HIT);

action_entry.set_arg(smi_id::P_DMAC_HIT_PORT_LAG_INDEX,

compute_port_lag_index(handle));

}

switch_status_t create_update() {

//将生成好的流表match_key和action通过ASIC driver下发到ASIC

}

};

在本文示例中用到的P4源码定义的table的语法结构如下:

P4源码定义的table的语法结构

小结

我们通过SONiC命令行下发一条静态的MAC表的数据最终在ASIC中表现出的流表形式为:

下发一条静态的MAC表的数据最终在ASIC中表现出的流表形式

在ASIC进行流量转发时,如果数据包命中这条流表,即BD为03E7(对应VLAN ID为2),dst_mac为00:11:11:11:11:11,该数据包将从06口(对应port为60)出去。

通过本文的描述,希望帮助您对SDE作为SONiC与P4可编程芯片连接的中间组件,进行转发流表下发的数据流动过程有更深的了解。

相关文章

520 P4可编程表白SDN交换机:我能给你的,比你想象得多!


关注星融元


P4可编程芯片概述

本文中我们以Tofino可编程芯片为例,Tofino芯片包含多个Pipeline,每个Pipeline可以运行不同的查表逻辑(即不同的P4程序),每个Pipeline含12个MAU(Match-Action Unit),出/入Pipeline共享这些MAU。

每一个MAU对应Pipeline流水线中一个Stage阶段,每个Stage支持若干次并发查找,从而可以提升并发查找性能。MAU与MAU之间顺序查找,多级查表或处理可以分布到不同的MAU上,从而可以丰富业务处理逻辑。

P4抽象转发模型 图1, P4抽象转发模型

整体设计背景及面临的问题

为了满足交换机高性能处理的需要,设计时,我们采用多个Pipeline同构设计,即所有Pipeline部署相同P4程序,使用相同的处理转发逻辑。

考虑到业务逻辑的复杂性,数据面通常需要定义多个表才可以完成整个业务逻辑,并且流表与流表之间存在依赖关系,有依赖关系的流表会被P4编译器分配到不同的Stage。每个Stage只能访问自己的本地内存,当一张流表没有在运行时使用的时候,它的资源也就白白浪费了。

以下图为例,表21~23依赖于表11的匹配处理结果,如果表11没有处理完,表21~23也无法运行,同理,表31依赖于表21~23的匹配处理结果。

表间依赖导致Stage资源利用率低 图2,表间依赖导致Stage资源利用率低

因此,在实际编码时,我们会发现虽然用光了所有的Stage资源,但每个Stage资源利用率却很低,极端时,资源利用率甚至不到10%。

优化设计方法

Stage资源利用率低的直接体现就是交换机相应的流表空间的不足。

为了实现交换机流表空间扩充,需要寻找可以提高Stage资源利用率的方法。

通常的调优方法主要包括以下几种:

  1. 优化表配置,降低表间耦合度,提升Stage资源利用率。 降低表间耦合提升Stage资源利用率 图3,降低表间耦合提升Stage资源利用率
  2. 如果实在不能通过流表的设计降低耦合度,就需要深刻理解和调整业务逻辑,一般地做法是将Key或Action依赖改为后继依赖,必要时可以通过牺牲SRAM/TCAM确保低耦合。 后继依赖示例 图4,后继依赖示例
  3. 业务逻辑拆分部署。例如,在实际业务场景中,对特定报文执行隧道解封装是常见的需求,如果把整个功能单独放在Ingress Pipeline或单独放在Egress Pipeline,就会增加表间依赖,导致Stage资源利用率低,但是,如果将特定报文的筛选(查表)和处理(修)分别放在Ingress Pipeline和Egress Pipeline,则既能兼顾PHV(PacketHeader Vector)生存周期这一约束性资源的限制,又能提高Stage资源利用率。
  4. 巨型表拆解成小表。巨型表会被P4编译器分配到不同的Stage,如下图中的表2和表3是一个巨型表编译后的情况,对于Stage3而言,剩余的资源还可以部署其它拆解后小表,达到资源充分利用的效果。巨型表拆解成小表 图5,巨型表拆解成小表[/caption]

经过我们大量的实验和调优设计,基于P4可编程的SDN交换机片上SRAM利用率达到74%,片上TCAM利用率达到81%。

下图是优化后Stage资源利用图:

优化后Stage资源利用图
图6,优化后Stage资源利用图 

交换机流表扩充

SDN交换机需要根据L2-L4协议头识别所关心的流量,并对这部分流量做过滤和处理。

如下图所示,当收到报文后,适配不同的流表,并根据预定义的匹配动作处理报文。

流表匹配图 图7,流表匹配图

其中,报文五元组流表匹配是较为常见的匹配模式,又分为:

  • 五元组精确流表
  • 五元组掩码流表

常规的实现方法是,将报文的五元组定义到同一张流表里来满足基于五元组识别流量的需求。

但SDN交换机对流表规格要求很高,同时也需要不同元组组合。如,

  • 一元组(源IP或目的IP)
  • 二元组(源目的IP)
  • 三元组(源目的IP及协议号)
  • 四元组(源目的IP及源目的端口)
  • 五元组(源目的IP及源目的端口及协议号)等。

基于TCAM可以实现通配五元组规则,就可以通过使用掩码方法忽略部分元组实现不同元组组合的流表,因此,将五元组放在一张流表里是没有问题的。

然而,基于SRAM实现的精确五元组流表受其查表机制(不支持掩码方式)影响,故天然不能满足需要不同元组组合查表的场景。

解决精确五元组流表扩充的方式有两种:

在SRAM上定义不同元组组合的流表:

优点在于编程模型及查找逻辑简单,管理面适配简单。

缺点是固定了6种元组,实际场景中存在6种以外的其他组合规则,灵活性较差。同时,由于不同元组组合的规则共享IP字段,尤其当IPv6时,这导致片上SRAM资源利用率极低,且不能保证规格。

压缩查表的Key:

Tofino芯片提供了Key压缩机制,但这个机制存在误匹配风险。误匹配的概率与流表Key的分布(或哈希后的离散程度)有关,随着已配表项数目的增加尤其在临近满配时,误匹配的概率将急剧提高。

我们在进行精确五元组流表扩充优化设计时,充分结合上述两种方式的优势,同时规避相应的不足,解决思路如下:

将较长Key映射成一个低位宽的Key(防止被编译器优化到不同的MAU),然后用低位宽Key替换IP,并对这些Key做精确(掩码)查找。

这种方法虽然牺牲了一部分SRAM,增加了数据面逻辑的复杂度和管理面适配的复杂度,但优化查表逻辑后可以在保证无误匹配的前提下支持不同五元组组合,使得整体规格在原有数万级别的基础上提升了250%,而不同元组组合规格(中值)提升了200%。

低位宽Key拆解应用 图8,低位宽Key拆解应用

网络加速和业务卸载

“云化”大背景下,处理以隧道为代表的新应用新特性正在变成或已经变成基本需求,这些处理包括隧道封装、解封装、根据隧道内层IP信息进行流量识别和过滤等。

传统处理方式是将这部分流量提交到计算卡(业务卡)上处理,伴随着“云化”流量占比越来越大,本就昂贵的计算资源更加不堪重负。
……

P4可编程的SDN交换机为隧道流量的处理和卸载提供了契机,经过Parser调优设计,可以广泛支持各种隧道和封装协议的识别,如GTP、GRE、MPLS、ERSPAN、VXLAN、IP over IP等,并且可以根据隧道内层IP信息识别和过滤流量。

基于P4可编程交换机实现网络加速和业务卸载 图9,基于P4可编程交换机实现网络加速和业务卸载

鉴于P4可编程交换机在处理隧道化流量方面有先天优势,这种优势可以转化为解决方案的成本优势;另一方面,如果将释放出计算能力运用到增值业务处理上,这一优势也可以转化为解决方案的增值优势。

除了隧道卸载外,我们还在基于P4的SDN交换机上卸载了诸如关键字匹配过滤、ICMP/ARP代答、报文截短等功能,以实现最大化地释放算力资源的目的。

相关文章

REST API在SONiC中的实现


关注星融元


REST API 是什么?

REST API是一种面向资源的接口设计,所有的接口设计都是针对资源来设计的。简单理解就是用URI定位资源,用HTTP(GET、POST、DELETE、PUT、PATCH)描述操作。

目前,SONiC有一个原生RESTAPI框架,基于Golang实现,但功能仅有VLAN、VLAN interface、VXLAN tunnel、路由,功能上侧重业务。而星融元(Asterfusion)的REST API早于社区的原生REST API开发,并选择了具有轻量化,性能高的优点的Tornado框架,且一直在沿用。星融元(Asterfusion)REST API可以与SONiC原生REST API同时使用,未来,也将会贡献给社区。

下面我们来详细介绍一下星融元( Asterfusion )REST API软件:

星融元( Asterfusion )REST API基于Tornado框架开发,通过Nginx实现https方式访问。并在docker容器中运行,开销低,安全性高。同时为了解决RESTAPI在docker容器中不方便做一些系统级的操作如config reload、reboot等问题,我们在HOST上增加了sys-proxy模块,用于REST API直接调用HOST上的命令。

Tornado 是什么?

Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,效率高。

  • URI说明:https://<SWITCH_IP>[:端口号]/rest/<version>/<resource>
  • SWITCH_IP:为交换机的管理口IP;
  • 端口号:RESTAPI绑定的https端口号,默认为4430;
  • 版本:V3.0,属于RESTAPI的接口版本
  • resource是由各功能模块定义,详细说明请联系support@asterfusion.com索取《用户指导-CX系列产品RESTAPI手册》

星融元 REST API 的基本框架

星融元REST API 的软件框图 图 1 星融元(Asterfusion) RESTAPI 的软件框图

星融(Asterfusion)REST API运行在一个独立的docker容器中,因为设备web管理组件也运行在其中,所以命名为web-server。

在该容器中,主要包括Ngnix和REST API两大组件。其中Ngnix用于https的代理。

红色虚线中的部分基于Tornado框架实现。其中,service模块为REST API的主入口,它会监听对应端口,注册所有功能模块,并完成整个RESTAPI服务的初始化。

图中Modules就是这些功能模块,包括system、interface、router interface、VLAN等。每个模块包括schema、handler、adapter三部分。

最底层是wrapper层,封装了对数据库的操作。

RESTAPI服务还支持定时任务,比如用于采集接口的各种计数,并计算秒级速率。另外,还提供了一个与HOST进行交互的通道,当RESTAPI服务需要调用系统级的命令时,如reboot,config reload等,会与运行在HOST上的sys-proxy进行通信,用于系统命令的调用。

星融元 REST API 的代码结构

星融元 REST API 的代码结构
图2 星融元 REST API 的代码结构

REST API目录下是不同版本的REST API代码目录,Asterfusion REST API已经迭代到了V3版本。

V3目录下,有REST API服务主入口serivce.py和目录common、modules、task、wrapper。

common目录下是一些公共类、函数的实现。modules目录下是所有功能模块的实现,目前已实现的模块有:system、interface、VLAN、MAC、routerinterface、VRF、route、VXLAN、 BGP、EVPN、LAG、MC-LAG、LLDP、ECMP。在每一个module的目录里,都存在__init__.py、handler.py、adapter.py、schema.py这几个文件。

每个模块URI的格式统一在__init__.py里定义,如BGP是:

urls=[[r’/protocols/bgp-neighbors/([0-9a-fA-F.:]*)/?’, handler.BGPNeighborHandler]]

在handler.py中,定义了POST、DELETE、PATCH、GET、PUT方法的顶层实现。每个方法的具体逻辑由adapter.py中的函数实现。schema.py定义了每个模块对数据类型和范围的检查,如果检查不通过,会直接返回错误码。

task目录实现了轮询任务,目前有一个轮询任务是接口实时流量速率的计算。

wrapper是数据库原子级操作的一个封装层,adapter会调用wrapper层的函数。

星融元 REST API 基本功能介绍

星融元REST API基本功能介绍

星融元REST API 的特性

  • 高性能:基于非阻塞式的Tornado实现,并使用了hiredis库读写Redis数据库,效率更高;Nginx可以基于URI将不同的http请求分发到不同的RESTAPI进程,在多核CPU设备中效率更高。
  • 易扩展性:如果增加新模块只需要在modules目录下增加新的目录和代码即可。
  • POST、PATCH、PUT、DELETE操作有详细的返回数据,返错时会根据返回的数据直接定位到原因,如下图:POST、PATCH、PUT、DELETE操作详细的返回数据
  • 详细的log机制,每次REST API调用都会详细的log,如下图REST API调用都会详细的log

星融元 REST API 如何配置业务?举例IP Route和BGP-EVPN典型场景

场景1:IP Route

如上图所示,两个Server通过两个CX系列交换机进行三层通信,需要在两个交换机上创建routerinterface,并配置路由。

交换机A的配置:

  • 创建三层口:配置流程创建三层口
  • 创建路由:创建路由

交换机B的配置:

  • 创建三层口:
  • 创建路由:创建路由

场景2:BGP-EVPN

典型的Leaf-Spine场景

如上图所示,这是一个典型的Leaf-Spine场景,VM-A1和VM-A2属于同一个子网,它们需要通过VXLAN隧道进行二层通信,VM-B1属于另一个子网,它需要和VM-A2通过VXLAN隧道进行三层通信。

该场景需要配置每个交换机的BGP及BGP邻居、EVPN参数、创建VLAN和三层口并进行EVPN MAP相关的配置,分配L2VNI和L3VNI。

交换机192.168.10.1的配置:

  • 系统配置:系统配置
  • BGP邻居及相关三层口:BGP邻居及相关三层口BGP邻居及相关三层口
  • VLAN及三层口配置:VLAN及三层口配置VLAN及三层口配置VLAN及三层口配置
  • EVPN MAP:EVPN MAP

交换机192.168.10.2的配置:

  • 系统配置:系统配置
  • BGP邻居及相关三层口:BGP邻居及相关三层口BGP邻居及相关三层口

交换机192.168.10.3的配置:

  • 系统配置:系统配置
  • BGP邻居及相关三层口:BGP邻居及相关三层口BGP邻居及相关三层口
  • VLAN及三层口配置:VLAN及三层口配置VLAN及三层口配置VLAN及三层口配置
  • EVPN MAPEVPN MAP

相关文章

MC-LAG/VLAG在SONiC中的实现


关注星融元


什么是MC-LAG?

MC-LAG(Multi Chassis Link Aggregation Group,跨设备链路聚合组)是一种实现跨设备链路聚合的机制,通过将一台设备与另外两台设备进行跨设备链路聚合,保留了普通链路聚合的所有优点,同时提供了设备级别的冗余。

MC-LAG提供了一种横向虚拟化技术,将两台物理设备虚拟成单台逻辑设备,这台虚拟出来的“单个设备”与其相连的上行或下行设备实现“一对一”链路聚合。

物理拓扑与逻辑视图 图1 物理拓扑与逻辑视图[/caption]

如图1所示,MC-LAG组对外表现为一台逻辑设备,用于链路聚合;MC-LAG交换机组内部署Ethernet或LAG类型的peer-link用于MC-LAG之间协议信息交互,以及承担故障场景下的东西向流量。MC-LAG组对外表现为单一节点,相对于传统组网,在实现冗余备份时不会带来环路风险,同时链路聚合的负载均衡模式不会导致链路闲置,链路利用更加高效。

VLAG(Virtual Link Aggregation Group,虚拟链路聚合组)是一种在MC-LAG基础上发展而来的技术,其控制面逻辑与MC-LAG完全相同,区别在于VLAG设备组之间搭建VXLAN隧道,以该VXLAN隧道作为peer-link,摆脱了MC-LAG中需要在成员设备之间预留专门物理链路的限制。

如图2所示,Server端通过MC-LAG机制与另外两台设备S1、S2进行跨设备链路聚合。

MC-LAG基本拓扑 图2 MC-LAG基本拓扑[/caption]

MC-LAG/VLAG的名词解释

MC-LAG/VLAG的控制面

控制协议ICCP

SONiC在MC-LAG控制面采用轻量级的ICCP协议,在保障功能的前提下,只进行少量的一致性检测和信息同步。

ICCP(Inter-Chassis Communication Protocol,设备间交流协议),是在RFC7275中定义的标准协议。ICCP协议使用TCP端口8888在MC-LAG peer间建立连接,轻量级的ICCP协议会进行配置一致性检查、ARP表项和MAC表项同步。

ICCPD容器

在SONiC中容器ICCPD用来维护MC-LAG的控制层,ICCPD容器与其他模块的关联如图3所示。

ICCPD容器与其他模块关联图

  1. 容器ICCPD启动后,运行iccpd,mclagmgrd,mclagsyncd守护进程。iccpd为协议运行主进程,mclagsyncd通过TCP socket与iccpd进程交互信息;mclagmgrd通过调用iccpd提供的mclagdctl命令与iccpd进程进行交互。
  2. ICCPD容器启动时从CONFIG_DB中读取MC-LAG配置表项,mclagmgrd监听CONFIG_DB中MC-LAG配置表项变化。MC-LAG配置表项变化
  3. mclagsyncd监听ASIC DB中FDB表项变化信息,通知给iccpd进程。
  4. iccpd通过使用netlink消息与内核交互。当触发RTM_NEWLINK或RTM_DELLINK消息时,则更新端口所在vlan的信息;当触发RTM_NEWNEIGH或RTM_DELNEIGH,则更新本地ARP表项;当触发RTM_NEWADDR时,则更新本地MAC地址信息。另一方面,iccpd发送netlink消息来修改内核层端口的mac地址以及写入ARP表项。
  5. mclagsyncd从iccpd进程接收协议处理结果,修改APP_DB中相关表项。如APP_FDB_TABLE下发MAC表项,APP_ISOLATION_GROUP_TABLE添加隔离信息,APP_PORT_TABLE或APP_LAG_TABLE或APP_VXLAN_TUNNEL_TABLE写入端口mac学习属性。
  6. Orchagent订阅APP DB,之后的处理不再是ICCPD关心的范畴。

邻居建立

MC-LAG peer两台设备以local_ip和peer_ip为TCP连接的源地址和目的地址建立ICCP邻居。

MC-LAG peer两台设备分别承担Active和Standby角色。根据配置信息中的local_ip和peer_ip数字的大小比较,数字较小者作为Active端,TCP连接的Client端;数字较大者作为Standby端,TCP连接的Server端,Client端会主动向server发起连接请求。

当ICCP连接建立完成之后,MC-LAG peer根据peer-link的端口类型,修改APP_DB中的APP_PORT_TABLE或APP_LAG_TABLE或APP_VXLAN_TUNNEL_TABLE表项,关闭peer-link的mac学习功能。

关闭peer-link的mac学习功能

MC-LAG peer的Active,Standby角色仅为控制层面的概念,在数据转发面,MC-LAG peer各自决定流量转发路径,地位相同。

ICCP信息同步

在MC-LAG peer之间会同步以下信息:

  1. 系统信息:同步MC-LAG成员端口的MAC地址,保证MC-LAG peer向Server发送的LACP报文中“system ID”域相同,实现跨设备链路聚合。具体做法是当Standby端收到Active端的system MAC信息后,发送netlink消息,将本地MC-LAG成员端口的system ID修改为和Active端一致。
  2. MC-LAG成员端口配置信息:记录本地和对端MC-LAG成员端口的名称等信息,用来做一致性检查。
  3. MC-LAG成员端口状态信息:记录本地和对端MC-LAG成员端口状态,保证无故障情况下peer-link到MC-LAG成员端口的隔离,对端MC-LAG成员端口故障情况下peer-link到同名端口的隔离解除。隔离是向APP_DB中配置表项,隔离解除删除该表项。MC-LAG成员端口状态信息
  4. ARP信息:与MC-LAG成员端口相关的ARP表项会在MC-LAG peer之间进行同步。当收到对端的ARP消息之后,通过发送netlink消息在本地更新ARP表项。
  5. FDB信息:与MC-LAG成员端口相关的FDB表项会在MC-LAG peer之间进行同步。当收到对端的FDB消息之后,通过修改APP_DB中表项,更新本地FDB表项。
  6. FDB信息
  7. 心跳检测

在SONiC中,以1s为时间间隔向对端发送心跳报文,在连续15个周期没收到心跳报文时,则被判定为超时,ICCP连接断开。

一致性检测

SONiC使用轻量级ICCP协议进行以下属性的一致性检测:MC-LAG peer关于local_ip,peer_ip的配置对称;MC-LAG成员端口配置相同:名称、数量、加入的VLAN,VLAN的路由口IP,VLAN的路由口MAC地址;MC-LAG peer中peer-link的端口类型保持一致。

典型组网

MC-LAG中典型组网及配置如图4所示。

MC-LAG典型组网 图4 MC-LAG典型组网[/caption]

MC-LAN配置信息

MC-LAN配置信息

MC-LAG/VLAG场景下流量转发的配置

以图5配置为例,介绍一下配置VLAG场景下的二层流量转发情况。

VLAG组网配置
图5 VLAG组网配置

VLAG组网配置

VLAG组网配置

无故障流量转发

在无故障情况下,Server1与Server2之间的流量转发路径如图6中橙色曲线所示。

无故障流量转发 图6 无故障流量转发

  1. Server1上的广播流量通过PortChannel0001选路到达S1,在Vlan300中广播,复制到PortChannel0310到达Server2,复制到VTTNL1隧道封装经undelay网络到达S2。由于在S2上开启VTTNL1到PortChannel0310和PortChannel0300的转发隔离,广播报文不会回环到Server1,也不会第二次到达Server2。同时,由于VTTNL1的MAC学习功能被关闭,S2上关于Server1的FDB表项不会迁移到VTTNL1。
  2. Server1往Server2的单播流量通过PortChannel0001选路到达S1,在S1上查询FDB表项单播到达Server2。由于S1与S2的FDB表项同步,若选路到S2,也可查询FDB表项单播到达S2。

链路故障场景

当链路发生故障时,Server1与Server2之间的流量转发如图7所示。

链路故障流量转发 图7 链路故障流量转发

  1. S1上的PortChannel0310状态切换为down,Server2与S1之间的通信发生故障,S1和Server2直接感知该故障。
  2. Server2向Server1方向的广播和单播流量均直接通过S2进行转发。
  3. Server1向Server2方向的广播流量,当经过S2转发,则直接广播到达Server2;当经过S1时,广播复制到VTTNL1上,隧道封装经underlay网络到达S2后解封装,由于S2上已解除VTTNL1到PortChannel0310的单向隔离,则可在S2上广播复制到Server2。
  4. Server1向Server2方向的已知单播流量,当经过S2转发,则直接单播到达Server2;当经过S1时,由于S1上已将出接口为PortChannel0310的FDB表项重定向到VTTNL1上,则单播流量会经过VTTNL1隧道到达S2。由于S2上已解除VTTNL1到PortChannel0310的单向隔离,隧道报文解封装查询FDB表项经PortChannel0310单播转发到Server2。

设备故障场景

当MC-LAG组内成员设备发生故障时,Server1和Server2之间的流量转发如图8所示:

设备故障流量转发 图8 设备故障流量转发

  1. 如图8所示,S1设备发生故障,Server1和Server2之间ICCP连接断开。
  2. Server1和Server2均感知S1故障。Server1和Server2之间的流量均由S2承担,如图8橙色曲线所示。

相关文章

一文了解SONiC内部通信模型


关注星融元


SONiC使用Redis提供的两种机制:

  • publish/subscribe
  • keyspace

封装出多种通信模型,建立以Redis数据库为中心的的消息传递机制。同时也通过调用Linux工具命令对系统进行配置,并以发送和监听netlink消息的方式与内核通信。SONiC使用了多个Redis数据库,用来存放不同的配置、状态和控制表项等信息。

数据库说明如下:
数据库说明

以数据库为中心的模型

模型1:SubscriberStateTable

使用keyspace机制,向订阅者传递key-value消息。该机制不需要执行PUBLISH通知,对于每个修改数据库的操作,都会产生keyspace的事件消息,订阅者通过监听指定KEY,来获取所有对该KEY修改事件的通知。在SONiC中,该通信模型常用于对CONFIG_DB和STATE_DB的监听处理。

对CONFIG_DB的修改一般用于对系统进行配置操作,如使用命令行来配置系统功能,SONiC在sonic-py-swsssdk组件中封装了对CONFIG_DB的操作,根据传递data是否为空执行hmset或delete操作。

这里以监听CONFIG_DB配置VLAN为例说明。

VlanMgr在初始化时监听CFG_VLAN_TABLE_NAME和CFG_VLAN_MEMBER_TABLE_NAME,当通过config命令添加vlan 100的操作,在CONFIG_DB中生成名为”VLAN|Vlan100″的KEY,此时会产生keyspace的事件消息,触发VlanMgr::doTask(Consumer &consumer)来处理。这里的Consumer即是通过orch类封装过的SubscriberStateTable。

模型2:NotificationProducer & NotificationConsumer

使用Redis的publish/subscribe模型直接封装实现,通过消息队列来传递信息,内容可以灵活定义。在SONiC中,该通信模型主要用于orchagent和SYNCD之间的事件通知,例如FDB事件、端口状态变化等等。

以FDB事件为例,SYNCD收到来自底层驱动的FDB事件,调用对数据库的hset或del操作更新ASIC_DB中的FDB表项,同时作为Notification生产者发送名为“fdb_event”的通知消息。

以数据库为中心通信模型

图1 以数据库为中心通信模型

Notification的消费者流程在fdborch中实现,通知消息触发:

FdbOrch::doTas (NotificationConsumer&consumer)

来进行后续处理,更新orchagent中的FDB信息。

模型3:ProducerStateTable &ConsumerStateTable

使用Redis的publish/subscribe模型封装,通过publish通知KEY修改事件,利用KeySet机制来传递信息。该通信模型通过集合(set)来传递key-value信息,不指定操作动作,当传递的value为空时,对应操作为del,当传递的value非空,对应操作为set。

在SONiC中,该通信模型用于围绕APPL_DB的消息传递,生产者一般为cfgmgr或应用组件的syncd进程,消费者则是orchagent。

这种通信模型,在publish通知KEY修改事件前允许对key-value进行多次操作,操作过程不保证执行顺序。这样做的好处是不必在每次设置key-value时都触发事件通知,可以提升处理效率,但对orchagent处理流程有一定要求。orchagent作为消费者,在Consumer::execute过程中取出所有待处理的key-value信息,加入待处理的m_toSync映射表,当m_toSync映射表还有未处理完的信息时,会将新任务与旧任务合并,然后交由每个orch实例处理。

Orchagent调度处理采用epoll事件通知模型,事件触发即会产生调度;在调度处理中,可能出现因资源依赖等因素导致任务处理无法完成,此时可以选择将任务保留在m_toSync中等待下一次调度处理。在大规模控制表项和较复杂逻辑关系的场景下,这种调度机制可能出现因资源限制、依赖条件不满足等因素导致的频繁或无效调度,Asterfusion通过优化处理顺序、改进批量操作以及在STATE_DB中设置状态标志等改进方式,提高了组件运行效率并增强了可靠性。

模型4:ProducerTable& ConsumerTable

使用Redis的publish/subscribe模型封装,通过publish通知KEY修改事件,利用KeyValueOpQueues机制来传递信息。该通信模型通过有序链表(list)来传递key-value-op三元消息,在SONiC中,该模型用于围绕ASIC_DB和FLEX_COUNTER_DB的消息传递。与模型3相比,该模型保证了操作的严格执行顺序,在syncd执行SAI API调用时保证了对底层ASIC的操作时序。

与内核的通信方式

SONiC中应用模块与内核通信主要用于处理网络接口事件和路由等,包括向内核发送消息和获取内核消息,一般通过netlink机制或调用系统工具来完成。SONiC中使用的teamd、FRR等开源组件与内核存在依赖关系,采用这种通信机制在减少模块耦合性的同时,可以尽量减少对原有开源组件的修改。

向内核发送消息一般有两种方式:一种是通过调用Linux工具命令,如调用ip命令配置网络接口IP地址和设置VRF,又如调用bridge命令配置VLAN;另一种方式是直接发送netlink消息,例如通过NETLINK_ROUTE生成内核路由表。调用工具命令方式比较简单,用封装的swss::exec方法最终通过popen执行拼装好的command指令。对netlink消息操作则是通过以libnl库为基础封装的NetLink类来完成,同时SWSS也定义了一套NetDispatcher机制来实现netlink消息监听和分发处理。

这里以neighsyncd为例进行说明。

neighsyncd通过NetDispatcher提供的方法注册RTM_NEWNEIGH和RTM_DELNEIGH两类netlink消息类型的回调函数,当触发netlink消息事件时,调用NetDispatcher的onNetlinkMessage方法来处理。这里通过netlink消息类型来查找之前注册的回调函数,并最终调用nl_msg_parse来执行回调函数。neighsyncd的回调函数根据netlink携带的信息组织生成邻居表项,并向APP_NEIGH_TABLE写入相应键值。在生成邻居表项过程中,使用了SWSS实现的一种名为linkcache的机制,该机制缓存曾经使用的NETLINK_ROUTE消息,通过网络接口索引来查询网络接口名称。

下面以teamd流程示例来说明聚合组配置和聚合过程的通信流程。

teamd聚合组配置

聚合组配置流程

图2 聚合组配置流程

(1) 通过CLI创建名称为PortChannel0001的聚合组,并加入聚合组成员口Ethernet0和Ethernet4,在CONFIG_DB中生成配置表项。
生成配置表项

(2) teamdmgrd进程监听相应键值变化,调用doLagTask和doLagMemberTask方法处理。

(3) doLagTask方法解析参数并生成所需的配置文件conf,通过调用teamd命令创建并配置聚合组,并调用ip命令设置聚合组接口MAC地址和管理状态;doLagMemberTask方法中先判断聚合组及待加入聚合组成员接口状态是否满足要求,如果满足则调用teamdctl和ip命令来配置聚合成员接口,这里会将聚合成员口设置为down,否则挂起当前任务后续再处理。

doLagTask方法解析参数并生成所需的配置文件conf

(4) teamdmgrd作为生产者将聚合组和成员的配置信息写入APPL_DB。

(5) portsorch作为消费者订阅APP_LAG_TABLEAPP_LAG_MEMBER_TABLE进行处理。
portsorch作为消费者订阅APP_LAG_TABLEAPP_LAG_MEMBER_TABLE进行处理

(6) portsorch调用sairedis的API,检查参数类型合法性并将LAG配置信息写入ASIC_DB。

(7) SYNCD订阅ASIC_DB中的LAG相关表项并处理。
SYNCD订阅ASIC_DB中的LAG相关表项(8) SYNCD调用ASIC SDK对SAI API的实现,并通过ASICdriver下发到底层芯片。

teamd聚合过程

(1) teamsyncd初始化阶段注册监听RTM_NEWLINK和RTM_DELLINK类型的netlink消息,同时也会注册teamd的操作handler,用于处理teamd聚合成员口状态变化以及teamd参数变化触发的事件。

teamd聚合流程图3 teamd聚合流程

(2) teamsyncd处理两类消息。一类是netlink消息,当触发NEWLINK或DELLINK时对应操作STATE_LAG_TABLE设置聚合组状态;另一类是teamd状态变化消息,当teamd通过LACP交互及内部状态机产生聚合成员口状态变化,调用TeamSync::TeamPortSync::onChange进行处理。

(3) teamd感知聚合成员口发生状态变化,teamsyncd从teamd获取当前聚合成员列表和状态,与变化前的聚合成员列表进行比较。如果聚合成员已存在且状态发生变化,则直接修改相应的APP_LAG_MEMBER_TABLE成员状态,如果成员列表发生变化,则向APP_LAG_MEMBER_TABLE添加新增的成员口并设置成员状态以及删除不存在的成员口。
APP_LAG_MEMBER_TABLE

(4) portsorch作为消费者订阅APP_LAG_MEMBER_TABLE进行处理,根据聚合成员口状态设置SAI_LAG_MEMBER_ATTR_INGRESS_DISABLE和SAI_LAG_MEMBER_ATTR_EGRESS_DISABLE,决定是否允许通过该成员口接收流量以及从该成员口发送流量。

(5) portsorch调用sairedis的API,并更新LAG Member配置表项及属性到ASIC_DB。
portsorch调用sairedis的API

(6) SYNCD订阅ASIC_DB中的LAG Member表项并处理。

(7) 调用ASIC SDK对SAI API的实现,并通过ASIC driver下发到底层芯片。

相关文章

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2