1. 背景
Mellanox网卡提供了PCC(Programmable Congestion Control 可编程拥塞控制)用于给用户涉及和实现私有的拥塞控制算法。网卡里面有一个PPCC( Port Programmable Congestion Control 端口可编程拥塞控制)的寄存器提供给用户,允许用户配置和读取 PCC 算法及其参数/计数器。DPA(Data process Accelerate)是网卡中用于运行PCC的硬件加速单元核心。
Programmable Congestion Control (PCC) allows users to design and implement their own congestion control (CC) algorithm, giving them the flexibility to work out an optimal solution to handle congestion in their clusters. On BlueField-3 networking p latforms , PCC is provided as a component of DOCA.
The Port Programmable Congestion Control (PPCC) register allows the user to configure and read PCC algorithms and their parameters/counters.
主机-网卡-DPA的关系:

2. PPCC端口可编程拥塞控制
端口可编程拥塞控制 (PPCC) 寄存器允许用户配置和读取 PCC 算法及其参数/计数器。
它支持以下功能:
- 在不同的端口上启用不同的算法
- 查询算法和可调参数/计数器的信息
- 在不编译和重新烧录用户镜像的情况下更改算法参数
- 查询或清除可编程计数器
3. 配置命令类型
配置PPCC需要使用mlxreg的工具。配置方式:
# 获取
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --get --op "cmd_type=0" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
# 设置
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --set "cmd_type=1" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
其中
-d 指定设备可以是mst设备,也可以是BDF号。
-y 表示配置时候无需和用户交互确认,直接输入y,类似yum install -y的参数
设置的时候必须设置 cmd_type 和 索引index,cmd type用来指定命令类型作用。
配置的时候必须保持 doca_pcc 应用程序运行
配置的时候保持这三个index不变(local_port=1, pnat=0, lp_msb=0),具体这三个参数作用还未知。
3.1 cmd_type类型:算法抽屉(algo slot)相关的(5个cmd:开、关、查、参数个数和algo num)
用抽屉来翻译形象一点
cmd_type有十几种类型,常见的0和1。
- 0表示 获取算法信息
- 1表示 启用算法
- 2表示 关闭算法
其他:
- 3 获取算法使能状态(0 – disabled; 1 – enabled)
- 4 获取算法的参数数量
需要指定algo_slot,表示获取哪个算法slot的信息。

好比:
下面的操作都是操作slot0的算法的
# 获取32bit的algo num,表示第几个alog生效
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --get --op "cmd_type=0" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
# 设置启用slot0的算法,可以不指定其他index
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --set "cmd_type=1" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
# 关闭算法
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --set "cmd_type=2" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
# 获取算法状态是否使能
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --set "cmd_type=3" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
# 获取算法的参数个数
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --set "cmd_type=4" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
其中algo_slot=x表示去操作哪个algo_slot的信息,这里都是入参,用来指定操作某个slot的信息。然后cmd_type用来表示做什么操作。(使能、关闭、状态;获取算法,获取算法参数个数)
如果指定cmd_type是0-4,就必须在indexes中指定所使用的algo_slot的值。表示去操作第几个alot的数据。每个slot里面跑的是某个算法,比如要使能某个算法,就需要cmd_type=1, 并且指定对应的algo_slot。
这里的algo num是在PCC算法里面指定过去的
开启counter的方法:
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --set "cmd_type=1,counter_en=1" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
3.2 cmd_type类型:算法参数(algo parameter):每种算法的子属性(4个cmd:获取、设置、获取并清空)
背后本质应该是一个二维数组,并且是在asic的芯片上的资源,然后PPCC这个寄存器是用来给软件留的API来查询的。比如最大支持16个cc算法,asic芯片提供16个存储单元的内存资源存储这些算法,开关使能以及读取状态,还有参数个数。并且这些算法数组使用algo_slot来检索。
并且还提供了参数的数组,比如每个算法最大32个参数。并且这些参数使用algo_param_index来检索。所以下图里面需要提供algo_slot和algo_param_index来确定到某个algo的某个参数。然后进行获取、设置、获取并清空,以及参数信息的说明。并且其中参数信息的说明包括了默认值、最大最小和权限。

3.3 cmd_type类型:批量获取某个algo_slot的信息:批量获取、设置参数。获取counter或counter数量
批量获取包括
使用方式就是mlxreg然后指定PPCC寄存器,并且指定cmd_type说明作用,并且用index告诉硬件去获取哪些信息
支持批量的信息:
- 0xA(cmd_type): 批量获取参数,输出参数数量长度(是参数数量*4)单位bytes,以及多个参数信息(这个应该比较常用)
- 0xB: 批量设置参数,输入是指定len和具体指
- 0xC: 批量计数器,输出是长度和具体指
- 0xD: 批量获取和清空计数器
- 0xE: 获取counter的数量,输出数量
指定这些cmd之后就能进行相关操作

