DOCA 文档 v2.10.0

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 应用程序流程的图示

      image-2024-6-26_14-3-13-version-1-modificationdate-1734469809177-api-v2.png

      当分配或销毁资源时,主机/Arm 应用程序向 BlueField 平台固件发送命令。当发送数据或接收 ACK/NACK/CNP/RTT 数据包时,BlueField 平台硬件会自动生成 CC 事件,然后设备应用程序通过调用用户算法来处理这些事件。在 DPA 应用程序回复硬件后,当前事件的处理完成,可以到达下一个事件。

      信息

      设备/DPA 应用程序还可以为 RP 程序运行不同的算法,用户可以将其配置为运行时选项。

    • 设备/DPA 应用程序可以用作通知点 (NP)。当新的探测请求数据包到达时,用户处理程序可以读取和分析数据并发送探测响应。以下是通用 NP 应用程序流程的图示

      image-2024-6-26_14-1-31-version-1-modificationdate-1734469808900-api-v2.png

      信息

      设备/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 处理的回调,实现为交换机遥测程序以观察最后一跳交换机元数据

此应用程序利用以下 DOCA 库

有关更多信息,请参阅其各自的编程指南。

  • 需要 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 文件中设置所需的标志,而不是在编译命令行中提供它们

  1. 编辑 /opt/mellanox/doca/applications/meson_options.txt 中的以下标志

    • enable_all_applications 设置为 false

    • enable_pcc 设置为 true

  2. 运行以下编译命令

    复制
    已复制!
                

    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 应用程序以源代码形式提供。因此,在执行应用程序之前需要进行编译。

  1. 应用程序使用说明

    复制
    已复制!
                

    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 level for 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. By default the flag is set to false. -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. By default the flag is set to false.  -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. By default the flag is set to false.  -t, --threads <PCC threads list> A list of the PCC threads numbers to be chosen for 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 then false will be chosen.  -hl, --hop-limit <IFA2 hop limit> The IFA2 probe packet hop limit (optional). If not provided then 0XFE will be chosen.  -gns, --global-namespace <IFA2 global namespace> The IFA2 probe packet global namespace (optional). If not provided then 0XF 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 then 0 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 then 0 will be chosen. -f, --coredump-file <PCC coredump file> A pathname to the file to write coredump data in case of unrecoverable error on the device (optional). Must be provided as a string.

    信息

    可以使用 -h(或 --help)选项将此用法打印到命令行

    复制
    已复制!
                

    ./doca_pcc -h

    信息

    有关更多信息,请参阅“命令行标志”部分。

  2. 在 BlueField 平台或主机上运行应用程序的 CLI 示例

    复制
    已复制!
                

    ./doca_pcc -d mlx5_0

    注意

    IB 设备标识符 (mlx5_0) 应与所需 IB 设备的标识符匹配。

  3. 该应用程序还支持基于 JSON 的部署模式,其中所有命令行参数都通过 JSON 文件提供

    复制
    已复制!
                

    ./doca_pcc --json [json_file]

    例如

    复制
    已复制!
                

    ./doca_pcc --json ./pcc_params.json

    注意

    在执行之前,请确保使用的 JSON 文件包含正确的配置参数,尤其是部署所需的 PCIe 地址。

命令行标志

标志类型

短标志

长标志/JSON 键

描述

JSON 内容

通用标志

h

help

打印帮助摘要

N/A

v

version

打印程序版本信息

N/A

l

log-level

设置程序的日志级别

  • DISABLE=10

  • CRITICAL=20

  • ERROR=30

  • WARNING=40

  • INFO=50

  • DEBUG=60

  • TRACE=70

    信息

    该应用程序使用独特的日志记录实现,该实现利用了 DOCA 的日志记录级别。

N/A

N/A

sdk-log-level

设置程序的日志级别

  • DISABLE=10

  • CRITICAL=20

  • ERROR=30

  • WARNING=40

  • INFO=50

  • DEBUG=60

  • TRACE=70

N/A

j

json

从输入 JSON 文件解析所有命令标志

N/A

程序标志

d

device

支持 PCC 的 IB 设备名称

复制
已复制!
            

"device": ""

np-nt

np-nic-telemetry

(可选)指示作为 NP NIC 遥测运行的标志。

