原力注入

Nvidia DOCA 编程入门

DOCA 编程入门

本文档旨在为开发者提供一份全面的 NVIDIA DOCA 编程入门指南。内容涵盖了 DOCA 软件框架的核心组件、安装配置流程,并结合 LMCache 项目的实际需求,详细解析了零拷贝传输、控制平面卸载、计算卸载等典型应用场景的编程实践,帮助开发者快速掌握利用 BlueField DPU 加速数据中心工作负载的关键技术。

1. BlueField 与 DOCA 简介

1.1 BlueField DPU 概述

NVIDIA BlueField 网络平台(DPU 和 SuperNIC)是适用于现代数据中心基础设施的先进计算平台。它将基础设施服务域与工作负载域隔离开来,从而显著提高应用程序和服务器的性能、安全性和效率。

  • • 核心价值:
    • • 卸载 (Offload):将网络、存储和安全任务从 CPU 转移到 DPU,释放 CPU 算力。
    • • 加速 (Accelerate):利用 DPU 内置的硬件加速引擎(如数据压缩、加密、正则匹配)处理特定工作负载。
    • • 隔离 (Isolate):实现基础设施服务与业务应用的物理隔离,提供零信任安全环境。

1.2 DOCA 软件框架

NVIDIA DOCA (Data Center on a Chip Architecture) 是解锁 BlueField DPU 潜力的关键软件框架。它为开发者提供了一套行业标准的开放 API、驱动程序、库、工具和示例应用程序。

  • • DOCA SDK:包含用于开发加速应用程序的库和驱动程序。支持 RDMA 加速、网络流处理 (Flow)、存储虚拟化 (Emulation)、正则表达式匹配 (RegEx) 等功能。
  • • DOCA Runtime:包含用于在数据中心大规模部署、配置和编排容器化服务的工具。
  • • DOCA-Host:安装在主机服务器上的软件包,提供与 BlueField DPU 通信所需的驱动和接口。

通过 DOCA,开发者可以构建软件定义、云原生的加速服务,满足高性能计算和 AI 云的需求。


2. DOCA 软件组件

Image
DOCA Software Stack

DOCA 软件栈由一系列分层的库和驱动程序组成,旨在为 DPU 开发提供统一且高效的接口。其核心组件可以分为以下三类:

2.1 基础库 (Base Libraries)

基础库为所有 DOCA 应用程序提供了底层的支撑功能,确保开发的一致性和便捷性。

  • • doca_common: DOCA 生态系统的基石。
    • • 日志记录 (DOCA_LOG): 提供分级日志系统,支持将日志输出到控制台或文件,方便调试和运维。
    • • 错误处理 (doca_error_t): 定义了统一的错误码规范,简化了跨模块的错误传播和处理。
    • • 基础数据结构: 提供了链表、哈希表等经过优化的高性能数据结构。
  • • doca_argp: 命令行参数解析库。
    • • 允许开发者轻松定义和解析应用程序的启动参数(如 PCI 地址、配置文件路径等),减少样板代码。
  • • doca_buf: 高性能内存缓冲区管理。
    • • 支持复杂的内存布局(如 Scatter-Gather Lists, SGL),是数据平面处理的核心数据结构。
    • • 提供引用计数机制,确保零拷贝场景下的内存安全。

2.2 核心运行时库 (Core Runtime Libraries)

运行时库是 DOCA 的核心,封装了 BlueField DPU 的硬件加速能力,涵盖网络、存储、计算和控制平面。

  • • 数据传输与存储
    • • DOCA DMA (doca_dma):
      • • 提供主机 (Host) 与 DPU 之间、以及 DPU 内部内存的高效直接内存访问。
      • • 支持异步操作模式,允许 CPU 在数据搬运期间处理其他任务,显著降低 CPU 占用。
    • • DOCA Compress (doca_compress):
      • • 利用 DPU 内置的硬件压缩引擎(支持 Deflate, LZ4 等算法)。
      • • 相比 CPU 软压缩,提供数倍的吞吐量提升,同时释放 CPU 算力。
  • • 网络与流处理
    • • DOCA Flow (doca_flow):
      • • 提供基于硬件流表的数据包处理管道。
      • • 支持复杂的动作链(Match-Action),如修改包头、封装/解封装 (Tunneling)、转发、丢弃等。
      • • 是构建软件定义网络 (SDN) 和防火墙应用的基础。
  • • 控制平面与通信
    • • DOCA Comch (doca_comch):
      • • 建立主机与 DPU 之间可靠的控制平面通信通道。
      • • 屏蔽了底层的 PCIe/Socket 细节,提供类似于 Socket 的消息收发接口。
      • • 适用于配置下发、状态同步和心跳检测等场景。
  • • 异构计算
    • • DOCA DPA (doca_dpa):
      • • 数据路径加速器 (Data Path Accelerator) 接口。
      • • 允许开发者编写自定义的内核代码 (Kernel),运行在 DPU 的轻量级 RISC-V 核心上。
      • • 适用于极低延迟的数据包处理或计算密集型的近数据处理任务。

2.3 服务与应用 (Services & Applications)

DOCA 还提供了一系列预构建的服务和参考应用,帮助开发者快速落地。

  • • DOCA App Shield (doca_apsh): 利用 DPU 对主机内存进行带外 (Out-of-Band) 监控,实现入侵检测和恶意软件分析。
  • • DOCA Firefly: 提供高精度的时间同步服务 (PTP),适用于金融交易和电信网络。
  • • DOCA Telemetry: 收集 DPU 的运行指标和性能数据,集成到 Prometheus/Grafana 等监控系统。