参数配置举例,type写成10进制
# 获取counter
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --get --op "cmd_type=12" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
# 获取并清空counter
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --get --op "cmd_type=13" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=0,algo_param_index=0"
3.4 cmd_type类型:counter相关cmd_type

3.5 cmd_type类型:终极命令 0x10 一应俱全
获取所有的algo信息。会列出所有的algo,以及相关参数。

4. PCC编程中一些相关操作
前面提到了如何通过mlxreg命令,从host上获取到网卡里面PCC寄存器的一些信息和设置信息。
PCC寄存器里面的slot和param可以通过mlxreg操作,主要还是通过pcc框架通过编码进行操作。一些关键的pcc框架接口。注意这些接口都是运行在DPA中的代码,就好比运行在RTOS系统中的接口,用来在DPA的核心上RTOS系统启动某些事物和分配某些资源以及管理某些配置。
4.1 参数解析模块
pcc中参数依赖arg paraser模块,该模块会分配资源。doca_argp_init(); 初始化资源。
pcc参数通过register_pcc_params();来注册某个slot的参数,也就是cmd_type关于params部分的数量会通过这些接口分配或者设置资源。具体是DPA中的软件分配资源还是硬件预留资源未知。
pcc通过doca_argp_start();启动参数解析模块。
4.2 初始化
pcc通过pcc_init();初始化,包括打开doca设备、创建上下文、配置处理CC事件的threads
4.3 启动PCC
pcc通过doca_pcc_start();启动doca pcc。会创建pcc进程和其他资源,并且触发pcc的初始化,以及注册pcc到硬件上以让cc事件,以便能够生成事件,以及事件处理函数能够被触发,然后从DPA发送到NIC。
这里背后doca框架应该会配置硬件的寄存器进行配置rtos上的中断,然后中断处理例程里面又提供总线或其他通道告诉NIC。
4.4 进入监控循环
pcc通过doca_pcc_get_process_state();来获取事件状态,并且通过doca_pcc_wait();来等待事件发生。
相当于是一个类似select多路选择器的函数实现,wait是一个阻塞式的,get或退出阻塞或获取信息的。
并且整个doca pcc的框架,就是一个rtos上启动的一个thread,并且thread绑定到某个核(本来不用bind,但是为了性能)。然后在这个thread的主程序中进行pcc相关的接口操作。并且接口是遵循一个初始化,然后while(wait){get state}这样的一个轮训范式。
处理的四种状态:
- DOCA_PCC_PS_ACTIVE = 0 进程处理 CC 事件(在给定时间只有一个进程处于活动状态)
- DOCA_PCC_PS_STANDBY = 1 进程处于待机模式(另一个进程已 ACTIVE )
- DOCA_PCC_PS_DEACTIVATED = 2 该进程已被BlueField Platform固件停用,应予以销毁
- DOCA_PCC_PS_ERROR = 3 进程处于错误状态,应销毁
4.5 退出pcc
包括将pcc释放doca_pcc_destroy();以及argp的释放doca_argp_destroy()。
其中pcc的释放包括释放pcc资源,停止pcc的event handle和关闭doca设备。
5. 核心
- 硬件层:PCC支持多个slot,每个slot支持多个param。使用某个slot的时候有counter。
- PCC软件层:遵循 “初始化-while等待获取事件-释放资源”的面向过程的三部曲流程。
本质是软硬件结合,软件配置和定义,很多工作交给硬件,硬件加速。软硬件交互通过中断和事件交互。
6. 综述
- 三种对象:algo slot、parameter、counter;隶属关系:slot包含parameter并且指定个数,通过reg注册。counter也是如此。
- 3类15个cmd:包括对slot、param、counter三类的命令,包括读取、设置、信息等15个cmd
- mlxreg中,cmd_type表示要做什么对象的什么操作,然后通过index去指定具体哪个对象。
- Mellanox网卡通过提供一个看似八股文的方式,提供了一种给用户的灵活的可编程的方式,并且通过pcc接口进行软件编程运行在DPA核,通过mlxreg从host主机获取信息的交互式架构。然后PCC背后通过配置-事件-处理软件来进行定制化操作达到软硬件沟通,进一步完成软件定义硬件加速的作用。
参考:
https://docs.nvidia.com/doca/sdk/nvidia+doca+pcc+application+guide/index.html
4888

被折叠的 条评论
为什么被折叠?



