Fast-DDS的benchmark
示例是一个用于测试DDS通信性能的工具,主要通过发布者(Publisher)和订阅者(Subscriber)之间的消息传输,验证不同配置下的吞吐量等性能指标。以下是代码结构和核心逻辑的梳理:
一、代码结构
示例位于Fast-DDS/examples/cpp/benchmark
,主要文件及功能如下:
文件/目录 | 功能描述 |
---|---|
main.cpp | 程序入口,解析命令行参数,初始化发布者/订阅者应用,并启动运行。 |
Application.hpp/cpp | 抽象应用基类,定义发布者和订阅者的通用接口(如run() 、stop() )。 |
PublisherApp.hpp/cpp | 发布者实现类,负责按配置发送消息,并统计吞吐量。 |
SubscriberApp.hpp/cpp | 订阅者实现类,负责接收消息并记录接收情况。 |
CLIParser.hpp | 命令行参数解析,处理用户输入的配置(如消息大小、传输协议、QoS策略等)。 |
types/ | 定义不同大小的消息类型(通过IDL生成),如Benchmark_small (16KB)、Benchmark_big (8MB)等。 |
benchmark_profile.xml | DDS QoS配置文件,定义参与者、数据读写器的可靠性、持久性等策略。 |
CMakeLists.txt | 编译配置,生成可执行文件并复制XML配置到构建目录。 |
二、核心逻辑
1. 消息类型设计
types/
目录下的消息类型通过IDL定义,并由fastddsgen
工具生成C++代码,支持不同大小的消息传输:
BenchMark
:仅包含一个uint32_t
索引(无附加数据)。BenchMarkSmall
:包含uint32_t
索引 + 16KB数组(std::array<char, 16384>
)。BenchMarkMedium
:包含uint32_t
索引 + 512KB数组(std::array<char, 524288>
)。BenchMarkBig
:包含uint32_t
索引 + 8MB数组(std::array<char, 8388608>
)。
这些类型用于模拟不同大小的 payload,测试DDS在不同数据量下的性能。
2. 命令行参数解析(CLIParser.hpp
)
支持配置多种运行参数,核心配置项如下:
- 角色:
publisher
或subscriber
(必选)。 - 消息大小:
NONE
(默认)、SMALL
、MEDIUM
、BIG
(对应上述消息类型)。 - 传输协议:
DEFAULT
(SHM + UDPv4)、SHM
(共享内存)、UDPv4
、LARGE_DATA
(大数据模式)。 - QoS策略:
- 可靠性(
--reliable
):可靠传输(默认)或尽力而为(未指定时)。 - 持久性(
--transient-local
):瞬态本地(默认)或volatile。
- 可靠性(
- 发布者特有参数:
- 消息发送间隔(
-i
,默认100ms)。 - 运行超时时间(
-to
,默认10s)。 - 发送样本数(
-s
,默认无限)。
- 消息发送间隔(
解析后的参数被封装到benchmark_config
结构体,用于初始化发布者/订阅者。
3. 发布者逻辑(PublisherApp.cpp
)
- 初始化:根据配置创建DDS参与者(Participant)、主题(Topic)、数据写入器(DataWriter),并等待订阅者发现(通过
matched_
变量判断)。 - 消息发送:
- 循环发送消息,根据配置的
interval
控制发送间隔。 - 消息索引自增,用于跟踪发送顺序。
- 循环发送消息,根据配置的
- 性能统计:
- 记录总运行时间、发送样本数。
- 计算吞吐量(每秒传输字节数),并按
Gbps
/Mbps
/Kbps
格式化输出。
4. 订阅者逻辑(隐含于代码结构)
- 初始化:创建DDS参与者、主题、数据读取器(DataReader),等待发布者发现。
- 消息接收:通过回调函数接收消息,记录接收的样本索引,验证消息完整性。
- 匹配与退出:持续运行直至接收指定数量的样本或被中断(Ctrl+C)。
5. QoS配置(benchmark_profile.xml
)
默认配置:
- 参与者(Participant):使用域ID 0。
- 数据写入器/读取器:
- 可靠性:可靠(
RELIABLE
)。 - 持久性:瞬态本地(
TRANSIENT_LOCAL
)。 - 历史记录:保留最后100个样本(
KEEP_LAST
,深度100)。
- 可靠性:可靠(
用户可修改XML文件调整QoS策略,测试不同配置对性能的影响。
三、运行流程
- 编译:通过
CMake
构建,生成benchmark
可执行文件。 - 启动订阅者:
./benchmark subscriber [选项] # 如指定消息大小:--msg-size BIG
- 启动发布者:
./benchmark publisher [选项] # 如指定传输协议:--transport SHM
- 输出结果:发布者完成后输出总样本数、吞吐量等统计信息(示例如下):
RESULTS after 1206 milliseconds: COUNT: 500 SAMPLES: 41,46,44,... THROUGHPUT BPS: 3.48482 Gbps
四、核心测试场景
通过组合不同参数,可测试:
- 不同消息大小(16KB~8MB)对吞吐量的影响。
- 传输协议(SHM vs UDPv4)的性能差异(共享内存通常更快)。
- 可靠性QoS(可靠传输 vs 尽力而为)对传输效率的影响。
- 大数据模式(
LARGE_DATA
)对超大消息的处理能力。
该示例为评估Fast-DDS在不同场景下的性能提供了灵活的测试框架。