DOCA PCC 应用程序可以作为 NP NIC 遥测程序运行。如果使用此标志,则应用程序加载一个程序以在 DPA 上运行,以采样 RX NIC 计数器并在响应数据包中发送它们。

复制
已复制!
            

"np-nic-telemetry": false

rp-st

rp-switch-telemetry

(可选)指示作为 RP 交换机遥测运行的标志。

DOCA PCC 应用程序可以作为 RP 交换机遥测程序运行。如果使用此标志,则应用程序加载一个程序以在交换机遥测算法的 DPA 上运行,该算法从 NP 节点接收来自最后一跳交换机拥塞点的元数据。

复制
已复制!
            

"rp-switch-telemetry": false

np-st

np-switch-telemetry

(可选)指示作为 NP 交换机遥测运行的标志。

DOCA PCC 应用程序可以作为 NP 交换机遥测程序运行。如果使用此标志,则应用程序加载一个程序以在 DPA 上运行,以采样来自最后一跳交换机拥塞点的元数据并在响应数据包中发送它们。

复制
已复制!
            

"np-switch-telemetry": false

t

threads

(可选)要为 DOCA PCC 事件处理程序线程选择运行的 PCC EU 索引列表。必须作为字符串提供,以便数字以空格分隔。

每个核心的 PCC 线程放置可以使用 EU 索引来控制。使用大量的 EU,同时限制每个核心的线程数,可以提供最佳的事件处理速率和最低的事件延迟。

最后一个 EU 用于与 BlueField 平台通信,而所有其他 EU 用于数据路径 CC 事件处理。

注意

如果用户选择 np-nic-telemetry 选项,则将选择一组不同的线程作为默认列表。

复制
已复制!
            

"pcc-threads": "176 177 178 179 180 181 182 183  184 185 186 187 192 193 194 195 196 197 198 199  200 201 202 203 208 209 210 211 212 213 214 215  216 217 218 219 224 225 226 227 228 229 230 231  232 233 234 235 240"

w

wait-time

(可选)以秒为单位,DOCA PCC 等待的持续时间。负值表示无限。

复制
已复制!
            

"wait-time": -1

r-handler

remote-sw-handler

(可选)CCMAD 远程 SW 处理程序标志。与 RP 上下文相关。此标志指示预期的 CCMAD 探测数据包响应是否由远程 DOCA NP 进程生成。

注意

如果使用 CCMAD 以外的其他探测类型,则探测数据包响应始终应从远程 DOCA NP 进程生成。

复制
已复制!
            

"remote-sw-handler": false

hl

hop-limit

(可选)IFA2 探测数据包跳数限制

信息

与 RP 上下文相关。

复制
已复制!
            

"hop-limit": 0xFE

gns

global-namespace

(可选)IFA2 探测数据包全局命名空间

信息

与 RP 上下文相关。

复制
已复制!
            

"global-namespace": 0xF

gns-ignore-mask

global-namespace-ignore-mask

(可选)IFA2 探测数据包全局命名空间忽略掩码

信息

与 NP 上下文相关。

复制
已复制!
            

"global-namespace-ignore-mask": 0

gns-ignore-val

global-namespace-ignore-value

(可选)IFA2 探测数据包全局命名空间忽略值

信息

与 NP 上下文相关。

复制
已复制!
            

"global-namespace-ignore-value": 0

f

coredump-file

(可选)如果设备上发生不可恢复的错误,则写入核心转储数据的文件路径名

复制
已复制!
            

"coredump-file": "/tmp/doca_pcc_coredump.txt"

信息

有关支持的标志和执行模式的更多信息,请参阅 DOCA Arg Parser


故障排除

有关 DOCA 应用程序的安装或执行遇到的任何问题,请参阅 DOCA 故障排除