3. 示例代码构建指南

本章节主要介绍如何获取和编译 doca-samples 示例代码。在此之前,请确保您已经拥有 NVIDIA BlueField DPU 硬件,并且已经按照官方文档安装了 DOCA SDK(这是编译和运行示例的前提条件)。

安装资源:

  • • NVIDIA DOCA Installation Guide for Linux: 详细的安装指南,包含 Host 和 DPU 端的配置。
  • • NVIDIA DOCA Developer Guide: 开发环境搭建与 SDK 使用说明。

3.1 获取示例代码

DOCA 提供了丰富的示例代码,托管在 GitHub 上。首先,克隆 doca-samples 仓库:

git clone https://github.com/NVIDIA-DOCA/doca-samples.git
cd
 doca-samples

3.2 编译环境准备

DOCA 使用 meson 和 ninja 作为构建系统。请确保您的开发环境中已安装这些工具。

3.3 编译应用程序

参考应用程序位于 applications 目录下。编译步骤如下:

  1. 1. 进入应用程序目录:
    cd applications
  2. 2. 配置构建目录(默认使用 Debug 模式):
    meson /tmp/build

    注意:默认编译为 Debug 模式,包含调试符号且未优化。如果需要 Release 模式,请查阅 Meson 文档配置优化选项。

  3. 3. 开始编译:
    ninja -C /tmp/build
  4. 4. 编译完成后,二进制文件将位于 /tmp/build/<application_name>/ 目录下。

3.4 开发者配置

如果需要开启 DOCA 的追踪日志 (Trace Log) 以进行深度调试,可以在配置 Meson 时添加参数:

meson /tmp/build -Denable_trace_log=true

4. 开发环境与调试指南

4.1 编程语言支持

DOCA 提供了多语言的开发支持,以适应不同的应用场景。

4.1.1 C 语言 (Core)

DOCA SDK 的核心库(如 doca_dma, doca_flow, doca_comch)均提供标准的 C API。这是开发高性能数据平面应用(如 LMCache 存储引擎)的首选语言,能提供对硬件最细粒度的控制和最低的延迟。

4.1.2 Python (Management & Scripts)

虽然核心数据路径通常使用 C 开发,但 DOCA 提供了部分 Python 绑定和工具,适用于管理平面、自动化脚本和快速原型验证。

  • • PyDOCA: 部分 DOCA 库提供 Python 绑定。
  • • 辅助工具: 如 doca_devemu 示例中包含 rpc_nvmf_doca.py 脚本,用于通过 RPC 配置 SPDK 后端。

4.1.3 DOCA DPL (P4)

DPL (DOCA Pipeline Language) 是一种基于 P4-16 的领域特定语言,专用于编写 BlueField DPU 的数据平面流水线。

  • • 适用场景: 软件定义网络 (SDN)、自定义包处理逻辑。
  • • 编译器 (dplp4c): 将 P4 代码编译为 DPU 硬件可执行的配置。
    dplp4c.sh --target doca my_program.p4
  • • 开发流程: 编写 P4 代码 -> 使用 dplp4c 编译 -> 通过 DPL Runtime Service 加载到 DPU。

4.2 性能评测工具 (doca_bench)

doca_bench 是一个通用的性能基准测试工具,用于评估 DOCA API 在不同配置下的吞吐量和延迟。

  • • 基本用法:
    doca_bench --csv-output-file /tmp/results.csv --latency-bucket-range 0,100 ...
  • • 关键参数:
    • • --csv-output-file <path>: 将测试结果输出为 CSV 文件,便于后续分析。
    • • --csv-append-mode: 追加模式,适合批量运行测试并汇总结果。
    • • --latency-bucket-range <start,width>: 自定义延迟直方图的桶范围,用于精细化分析长尾延迟。

4.3 Flow 调优工具 (doca_flow_tune)

doca_flow_tune 用于分析和优化 doca_flow 应用程序的规则下发和匹配性能。它包含 DPU 端的 Server 和 Host 端的 CLI 工具。

  • • 主要模式:
  1. 1. Monitor (monitor): 实时监控软件 KPI 和硬件计数器。
    doca_flow_tune monitor background
  2. 2. Analyze (analyze): 分析 Flow 管道结构,检测潜在瓶颈。
    doca_flow_tune analyze export --file-name pipeline_dump.json
  3. 3. Visualize (visualize): 将导出的 JSON 描述转换为 Mermaid 图表,直观展示流表层级。
    doca_flow_tune visualize --pipeline-desc pipeline_dump.json --file-name flow_graph.mmd

    生成的 .mmd 文件可以使用 Mermaid Live Editor 渲染为流程图。

4.4 DPA 调试 (doca-dpa-gdb)

针对运行在 RISC-V 核心上的 DPA 程序,DOCA 提供了专用的 GDB Server 工具。

  • • 功能: 支持断点、单步执行、查看寄存器和内存。
  • • 限制:
    • • 不支持捕获 Fatal Errors。
    • • 不支持访问 Window 内存区域。
    • • 需配合 Host 端的 GDB 客户端使用。
  • • 使用方式:
    在 DPU 上启动 Server,然后使用 GDB 远程连接进行调试。