DOCA PCC 应用指南
本文档提供在 NVIDIA® BlueField® 网络平台之上实现的 DOCA PCC。
可编程拥塞控制 (PCC) 允许用户设计和实现自己的拥塞控制 (CC) 算法,从而使他们能够灵活地制定最佳解决方案来处理集群中的拥塞。在 BlueField-3 网络平台上,PCC 作为 DOCA 的一个组件提供。
该应用程序利用 DOCA PCC API,为用户提供根据其需求管理 DPA 资源分配的灵活性。
典型的 DOCA 应用程序包括在主机/Arm 上运行的应用程序和在 DPA 上运行的应用程序。建议开发人员使用主机/Arm 应用程序进行最小的更改,并将重点放在开发其算法并将其集成到 DPA 应用程序中。
DOCA PCC 应用程序由两部分组成
主机/Arm 应用程序是控制平面。它负责分配所有资源并最初移交给 DPA 应用程序,然后在 DPA 应用程序完成其操作时销毁所有内容。主机应用程序必须始终保持活动状态才能保持控制,而设备应用程序正在工作。
设备/DPA 应用程序是数据平面。
数据平面的默认模式是作为反应点 (RP) 运行。当第一个线程被激活时,DPA 应用程序初始化在 DOCA PCC 库中完成,方法是调用用户在应用程序中实现的算法初始化函数。此外,当 CC 事件到达时,将调用用户算法执行函数。用户算法将事件数据作为输入并执行计算,使用每个流的上下文,并回复更新的速率值和一个发送 RTT 请求的标志。以下是通用 RP 应用程序流程的图示
当分配或销毁资源时,主机/Arm 应用程序向 BlueField 平台固件发送命令。当发送数据或接收 ACK/NACK/CNP/RTT 数据包时,BlueField 平台硬件会自动生成 CC 事件,然后设备应用程序通过调用用户算法来处理这些事件。在 DPA 应用程序回复硬件后,当前事件的处理完成,可以到达下一个事件。
信息设备/DPA 应用程序还可以为 RP 程序运行不同的算法,用户可以将其配置为运行时选项。
设备/DPA 应用程序可以用作通知点 (NP)。当新的探测请求数据包到达时,用户处理程序可以读取和分析数据并发送探测响应。以下是通用 NP 应用程序流程的图示
信息设备/DPA 应用程序还能够用作 NP NIC 或交换机操作的遥测程序,用户可以将其配置为运行时选项。
/opt/mellanox/doca/applications/pcc/
├── host
│ ├── pcc.c
│ ├── pcc_core.c
│ └── pcc_core.h
└── device
├── pcc_common_dev.h
├── rp
│ ├── rtt_template
│ │ ├── algo
│ │ │ ├── rtt_template.h
│ │ │ ├── rtt_template_algo_params.h
│ │ │ ├── rtt_template_ctxt.h
│ │ │ └── rtt_template.c
│ │ └── rp_rtt_template_dev_main.c
│ └── switch_telemetry
│ ├── algo
│ │ ├── telem_template.h
│ │ ├── telem_template_algo_params.h
│ │ ├── telem_template_ctxt.h
│ │ └── telem_template.c
│ └── rp_switch_telemetry_dev_main.c
└── np
├── nic_telemetry
│ └── np_nic_telemetry_dev_main.c
└── switch_telemetry
└── np_switch_telemetry_dev_main.c
参考 DOCA PCC 应用程序文件的主要内容如下
host/pcc.c
– 整个应用程序的入口点host/pcc_core.c
– 用于初始化和销毁 PCC 应用程序资源的主机函数,PCC 命令行参数的解析器device/pcc_common_dev.h
– 设备程序的通用实用程序调用和定义device/rp/rtt_template/rp_rtt_template_dev_main.c
– 用户 CC 算法初始化、用户 CC 算法计算以及 RTT 模板算法参考的算法参数更改通知的回调device/rp/rtt_template/algo/*
– RTT 模板的用户 CC 算法参考。将用户算法代码放在此处device/rp/switch_telemetry/rp_switch_telemetry_dev_main.c
– 用户 CC 算法初始化、用户 CC 算法计算以及交换机遥测算法参考的算法参数更改通知的回调device/rp/switch_telemetry/algo/*
– 交换机遥测的用户 CC 算法参考。将用户算法代码放在此处。device/np/nic_telemetry/np_nic_telemetry_dev_main.c
– 用户 NP 处理的回调,实现为 NIC 遥测程序以观察 RX 计数器device/np/switch_telemetry/np_switch_telemetry_dev_main.c
– 用户 NP 处理的回调,实现为交换机遥测程序以观察最后一跳交换机元数据
需要 NVIDIA BlueField-3 平台
固件 32.38.1000 及更高版本
MFT 4.25 及更高版本
请参阅 DOCA Linux 安装指南,了解有关如何安装 BlueField 相关软件的详细信息。
DOCA 参考应用程序的安装包含应用程序的源代码以及匹配的编译说明。这允许“按原样”编译应用程序,并提供修改源代码,然后编译应用程序新版本的能力。
有关应用程序以及开发和编译提示的更多信息,请参阅 DOCA 参考应用程序页面。
应用程序的源代码可以在应用程序的目录下找到:/opt/mellanox/doca/applications/pcc/
。
编译所有应用程序
所有 DOCA 应用程序都在单个 meson 项目下定义。因此,默认情况下,编译包括所有应用程序。
要一起构建所有应用程序,请运行
cd /opt/mellanox/doca/applications/
meson /tmp/build
ninja -C /tmp/build
doca_pcc
在 /tmp/build/pcc/
下创建。
仅编译当前应用程序
要直接仅构建 PCC 应用程序
cd /opt/mellanox/doca/applications/
meson /tmp/build -Denable_all_applications=false
-Denable_pcc=true
ninja -C /tmp/build
doca_pcc
在 /tmp/build/pcc/
下创建。
或者,可以在 meson_options.txt
文件中设置所需的标志,而不是在编译命令行中提供它们
编辑
/opt/mellanox/doca/applications/meson_options.txt
中的以下标志将
enable_all_applications
设置为false
将
enable_pcc
设置为true
运行以下编译命令
cd /opt/mellanox/doca/applications/ meson /tmp/build ninja -C /tmp/build
信息doca_pcc
在/tmp/build/pcc/
下创建。
编译选项
该应用程序提供特定的编译标志,可以为设备/DPA 程序中的所需行为设置这些标志。
在 meson_options.txt
文件中,可以找到以下选项
enable_pcc_application_tx_counter_sampling
:设置为true
以在 RP CC 处理算法中使用运行时采样的 TX 计数器。enable_pcc_application_np_rx_rate
:设置为true
以在 RP CC 处理算法中使用从 NP 接收的 RX 计数器。
故障排除
有关应用程序编译遇到的任何问题,请参阅 DOCA 故障排除。
先决条件
在 mlxconfig
中启用 USER_PROGRAMMABLE_CC
mlxconfig -y -d /dev/mst/mt41692_pciconf0 set USER_PROGRAMMABLE_CC=1
执行 BlueField 系统重启,以使 mlxconfig
设置生效。
应用程序执行
PCC 应用程序以源代码形式提供。因此,在执行应用程序之前需要进行编译。
应用程序使用说明
Usage: doca_pcc [DOCA Flags] [Program Flags] DOCA Flags: -h, --help Print a help synopsis -v, --version Print program version information -l, --log-level Set the (numeric) log level
for
the program <10
=DISABLE,20
=CRITICAL,30
=ERROR,40
=WARNING,50
=INFO,60
=DEBUG,70
=TRACE> --sdk-log-level Set the SDK (numeric) log levelfor
the program <10
=DISABLE,20
=CRITICAL,30
=ERROR,40
=WARNING,50
=INFO,60
=DEBUG,70
=TRACE> -j, --json <path> Parse all command flags from an input json file Program Flags: -d, --device <IB device names> IB device name that supports PCC (mandatory). -np-nt, --np-nic-telemetry <PCC Notification Point NIC Telemetry> Flag to indicate running as a Notification Point NIC Telemetry (optional). The application will generate CCMAD probe packets. Bydefault
the flag is set tofalse
. -rp-st, --rp-switch
-telemetry <PCC Reaction Point Switch Telemetry> Flag to indicate running as a Reaction Point Switch Telemetry (optional). The application will generate IFA2 probe packets. Bydefault
the flag is set tofalse
. -np-st, --np-switch
-telemetry <PCC Notification Point Switch Telemetry> Flag to indicate running as a Notification Point Switch Telemetry (optional). The application will generate IFA2 probe packets. Bydefault
the flag is set tofalse
. -t, --threads <PCC threads list> A list of the PCC threads numbers to be chosenfor
the DOCA PCC context to run on (optional). Must be provided as a string, such that the number are separated by a space. -w, --wait-time <PCC wait time> The duration of the DOCA PCC wait (optional), can provide negative values which means infinity. If not provided then -1
will be chosen. -r-handler, --remote-sw-handler <CCMAD remote SW handler> CCMAD remote SW handler flag (optional). If not provided thenfalse
will be chosen. -hl, --hop-limit <IFA2 hop limit> The IFA2 probe packet hop limit (optional). If not provided then0XFE
will be chosen. -gns, --global-namespace <IFA2 global namespace> The IFA2 probe packet global namespace (optional). If not provided then0XF
will be chosen. -gns-ignore-mask, --global-namespace-ignore-mask <IFA2 global namespace ignore mask> The IFA2 probe packet global namespace ignore mask (optional). If not provided then0
will be chosen. -gns-ignore-val, --global-namespace-ignore-value <IFA2 global namespace ignore value> The IFA2 probe packet global namespace ignore value (optional). If not provided then0
will be chosen. -f, --coredump-file <PCC coredump file> A pathname to the file to write coredump data incase
of unrecoverable error on the device (optional). Must be provided as a string.信息可以使用
-h
(或--help
)选项将此用法打印到命令行./doca_pcc -h
信息有关更多信息,请参阅“命令行标志”部分。
在 BlueField 平台或主机上运行应用程序的 CLI 示例
./doca_pcc -d mlx5_0
注意IB 设备标识符 (
mlx5_0
) 应与所需 IB 设备的标识符匹配。该应用程序还支持基于 JSON 的部署模式,其中所有命令行参数都通过 JSON 文件提供
./doca_pcc --json [json_file]
例如
./doca_pcc --json ./pcc_params.json
注意在执行之前,请确保使用的 JSON 文件包含正确的配置参数,尤其是部署所需的 PCIe 地址。
命令行标志
标志类型 | 短标志 | 长标志/JSON 键 | 描述 | JSON 内容 |
通用标志 |
|
| 打印帮助摘要 | N/A |
|
| 打印程序版本信息 | N/A | |
|
| 设置程序的日志级别
| N/A | |
N/A |
| 设置程序的日志级别
| N/A | |
|
| 从输入 JSON 文件解析所有命令标志 | N/A | |
程序标志 |
|
| 支持 PCC 的 IB 设备名称 |
|
|
| (可选)指示作为 NP NIC 遥测运行的标志。 DOCA PCC 应用程序可以作为 NP NIC 遥测程序运行。如果使用此标志,则应用程序加载一个程序以在 DPA 上运行,以采样 RX NIC 计数器并在响应数据包中发送它们。 |
| |
|
| (可选)指示作为 RP 交换机遥测运行的标志。 DOCA PCC 应用程序可以作为 RP 交换机遥测程序运行。如果使用此标志,则应用程序加载一个程序以在交换机遥测算法的 DPA 上运行,该算法从 NP 节点接收来自最后一跳交换机拥塞点的元数据。 |
| |
|
| (可选)指示作为 NP 交换机遥测运行的标志。 DOCA PCC 应用程序可以作为 NP 交换机遥测程序运行。如果使用此标志,则应用程序加载一个程序以在 DPA 上运行,以采样来自最后一跳交换机拥塞点的元数据并在响应数据包中发送它们。 |
| |
|
| (可选)要为 DOCA PCC 事件处理程序线程选择运行的 PCC EU 索引列表。必须作为字符串提供,以便数字以空格分隔。 每个核心的 PCC 线程放置可以使用 EU 索引来控制。使用大量的 EU,同时限制每个核心的线程数,可以提供最佳的事件处理速率和最低的事件延迟。 最后一个 EU 用于与 BlueField 平台通信,而所有其他 EU 用于数据路径 CC 事件处理。 注意
如果用户选择 |
| |
|
| (可选)以秒为单位,DOCA PCC 等待的持续时间。负值表示无限。 |
| |
|
| (可选)CCMAD 远程 SW 处理程序标志。与 RP 上下文相关。此标志指示预期的 CCMAD 探测数据包响应是否由远程 DOCA NP 进程生成。 注意
如果使用 CCMAD 以外的其他探测类型,则探测数据包响应始终应从远程 DOCA NP 进程生成。 |
| |
|
| (可选)IFA2 探测数据包跳数限制 信息
与 RP 上下文相关。 |
| |
|
| (可选)IFA2 探测数据包全局命名空间 信息
与 RP 上下文相关。 |
| |
|
| (可选)IFA2 探测数据包全局命名空间忽略掩码 信息
与 NP 上下文相关。 |
| |
|
| (可选)IFA2 探测数据包全局命名空间忽略值 信息
与 NP 上下文相关。 |
| |
|
| (可选)如果设备上发生不可恢复的错误,则写入核心转储数据的文件路径名 |
|
有关支持的标志和执行模式的更多信息,请参阅 DOCA Arg Parser。
故障排除
有关 DOCA 应用程序的安装或执行遇到的任何问题,请参阅 DOCA 故障排除。
本节列出了应用程序的配置流程,解释了不同的 DOCA 函数调用和包装器。
解析应用程序参数。
初始化参数解析器资源并注册 DOCA 通用参数。
doca_argp_init();
注册 PCC 应用程序参数。
register_pcc_params();
解析参数。
doca_argp_start();
解析 DOCA 标志。
解析 DOCA PCC 参数。
PCC 初始化。
pcc_init();
打开支持 PCC 的 DOCA 设备。
创建 DOCA PCC 上下文。
配置处理 CC 事件的线程的亲和性。
启动 DOCA PCC。
doca_pcc_start();
创建 PCC 进程和其他资源。
触发设备上 PCC 的初始化。
在 BlueField 平台硬件中注册 PCC,以便可以生成 CC 事件并触发事件处理程序。
进程状态监视器循环。
doca_pcc_get_process_state(); doca_pcc_wait();
获取进程的状态
状态
描述
DOCA_PCC_PS_ACTIVE = 0
进程处理 CC 事件(在给定时间只有一个进程处于活动状态)
DOCA_PCC_PS_STANDBY = 1
进程处于待机模式(另一个进程已
ACTIVE
)DOCA_PCC_PS_DEACTIVATED = 2
进程已被 BlueField 平台固件停用,应销毁
DOCA_PCC_PS_ERROR = 3
进程处于错误状态,应销毁
等待来自设备的进程事件。
PCC 销毁。
doca_pcc_destroy();
销毁 PCC 资源。进程停止处理 PCC 事件。
关闭 DOCA 设备。
参数解析器销毁。
doca_argp_destroy()
端口可编程拥塞控制 (PPCC) 寄存器允许用户配置和读取 PCC 算法及其参数/计数器。
它支持以下功能
在不同端口上启用不同的算法
查询算法和可调参数/计数器的信息
更改算法参数,而无需编译和重新烧录用户映像
查询或清除可编程计数器
用法
可以使用类似于以下的字符串访问 PPCC 寄存器
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"
您必须在其中
设置
cmd_type
和索引为
algo_slot
、algo_param_index
提供值保持
local_port=1
、pnat=0
、lp_msb=0
保持
doca_pcc
应用程序运行
cmd_type | 描述 | 方法 | 索引 | 输入(在 --set 中) | 输出 |
| 获取算法信息 | 获取 |
| N/A |
|
| 启用算法 | 设置 |
| N/A | |
| 禁用算法 | 设置 | N/A | N/A | |
| 获取算法启用状态 | 获取 | N/A |
| |
| 获取参数数量 | 获取 | N/A |
| |
| 获取参数信息 | 获取 |
| N/A |
|
| 获取参数值 | 获取 | N/A |
| |
| 获取并清除参数 | 获取 | N/A |
| |
| 设置参数值 | 设置 | 参数值 | N/A | |
| 批量获取参数 | 获取 |
| N/A |
|
| 批量设置参数 | 设置 |
| N/A | |
| 批量获取计数器 | 获取 | N/A |
| |
| 批量获取并清除计数器 | 获取 | N/A |
| |
| 获取计数器数量 | 获取 | N/A |
| |
| 获取计数器信息 | 获取 |
| N/A |
|
| 获取算法信息数组 | 获取 | N/A | N/A |
|
内部默认算法
当增强连接建立 (ECE) 协商失败时,将使用内部默认算法。它主要用于向后兼容性,可以使用“强制模式”禁用。否则,用户可以更改设备应用程序中的 doca_pcc_dev_user_algo()
以运行特定算法,而无需考虑算法协商。
强制模式命令是按端口的
sudo mlxreg -d /dev/mst/mt41692_pciconf0 -y --get --op "cmd_type=2"
--reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=15,algo_param_index=0"
sudo mlxreg -d /dev/mst/mt41692_pciconf0.1
-y --get --op "cmd_type=2"
--reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=15,algo_param_index=0"
计数器
计数器在端口上共享,并且每个端口仅在一个 algo_slot
上启用。以下命令在启用算法的同时,根据 algo_slot
启用计数器
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"
在 algo_slot
上启用计数器后,可以使用 cmd_type
0xC 或 0xD 查询它们。
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"
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"
/opt/mellanox/doca/applications/pcc/
/opt/mellanox/doca/applications/pcc/pcc_params.json