本节列出了应用程序的配置流程,解释了不同的 DOCA 函数调用和包装器。

  1. 解析应用程序参数。

    1. 初始化参数解析器资源并注册 DOCA 通用参数。

      复制
      已复制!
                  

      doca_argp_init();

    2. 注册 PCC 应用程序参数。

      复制
      已复制!
                  

      register_pcc_params();

    3. 解析参数。

      复制
      已复制!
                  

      doca_argp_start();

      1. 解析 DOCA 标志。

      2. 解析 DOCA PCC 参数。

  2. PCC 初始化。

    复制
    已复制!
                

    pcc_init();

    1. 打开支持 PCC 的 DOCA 设备。

    2. 创建 DOCA PCC 上下文。

    3. 配置处理 CC 事件的线程的亲和性。

  3. 启动 DOCA PCC。

    复制
    已复制!
                

    doca_pcc_start();

    1. 创建 PCC 进程和其他资源。

    2. 触发设备上 PCC 的初始化。

    3. 在 BlueField 平台硬件中注册 PCC,以便可以生成 CC 事件并触发事件处理程序。

  4. 进程状态监视器循环。

    复制
    已复制!
                

    doca_pcc_get_process_state(); doca_pcc_wait();

    1. 获取进程的状态

      状态

      描述

      DOCA_PCC_PS_ACTIVE = 0

      进程处理 CC 事件(在给定时间只有一个进程处于活动状态)

      DOCA_PCC_PS_STANDBY = 1

      进程处于待机模式(另一个进程已 ACTIVE

      DOCA_PCC_PS_DEACTIVATED = 2

      进程已被 BlueField 平台固件停用,应销毁

      DOCA_PCC_PS_ERROR = 3

      进程处于错误状态,应销毁

    2. 等待来自设备的进程事件。

  5. PCC 销毁。

    复制
    已复制!
                

    doca_pcc_destroy();

    1. 销毁 PCC 资源。进程停止处理 PCC 事件。

    2. 关闭 DOCA 设备。

  6. 参数解析器销毁。

    复制
    已复制!
                

    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_slotalgo_param_index 提供值

  • 保持 local_port=1pnat=0lp_msb=0

  • 保持 doca_pcc 应用程序运行

cmd_type

描述

方法

索引

输入(在 --set 中)

输出

0x0

获取算法信息

获取

algo_slot

N/A

  • 值 – 32 位 algo_num 或 0(如果此索引处没有可用的算法)

  • 文本 – 算法描述

  • sl_bitmask_support – 指示设备是否支持 sl_bitmask 逻辑

0x1

启用算法

设置

sl_bitmask

trace_en

counter_en

N/A

0x2

禁用算法

设置

N/A

N/A

0x3

获取算法启用状态

获取

N/A

    • 0 – 已禁用

    • 1 – 已启用

  • sl_bitmask – 此字段允许基于位掩码应用于特定的 SL

  • sl_bitmask_support – 指示设备是否支持 sl_bitmask 逻辑

0x4

获取参数数量

获取

N/A

  • 值 – 算法的参数数量

0x5

获取参数信息

获取

algo_slot

algo_param_index

N/A

  • param_value1 – 参数的默认值

  • param_value2 – 参数的最小值

  • param_value3 – 参数的最大值

  • prm –

    • 0:只读

    • 1:读写

    • 2:只读,但可以使用“获取并清除”命令清除

0x6

获取参数值

获取

N/A

  • 值 – 参数值

0x7

获取并清除参数

获取

N/A

  • 值 – 参数值

0x8

设置参数值

设置

参数值

N/A

0xA

批量获取参数

获取

algo_slot

N/A

  • text_length – 参数数量 x 4 字节

  • text[0]…text[n] – 参数值

0xB

批量设置参数

设置

text_length - 参数数量 x 4

text[0]…text[n] - 参数值

N/A

0xC

批量获取计数器

获取

N/A

  • text_length – 计数器数量 x 4 字节

  • text[0]…text[n] – 计数器值

0xD

批量获取并清除计数器

获取

N/A

  • text_length – 计数器数量 x 4 字节

  • text[0]…text[n] – 计数器值

0xE

获取计数器数量

获取

N/A

  • 值 – 算法的计数器数量

0xF

获取计数器信息

获取

algo_slot

algo_param_index

N/A

  • param_value3 – 参数的最大值

  • prm –

    • 0:只读

    • 1:读写

    • 2:只读,但可以通过“获取并清除”命令清除

0x10

获取算法信息数组

获取

N/A

N/A

  • text_length – 初始化的算法槽数量 x 4 字节

  • text[0]…text[n] – 32 位 algo_num 或 0(如果此槽索引处没有可用的算法)


内部默认算法

当增强连接建立 (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

© 版权所有 2025,NVIDIA。 上次更新于 2025 年 2 月 12 日。