|
VLink 2.0.0
A high-performance communication middleware
|
VLink 提供了一套完整的命令行工具链,覆盖系统信息查询、环境诊断、节点发现、通信监控、数据录制/回放、消息调试等全场景需求。所有工具统一以 vlink- 为前缀命名,风格一致,可组合使用。
**相关文档**:录制/回放 C++ API 参见 12-bag-recording.md;可视化 GUI 工具参见 14-viewer.md;环境变量配置参见 21-environment-vars.md;节点发现机制参见 17-discovery.md。
| 工具名 | 功能 | 核心依赖 | 编译选项 |
|---|---|---|---|
| vlink-info | 查看版本信息和编译选项 | vlink 基础库 | ENABLE_CLI_INFO |
| vlink-check | 系统环境诊断、环境变量检查 | vlink 基础库、网络工具 | ENABLE_CLI_CHECK |
| vlink-list | 列出活动节点和话题 | DiscoveryViewer | ENABLE_CLI_LIST |
| vlink-monitor | 实时监控通信状态和性能指标 | DiscoveryViewer、Subscriber | ENABLE_CLI_MONITOR |
| vlink-bag | 录制和回放消息数据包 | BagWriter、BagReader | ENABLE_CLI_BAG |
| vlink-dump | 从消息或 bag 文件中提取字段 | Protobuf、FlatBuffers、BagReader、DiscoveryViewer | ENABLE_CLI_DUMP |
| vlink-eproto | Protobuf 消息的发布与订阅 | Protobuf compiler | ENABLE_CLI_EPROTO |
| vlink-efbs | FlatBuffers 消息的发布与订阅 | FlatBuffers IDL | ENABLE_CLI_EFBS |
| vlink-bench | 发布/订阅性能基准测试与报告 | Bench runtime、Pub/Sub、Serializer | ENABLE_CLI_BENCH |
安装后,所有工具位于 <install_prefix>/bin/ 目录,例如 /usr/local/bin/vlink-info。
确保安装目录在 PATH 中:
vlink-info -l 会查找 vlink-options.txt 配置文件,搜索路径依次为:
vlink-info 用于查看当前 VLink 安装的版本号、构建时间戳、Git 标签、Git 提交 ID,以及当前二进制文件编译时启用的所有选项(来自 vlink-options.txt)。
| 参数 | 说明 | 默认值 |
|---|---|---|
| -l / --list_options | 从 vlink-options.txt 读取并打印编译选项 | false |
| -h / --help | 显示帮助 | - |
| -v / --version | 显示版本 | - |
vlink-check 是 VLink 的环境自检工具,分为三个子命令:
| 参数 | 说明 | 默认值 |
|---|---|---|
| -a / --all | 附加检查所有编译选项的开关状态 | false |
| -s / --summary | 执行完毕打印 PASSED / WARNING / FAILED 统计 | false |
| -f / --filter | 仅执行标题包含指定子串的诊断项(调试或脚本化使用) | 空 |
诊断项目列表(标准模式):
平台说明:标记 (Linux) 的项仅在 Linux / Android 上执行,其余平台会打印 "Not applicable on this platform"。
| 分组 | 诊断项 | FAILED 条件 | WARNING 条件 |
|---|---|---|---|
| 构建 / 主机 | Check vlink version | - | - |
| 构建 / 主机 | Check platform info (uname -sr) | - | - |
| 构建 / 主机 | Check hostname | - | hostname 为空 |
| 构建 / 主机 | Check machine id | - | machine id 为空 |
| 构建 / 主机 | Check cpu cores | - | 无法获取 CPU 核数 |
| IP / DDS | Check available IP addresses | 无可用 IP 或仅有 lo(127.0.0.1) | - |
| IP / DDS | Check VLink DDS IP available | VLINK_DDS_IP 设置的 IP 不在网卡中 | VLINK_DDS_IP 未设置 |
| IP / DDS | Check VLink DDS interface | VLINK_DDS_IP 对应的网卡找不到 | VLINK_DDS_IP 未设置 |
| IP / DDS | Check VLink DDS interface MTU (Linux) | MTU < 1280 | MTU < 1500 或无非回环 IP |
| IP / DDS | Check VLink multicast address | 路由表中无 239.255.0.100 | - |
| IP / DDS | Check DDS multicast address | - | 路由表中无 239.255.0.1 |
| IP / DDS | Check VLINK_DDS_DOMAIN range | 不在 [0,232] 范围内 | - |
| 内核 / 网络调优 | Check net.core.rmem_max (Linux) | - | < 2MB(DDS/Zenoh 大流量丢包风险) |
| 内核 / 网络调优 | Check net.core.wmem_max (Linux) | - | < 2MB |
| 内核 / 网络调优 | Check rp_filter (Linux) | - | rp_filter=1(严格模式可能吞掉多播) |
| 进程 / 调度限额 | Check RLIMIT_NOFILE (Unix) | - | < 4096(DDS 会开大量 socket) |
| 进程 / 调度限额 | Check RLIMIT_MEMLOCK (Unix) | - | < 64MB(影响 SHM 零拷贝) |
| 文件系统 | Check available space for log dir | 可用空间 < 1MB | - |
| 文件系统 | Check log dir writable | 目录不可写 | - |
| 文件系统 | Check /dev/shm space (Linux) | < 64MB(SHM/shm2 必然失败) | < 512MB |
| 文件系统 | Check VLINK_PLUGIN_DIR / PROTO_DIR / FBS_DIR | 路径存在但不是目录 | - |
| 文件系统 | Check VLINK_QOS_CONFIG / FASTDDS_QOS_FILE / CYCLONEDDS_URI | 路径存在但不是文件 | - |
| 文件系统 | Check VLINK_LOG_LEVEL value | 不在 [0,6] 范围(含 6=kOff) | - |
| 运行时健康 | Check cpu usage | CPU 占用 > 90% | CPU 占用 > 50% |
| 运行时健康 | Check memory usage | 内存占用 > 90% | 内存占用 > 50% |
| 运行时健康 | Check singleton lock | - | 锁目录可能存在争用 |
| 运行时健康 | Check time sync daemon (Linux) | - | 无 chrony/ntpd/systemd-timesyncd 运行 |
| 运行时健康 | Check iox-roudi running | - | RouDi 未运行(shm:// 依赖它) |
| 进程 | Check proxy running | vlink-proxy 未运行 | - |
| 进程 | Check bag / dump / eproto / efbs running | - | 对应工具正在运行 |
| 进程 | Check monitor / viewer / player running | - | 对应工具正在运行 |
| 进程 | Check analyzer / bench / webviz running | - | 对应工具正在运行 |
| 进程 | Check others running | vlink-list 执行失败 | 仍有 vlink 用户进程在运行 |
附加模式(-a)额外检查的编译选项:
VLINK_ENABLE_CXX_STD_20、VLINK_ENABLE_C_API、VLINK_ENABLE_SECURITY、VLINK_ENABLE_SQLITE、VLINK_ENABLE_ZSTD、各 CLI 工具开关(CLI_INFO / CLI_BAG / CLI_EPROTO / CLI_EFBS / CLI_LIST / CLI_MONITOR / CLI_DUMP / CLI_CHECK)、日志后端(LOG_QUI / LOG_SPD / LOG_DLT / LOG_NAT)、VLINK_ENABLE_PROXY、VLINK_ENABLE_VIEWER、VLINK_ENABLE_EXAMPLES、VLINK_ENABLE_TEST。
退出码: 返回失败项数量,全部通过返回 0。
| 参数 | 说明 | 默认值 |
|---|---|---|
| -b / --available | 只显示已设置的环境变量 | false |
| -p / --prefix | 只显示名字以指定前缀开头的环境变量(如 VLINK_ZENOH_) | 空 |
支持检查的环境变量(按子系统分组,节选):
vlink-check env 打印的是经过人工挑选的子集,**并非 VLink 全部环境变量**。完整清单以 doc/21-environment-vars.md 为准。
| 分组 | 环境变量 | 说明 |
|---|---|---|
| 路径 / 插件 | VLINK_PROTO_DIR、VLINK_FBS_DIR、VLINK_PLUGIN_DIR | Schema 与插件查找目录 |
| 路径 / 插件 | VLINK_TMP_DIR、VLINK_LOCK_DIR | 临时与锁目录 |
| 路径 / 插件 | VLINK_SCHEMA_PLUGIN、VLINK_URL_PLUGINS、VLINK_URL_REMAP | Schema 插件 / URL 插件 / URL 重映射 |
| 日志 | VLINK_LOG_LEVEL、VLINK_LOG_CONSOLE_LEVEL、VLINK_LOG_FILE_LEVEL | 分通道日志级别 |
| 日志 | VLINK_LOG_CONSOLE_UNORDER、VLINK_LOG_CONSOLE_FMT、VLINK_LOG_ENABLE_UTC | 控制台输出与时间戳格式 |
| 日志 | VLINK_LOG_DIR、VLINK_LOG_MAX_SIZE、VLINK_LOG_MAX_COUNT、VLINK_LOG_FLUSH_DELAY | 日志存储与滚动 |
| 日志 | VLINK_LOG_PLUGIN、VLINK_LOG_STORE_STRATEGY、VLINK_LOG_OPEN_APPEND、VLINK_LOG_BLOCK_SYNC、VLINK_LOG_WRITE_DEPTH | 日志插件与后端行为 |
| Bag | VLINK_BAG_PATH、VLINK_BAG_TAG | Bag 路径与录制标签 |
| 发现 / 分析 | VLINK_DISCOVER_DISABLE、VLINK_DISCOVER_NATIVE、VLINK_PROFILER_ENABLE、VLINK_QOS_CONFIG | 发现、性能、QoS 配置 |
| Intra | VLINK_INTRA_BIND | Intra 通信绑定地址 |
| DDS (通用) | VLINK_DDS_BIND、VLINK_DDS_DOMAIN、VLINK_DDS_IP、VLINK_DDS_IP_FILTER、VLINK_DDS_MULTICAST_IP、VLINK_DDS_PEER | DDS 网络配置 |
| DDS (通用) | VLINK_DDS_BUF、VLINK_DDS_MTU、VLINK_DDS_UDP、VLINK_DDS_TCP、VLINK_DDS_SHM、VLINK_DDS_LESS_MEMORY | DDS 传输与资源调优 |
| Intra | VLINK_INTRA_BIND | 仅启用 VLINK_SUPPORT_INTRA 时显示 |
| DDS (通用) | VLINK_DDS_BIND、VLINK_DDS_DEBUG、VLINK_DDS_EVENT_QOS、VLINK_DDS_METHOD_QOS、VLINK_DDS_FIELD_QOS、VLINK_DDS_DOMAIN、VLINK_DDS_IP、VLINK_DDS_IP_FILTER、VLINK_DDS_MULTICAST_IP、VLINK_DDS_PEER、VLINK_DDS_BUF、VLINK_DDS_MTU、VLINK_DDS_UDP、VLINK_DDS_TCP、VLINK_DDS_SHM、VLINK_DDS_LESS_MEMORY | 任一 DDS 后端编入即显示 |
| DDS (后端) | VLINK_FASTDDS_QOS_FILE(VLINK_SUPPORT_DDS)、VLINK_CYCLONEDDS_URI(VLINK_SUPPORT_DDSC)、VLINK_TRAVODDS_QOS_FILE(VLINK_SUPPORT_DDST) | 各 DDS 后端专用,按对应宏过滤 |
| SHM | VLINK_SHM_DEBUG、VLINK_SHM_DEPTH | VLINK_SUPPORT_SHM |
| SHM2 | VLINK_SHM2_DEBUG、VLINK_SHM2_DEPTH、VLINK_SHM2_CONFIG、VLINK_SHM2_NOTIFY_EVERY | VLINK_SUPPORT_SHM2 |
| Zenoh | VLINK_ZENOH_*(30 项,含 _SHM* 系列,详见 21-environment-vars.md) | VLINK_SUPPORT_ZENOH |
| MQTT | VLINK_MQTT_BROKER、VLINK_MQTT_CLIENT_ID、VLINK_MQTT_DOMAIN、VLINK_MQTT_KEEPALIVE、VLINK_MQTT_QOS | VLINK_SUPPORT_MQTT |
| SOME/IP | VLINK_SOMEIP_CFG | VLINK_SUPPORT_SOMEIP |
| TLS / 安全 | VLINK_SSL_VERIFY、VLINK_SSL_CA、VLINK_SSL_CERT、VLINK_SSL_KEY、VLINK_SSL_KEY_PASS、VLINK_SSL_CIPHERS、VLINK_SSL_SNI | 通用,无条件显示 |
| Bench | VLINK_BENCH_READY_TIMEOUT_MS、VLINK_BENCH_START_TIMEOUT_MS、VLINK_BENCH_MEASURE_BUFFER_MS、VLINK_BENCH_CLEANUP_TIMEOUT_MS | VLINK_ENABLE_CLI_BENCH |
vlink-check env 的清单按编译时模块开关动态裁剪。未启用 VLINK_SUPPORT_<NAME> 宏时,对应模块的私有 env 不会展示;未启用 VLINK_ENABLE_CLI_BENCH 时 VLINK_BENCH_* 不展示。源码是否读取以 Utils::get_env("<NAME>") 为准。
已设置的变量以绿色显示,未设置的以红色显示(-b 模式下只显示已设置项)。命令末尾会输出一行汇总:已设置变量数 / 总数,以及 -p 命中的显示项数量。
check test 分两段跑,退出码 = 第二段里的 FAILED 数(WARNING 不计入):
Part 1 — Paradigm 三模型 (intra:// 通路始终可用)
| 子测试 | 使用的节点 | 断言 |
|---|---|---|
| EVENT | Publisher<std::string> + Subscriber<std::string> | 5 条消息按顺序全部接收 |
| METHOD | Client<std::string,std::string> + Server | invoke("ping") 同步得到 echo:ping |
| FIELD | Setter<int> + Getter<int> | Getter::wait_for_value() 读到 42 |
Part 2 — Per-transport Event 冒烟(按 VLINK_SUPPORT_* 宏门控)
对每一个**编译进产物**的传输后端,都会各跑一次最小 Publisher/Subscriber 往返。未编译进的传输自动隐藏(不出现在输出中);某些传输还带运行时前置条件,不满足时整项被标为 WARNING 直接跳过,绝不会触发后端的 std::terminate:
| 传输 | 编译宏 | 运行时前置条件(跳过原因) | 结果说明 |
|---|---|---|---|
| intra:// | VLINK_SUPPORT_INTRA | 无 | 始终 PASSED,相当于 Part 1 的再验一次 |
| shm:// | VLINK_SUPPORT_SHM | 必须存在 iox-roudi 或 RouDi 进程 | PASSED / 跳过 |
| shm2:// | VLINK_SUPPORT_SHM2 | /dev/shm 可用且剩余 ≥ 64MB | PASSED / 跳过 |
| dds:// | VLINK_SUPPORT_DDS | 无(同进程双节点,通过 DDS 发现自环) | PASSED(本机环境异常时 WARNING) |
| ddsc:// | VLINK_SUPPORT_DDSC | 同 dds:// | PASSED / WARNING |
| ddsr:// | VLINK_SUPPORT_DDSR | RTI 许可可用 | PASSED / WARNING |
| ddst:// | VLINK_SUPPORT_DDST | TravoDDS 环境可用 | PASSED / WARNING |
| zenoh:// | VLINK_SUPPORT_ZENOH | 无 | PASSED(受 zenoh 默认 scout 影响可能 WARNING) |
| someip:// | VLINK_SUPPORT_SOMEIP | 设置了 VLINK_SOMEIP_CFG 且文件存在 | PASSED / 跳过 |
| mqtt:// | VLINK_SUPPORT_MQTT | 设置了 VLINK_MQTT_BROKER | PASSED / 跳过 |
| fdbus:// | VLINK_SUPPORT_FDBUS | 无(后端自决) | PASSED / WARNING |
| qnx:// | VLINK_SUPPORT_QNX | 仅 QNX 平台编得出 | PASSED / WARNING |
外部依赖型传输的通用规则: shm / shm2 / dds / ddsc / ddsr / ddst / zenoh / someip / mqtt / fdbus / qnx 发现超时被计为 WARNING 而非 FAILED,只有构造抛异常或收到错乱载荷才算 FAILED。intra:// 是唯一严格评估的 scheme。
退出码: 0 表示没有任何 FAILED;非零等于 FAILED 的子测试数。WARNING 仅提示,不影响退出码。
vlink-list 通过 DiscoveryViewer 发现机制,扫描当前网络上所有活跃的 VLink 进程及其注册的话题(Publisher/Subscriber/Server/Client/Setter/Getter),以树状结构输出。
工具在启动后等待约 1 秒(kCollectInterval = 1000ms)收集发现信息,然后输出结果并退出。
| 参数 | 说明 | 默认值 |
|---|---|---|
| -n / --native | 本地模式,仅发现本机节点 | false |
| -m / --name <name> | 按进程名过滤 | 空(全部) |
| -p / --pid <pid> | 按进程 ID 过滤 | 0(全部) |
| -c / --check_process_count | 仅通过退出码返回进程数量,不输出文本 | false |
| -h / --help | 显示帮助 | - |
-c 模式下不打印任何终端输出,通过进程退出码返回当前 VLink 用户进程数量,可用于脚本判断(vlink-check 内部使用此功能)。由于 shell 退出码本身有范围限制,这种方式更适合做小范围计数或非零判断。
输出按进程分组,每个进程显示:
URL 列宽度自动对齐(以最长 URL 为基准)。
vlink-monitor 是一个基于终端的交互式实时监控工具,持续显示当前网络中所有话题的通信状态,包括频率、速率、丢包率、时延等指标,支持 Sparkline 图表面板和进程面板。
在交互界面中选中某条话题后按 Enter,工具会严格根据服务发现里的 schema_type 自动启动 vlink-eproto sub 或 vlink-efbs sub;如果当前 URL 的 schema_type 或 ser_type 仍未就绪,则不会再做字符串猜测,而是提示等待服务发现元数据补齐后重试。若服务发现结果表明该 URL 是字段模型读取场景(已发现 Getter,或发现 Setter 且未发现 Publisher),vlink-monitor 会自动向子进程追加 -g/--getter,否则按普通 Subscriber 方式拉起。指定 -b/--blob 时,Enter 跳转会强制追加 -x blob,用 blob 方式打印消息内容。
每隔 1 秒(kCollectInterval)刷新一次统计数据,每隔 50ms(kTerminalInterval)重绘终端界面。
| 参数 | 说明 | 默认值 |
|---|---|---|
| -u / --urls <url...> | 只监控指定 URL(可多个) | 空(全部) |
| -i / --filter <str> | URL 关键字过滤(空格分隔多个关键字) | 空 |
| -b / --blob | Enter 跳转时强制使用 -x blob 打印输出 | false |
| -k / --black | 启用黑名单模式(过滤掉匹配的 URL) | false |
| -n / --native | 本地模式,仅发现本机节点 | false |
| -t / --node_count | 显示节点数量模式(在类型列显示订阅者/发布者数量) | false |
| -l / --detail | 详情模式,显示频率/速率/丢包/时延列(热键 L) | false |
| -o / --observe_all | 观察所有模式,为所有行订阅数据(配合 -l 使用,热键 O) | false |
| -e / --profiler | 显示 CPU 分析器数据(热键 E) | false |
| -s / --ser | 显示序列化类型列(热键 S) | false |
| -a / --active | 只显示有活跃数据的话题(需配合 -l 使用,热键 A) | false |
| -y / --pubsub | 只显示 Publisher/Subscriber 类型(热键 Y) | false |
| -p / --process | 显示进程面板(热键 P) | false |
| -c / --chart | 显示 Sparkline 图表面板(热键 C) | false |
| -x / --preset | 预设模式,等价于同时开启 -l -o -p -c | false |
| -g / --proto_args <str> | 附加传给 vlink-eproto/vlink-efbs 的参数 | 空 |
| -d / --proto_dir <dir> | Proto 文件目录(默认读取 VLINK_PROTO_DIR) | 环境变量 |
| -f / --fbs_dir <dir> | FlatBuffers 文件目录(默认读取 VLINK_FBS_DIR) | 环境变量 |
| --plain | 纯文本输出模式(用于重定向,禁用交互) | false |
| --dot | 使用 Braille 点阵字符绘制图表 | false |
| --rows <n> | 最大行数(0 表示自动获取终端行数) | 0 |
| --columns <n> | 最大列数(0 表示自动获取终端列数) | 0 |
| --chart_width <n> | 图表宽度(范围 10~100) | 30 |
| --process_width <n> | 进程面板宽度(范围 20~100) | 40 |
| 热键 | 功能 |
|---|---|
| q / Esc | 退出 |
| Space | 暂停/恢复刷新 |
| L | 切换详情模式(FREQ/RATE/LOSS/LATENCY) |
| O | 切换"观察所有"模式 |
| S | 切换序列化类型显示 |
| T | 切换节点数量模式 |
| E | 切换 Profiler 模式 |
| A | 切换只显示活跃话题 |
| Y | 切换只显示 Pub/Sub |
| P | 切换进程面板 |
| C | 切换图表面板 |
| Left/Right | 翻页 |
| Up/Down | 移动选中行 |
| Enter | 对选中话题启动 vlink-eproto 或 vlink-efbs,并按服务发现决定是否追加 --getter |
标题栏(蓝色背景):
每行:
行颜色(详情模式 / 观察所有模式下):
底部状态栏: 显示当前页码、各模式开关状态,以及总速率汇总。
进程面板(-p): 右侧显示当前选中话题关联的进程信息(类型标签、主机、进程名/PID)。
图表面板(-c): 右侧显示当前选中话题的历史 Sparkline 图表,包含 4 组图:Freq、Rate、Loss、Latency。支持 --dot 模式使用 Braille 点阵提高精度。
vlink-bag 是 VLink 最核心的数据工具,支持对所有话题进行录制、回放、克隆、检查、索引重建和修复。支持的文件格式:
| 扩展名 | 说明 |
|---|---|
| .vdb | VLink 标准数据库格式(SQLite) |
| .vdbx | VLink 数据库扩展格式 |
| .vcap | VLink 抓包格式 |
| .vcapx | VLink 抓包扩展格式 |
| 参数 | 说明 | 默认值 |
|---|---|---|
| path | 输出文件路径(必填) | - |
| -u / --urls <url...> | 只录制指定 URL(空为全部) | 空(全部) |
| -t / --tag <name> | 设置录制标签名 | 空 |
| -i / --filter <str> | URL 关键字过滤(空格分隔) | 空 |
| -k / --black | 黑名单模式 | false |
| -n / --native | 本地模式 | false |
| -d / --duration <s> | 录制持续时间(秒),<=0 表示不限制 | 0(不限制) |
| -w / --wait <s> | 退出时等待写入完成的最大时间(秒) | 30 |
| -p / --compress | 启用压缩 | false |
| -f / --force | 强制覆盖已有文件 | false |
| -q / --quiet | 静默模式(不输出进度) | false |
| -l / --detail | 详情模式(每条消息打印时间戳和 URL) | false |
| -o / --split_name_by_time | 按时间分割文件名 | false |
| -z / --split_by_size <GB> | 按文件大小分割(GB) | 1 |
| -y / --split_by_time <s> | 按时间分割(秒) | 0(不分割) |
| -g / --deft | 不等待序列化类型信息采集 | false |
| -x / --max_packet_size <MB> | 单包最大大小(MB),超过则丢弃 | 4.0 |
| -j / --wal_mode | 启用 SQLite WAL 模式 | false |
| -c / --cache_size <MB> | 写缓存大小(MB) | 4 |
| -s / --sync_mode | 同步写入模式 | false |
| --max_task_depth <n> | 写入队列最大待处理任务数 | 20000 |
| --max_memory_size <GB> | 写入队列最大内存占用(GB) | 2 |
| --max_row_count <n> | 最大录制行数 | 5000000000 |
| --max_bytes_size <GB> | 最大录制字节数(GB) | 512 |
| --enable_limit | 启用行/字节数限制 | false |
| --compress_level <n> | 压缩级别(1~5,0 表示默认) | 3 |
| --ignore_compress <url...> | 对指定 URL 不压缩 | 空 |
录制进度显示: 进度条颜色含义:
键盘控制:
| 参数 | 说明 | 默认值 |
|---|---|---|
| path | bag 文件路径(必填) | - |
| -u / --urls <url...> | 只回放指定 URL(空为全部) | 空(全部) |
| -i / --filter <str> | URL 关键字过滤 | 空 |
| -k / --black | 黑名单模式 | false |
| -n / --native | 本地模式(DDS 使用 127.0.0.1) | false |
| -s / --actions <n...> | 过滤动作类型(1:C/Req 2:C/Resp 3:S/Req 4:S/Resp 5:Pub 6:Sub 7:Set 8:Get) | 6(Sub) |
| -b / --begin_time <s> | 从指定相对时间开始(秒) | 0 |
| -e / --end_time <s> | 到指定相对时间结束(秒,0 表示到结尾) | 0 |
| -t / --times <n> | 回放次数(<=0 表示无限循环) | 1 |
| -r / --rate <f> | 回放速率(0.01~100) | 1.0 |
| -q / --quiet | 静默模式 | false |
| -l / --detail | 详情模式 | false |
| -m / --skip_blank | 跳过空白段(从第一条消息时间点开始计算) | false |
| -j / --auto_pause | 每条消息回放后自动暂停 | false |
| --local_time | 使用本地时间显示 | false |
| --utc_time | 使用 UTC 时间显示 | false |
| --rel_begin_time <hh:mm:ss[.ms]> | 相对开始时间(格式:00:00:00 或 00:00:00:000) | 空 |
| --rel_end_time <hh:mm:ss[.ms]> | 相对结束时间 | 空 |
| --local_begin_time <...> | 本地时间开始点 | 空 |
| --local_end_time <...> | 本地时间结束点 | 空 |
| --utc_begin_time <...> | UTC 时间开始点 | 空 |
| --utc_end_time <...> | UTC 时间结束点 | 空 |
| --plugin <name> | 指定 BagReader 插件名 | 空 |
回放进度显示格式:
键盘控制:
| 参数 | 说明 | 默认值 |
|---|---|---|
| path | bag 文件路径(必填) | - |
| -l / --detail | 详情模式(逐条打印消息时间戳和 URL) | false |
输出内容:
Compression: 的值由 writer 写入:<tt>.vdb/.vdbx(SQLite)启用压缩时写 lzav,否则 None;<tt>.vcap/.vcapx(MCAP)启用压缩时写 zstd,否则 None。
将 bag 文件克隆到新文件,支持格式转换、话题过滤、时间裁剪、压缩转换。参数与 play 子命令类似,另有:
| 参数 | 说明 | 默认值 |
|---|---|---|
| source_path | 源文件路径(必填) | - |
| target_path | 目标文件路径(必填) | - |
| --import_schema | 尝试导入文件内嵌的 schema | false |
校验 bag 文件的完整性,返回 0 表示正常,-1 表示异常。
重建 bag 文件的时间索引,用于修复索引损坏导致的回放问题。
| 参数 | 说明 | 默认值 |
|---|---|---|
| path | bag 文件路径(必填) | - |
| -y / --rebuild | 使用重建模式修复 | false |
尝试修复损坏或未完整写入的 bag 文件(例如录制中途断电)。
为已有的 bag 文件设置或修改标签名。
vlink-dump 用于从实时通信或 bag 文件中提取特定字段的值,输出为 CSV、JSON 或图片/视频等格式。支持 Protobuf 消息的字段路径表达式,以及 VLink 零拷贝类型(CameraFrame、PointCloud、RawData)的内置字段。
前提条件: 需要 Protobuf compiler 支持(VLINK_HAS_PROTOBUF_COMPILER)。对于 Protobuf 消息须通过 -d 参数或 VLINK_PROTO_DIR 环境变量指定 .proto 文件目录;对于 FlatBuffers 消息须通过 --fbs_dir 参数或 VLINK_FBS_DIR 环境变量指定 .fbs 文件目录。零拷贝类型(CameraFrame、PointCloud、RawData)无需额外配置。数学表达式功能需要 exprtk 库支持。
| 参数 | 说明 | 默认值 |
|---|---|---|
| url | 目标 URL(必填) | - |
| -t / --type <type> | 输出类型:console、csv、json、bin、jpg、h264、h265、raw、pcd | csv |
| -c / --condition <fields> | 提取字段,逗号分隔(如 header.seq,pose.x,pose.y);CSV/JSON 模式必填 | 空 |
| -o / --out_dir <dir> | 输出目录 | ./ |
| -m / --base_name <name> | 输出文件基础名 | output |
| -f / --bag_file <path> | 从 bag 文件提取(不指定则从实时通信提取) | 空 |
| -b / --begin_time <s> | 开始时间(秒,仅在指定 -f 时有效) | 0 |
| -e / --end_time <s> | 结束时间(秒,仅在指定 -f 时有效) | 0 |
| -n / --count <n> | 最大样本数(0 = 不限) | 0 |
| --hz <hz> | 最大输出频率(Hz,0 = 不限) | 0 |
| --native | 本地模式(仅在不指定 -f 时有效) | false |
| -d / --proto_dir <dir> | Protobuf .proto 文件目录(或设置 VLINK_PROTO_DIR) | 环境变量 |
| --fbs_dir <dir> | FlatBuffers .fbs 文件目录(或设置 VLINK_FBS_DIR) | 环境变量 |
| -q / --quiet | 静默模式 | false |
| -l / --detail | 详情模式(打印每条提取记录) | false |
| -x / --expression <expr> | 数学表达式,分号分隔(需配合 -c 使用,需要 exprtk 库支持) | 空 |
Console 格式(-t console):
直接在终端打印消息内容。若指定 -c 则只打印指定字段及表达式结果,否则打印完整消息(Protobuf TextFormat 或零拷贝结构体摘要)。text 为 console 的别名。
CSV 格式(-t csv):
JSON 格式(-t json):
Bin 格式(-t bin):
将每条消息的完整原始序列化字节保存为独立文件:output.1.bin、output.2.bin 等。
图片/视频格式(-t jpg/h264/h265/raw):
适用于 CameraFrame 或含 bytes 字段的 Protobuf 消息,-c data(默认)时将数据帧分别保存为独立文件:output.1.jpg、output.2.jpg 等。jpeg 为 jpg 的别名。
PCD 点云格式(-t pcd):
适用于零拷贝 PointCloud 类型,将每帧点云保存为 PCD v0.7 二进制格式文件:output.1.pcd、output.2.pcd 等。
Protobuf 消息字段路径:
VLink 零拷贝类型内置字段:
| 类型 | 支持的条件表达式 |
|---|---|
| CameraFrame | header.frame_id、header.seq、header.time_meas、header.time_pub、width、height、channel、freq、format、stream、size、data |
| PointCloud | header.frame_id、header.seq、header.time_meas、header.time_pub、size、pack_size、data[N].field |
| RawData | header.frame_id、header.seq、header.time_meas、header.time_pub、size、data |
vlink-eproto 用于在终端中实时订阅并以 Protobuf TextFormat 或 JSON(-j)格式显示消息内容,或向指定 URL 发布 Protobuf 消息。支持交互式热键控制显示选项,支持内容分页翻阅。
前提条件: 需要 Protobuf compiler 支持,须通过 -d 参数或 VLINK_PROTO_DIR 指定 .proto 文件目录。
| 参数 | 说明 | 默认值 |
|---|---|---|
| url | 目标 URL(必填) | - |
| -d / --proto_dir <dir> | Proto 文件目录 | 环境变量 |
| -s / --ser_type <type> | 序列化类型(消息名) | 空(自动) |
| -x / --encoding <type> | 编码提示(protobuf/flatbuffers/raw/blob/zerocopy,blob 时按十六进制显示二进制) | 空 |
| -i / --filter <str> | 过滤字段名(空格分隔) | 空 |
| -j / --json | 以 JSON 格式输出 Protobuf 消息 | false |
| -g / --getter | 强制使用 Getter 接收数据(字段模型) | false |
| -k / --black | 黑名单模式(过滤掉匹配字段) | false |
| -n / --native | 本地模式 | false |
| -m / --max_str_count <n> | 最大显示字符数 | 1亿 |
| -e / --print_enum_string | 显示枚举数字(热键 E) | false |
| -r / --ignore_array | 忽略数组字段(热键 R) | false |
| -t / --ignore_string | 忽略字符串字段(热键 T) | false |
| -y / --print_time_string | 时间戳显示为可读字符串(热键 Y) | false |
| -u / --print_hex_string | 数值以十六进制显示(热键 U) | false |
| -o / --ignore_default | 忽略默认值字段(热键 O) | false |
| -p / --use_long_repeated | 展开 repeated 字段(热键 P) | false |
| --rows <n> | 最大行数 | 0(自动) |
| --columns <n> | 最大列数 | 0(自动) |
接收模式说明:
JSON 模式说明:
交互热键:
| 热键 | 功能 |
|---|---|
| q / Esc | 退出 |
| Space | 暂停/恢复 |
| Left/Right | 翻页(每页 = 终端高度-3 行) |
| Up/Down | 快速翻页(步进 10 页) |
| PgUp/PgDn | 跳转 100 页 |
| Home/End | 跳到首页/末页 |
| E | 切换枚举显示模式 |
| R | 切换忽略数组 |
| T | 切换忽略字符串 |
| Y | 切换时间字符串显示 |
| U | 切换十六进制显示 |
| O | 切换忽略默认值 |
| P | 切换展开 repeated |
界面行为说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
| url | 目标 URL(必填) | - |
| -d / --proto_dir <dir> | Proto 文件目录 | 环境变量 |
| -s / --ser_type <type> | 序列化类型(消息名,必填) | 空 |
| -x / --encoding <type> | 编码提示(protobuf/flatbuffers/raw/blob/zerocopy,raw 发送文本或 JSON 字符串,blob 发送二进制) | 空 |
| -n / --native | 本地模式 | false |
| -j / --json | 按 JSON 解析 Protobuf 输入 | false |
| -f / --prototxt_file <path> | 从 .prototxt 文件读取消息内容 | 空 |
| -c / --prototxt_content <str> | 直接指定消息内容(field:value;... 格式) | 空 |
| -t / --times <n> | 发布次数(<=0 表示无限) | 1 |
| -l / --interval <ms> | 发布间隔(毫秒) | 100 |
指定 -j/--json 后,-f/--prototxt_file 和 -c/--prototxt_content 的内容会按 Protobuf JSON 解析,而不是 TextFormat。 指定 -x raw 时,-f/--prototxt_file 和 -c/--prototxt_content 的内容会直接按原始文本发送;如果内容本身是 JSON 字符串,订阅显示时会优先按 JSON 美化。 指定 -x blob 时,-c/--prototxt_content 按十六进制字节串解析,-f/--prototxt_file 则直接读取原始二进制文件内容发送。
vlink-efbs 功能与 vlink-eproto 相同,但针对 FlatBuffers 序列化格式。同样支持 sub(订阅显示)和 pub(发布消息)两个子命令。FlatBuffers 的 schema 文件(<tt>.fbs)目录通过 -d/--fbs_dir 参数或 VLINK_FBS_DIR 环境变量指定。普通 FlatBuffers 消息的输入本身按 JSON 语法解析,显示时也默认输出 JSON 风格文本,因此不再单独提供 --json 开关。
| 参数 | 说明 | 默认值 |
|---|---|---|
| url | 目标 URL(必填) | - |
| -d / --fbs_dir <dir> | FlatBuffers schema 目录 | 环境变量 |
| -s / --ser_type <type> | 序列化类型(table 名) | 空(自动) |
| -x / --encoding <type> | 编码提示(protobuf/flatbuffers/raw/blob/zerocopy,raw 显示文本/JSON,blob 以十六进制显示) | 空 |
| -i / --filter <str> | 过滤字段名 | 空 |
| -g / --getter | 强制使用 Getter 接收数据(字段模型) | false |
| -k / --black | 黑名单模式 | false |
| -n / --native | 本地模式 | false |
| -m / --max_str_count <n> | 最大显示字符数 | 1亿 |
| -e / --print_enum_string | 显示枚举数字(热键 E) | false |
| -r / --ignore_array | 忽略数组字段(热键 R) | false |
| -t / --ignore_string | 忽略字符串字段(热键 T) | false |
| -y / --print_time_string | 时间戳显示为可读字符串(热键 Y) | false |
| -u / --print_hex_string | 数值以十六进制显示(热键 U) | false |
| -o / --ignore_default | 忽略默认值字段(热键 O) | false |
| -p / --use_long_repeated | 展开 repeated 字段(热键 P) | false |
| --rows <n> | 最大行数 | 0(自动) |
| --columns <n> | 最大列数 | 0(自动) |
接收模式说明:
界面行为说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
| url | 目标 URL(必填) | - |
| -d / --fbs_dir <dir> | FlatBuffers schema 目录 | 环境变量 |
| -s / --ser_type <type> | 序列化类型(table 名,必填) | 空 |
| -x / --encoding <type> | 编码提示(protobuf/flatbuffers/raw/blob/zerocopy,raw 发送文本/JSON,blob 发送二进制) | 空 |
| -n / --native | 本地模式 | false |
| -f / --fbstxt_file <path> | 从 .fbstxt / FlatBuffers JSON 文本文件读取消息内容 | 空 |
| -c / --fbstxt_content <str> | 直接指定 FlatBuffers JSON 文本内容 | 空 |
| -t / --times <n> | 发布次数(<=0 表示无限) | 1 |
| -l / --interval <ms> | 发布间隔(毫秒) | 100 |
pub 命令必须且只能指定 -f 或 -c 之一;普通 FlatBuffers 类型的文本输入实际按 FlatBuffers JSON 语法解析。 指定 -x raw 时,-f/--fbstxt_file 和 -c/--fbstxt_content 的内容会直接按原始文本发送;如果内容本身是 JSON 字符串,订阅显示时会优先按 JSON 美化。 指定 -x blob 时,-c/--fbstxt_content 按十六进制字节串解析,-f/--fbstxt_file 则直接读取原始二进制文件内容发送。
vlink-bench 是 VLink 的通信性能测试工具,重点面向发布/订阅链路。它会围绕不同 url、执行模式、拓扑、QoS、payload 类型、报文大小、发布速率和序列化路径展开矩阵化测试,并生成:
默认内建 URL 会按当前编译宏已启用的 transport 生成,并在运行前做有限的前置条件过滤。普通默认集合包含 intra、shm、shm2、DDS 系列、zenoh、someip、mqtt、fdbus、qnx 中当前构建可用的项;shm / shm2 默认带 ?depth=10,DDS 系列默认带 ?qos=sensor,例如 shm://bench/perf_shm?depth=10、dds://bench/perf_dds?qos=sensor。除 SOME/IP 使用固定 service/event URL 外,内建 URL 使用 scheme://bench/perf_<scheme> 格式,避免不同 transport 复用同一 topic 路径产生干扰。showcase 默认 URL 集合只选跨进程 transport(不含 intra),按 shm、shm2、DDS 系列、zenoh、someip、mqtt、fdbus、qnx 的顺序加入所有可运行项。 直接执行 vlink-bench run 时(无 --preset),会走 showcase 默认矩阵,重点覆盖 throughput + latency 主通信 suite、当前构建可用的跨进程 transport、bytes payload,全部在 process 模式下测量真实 cross-process IPC 性能。两个 suite 各有自己的 payload 档位(不混用):**throughput** 用 3 档(16KiB / 256KiB / 1MiB,专挑大消息容易出差异的中大档);**latency** 用 6 档(128B / 1KiB / 8KiB / 64KiB / 512KiB / 2MiB,覆盖控制消息 → OS 页 → MTU → DDS 分片 → 多 MiB 等性能拐点)。
所有报告文件(json / csv / html)都通过 .tmp 临时文件 + rename 原子落盘,磁盘满或写入中断不会留下半成品。Worker 子进程异常退出会被主进程校验 exit code + exit status 捕获,不再被静默误判成功。
**传输前置条件过滤**:vlink-bench run 会在选项解析完成后对最终 URL 列表做一次有限的运行时可达性筛选,任何 --url 或内建默认 URL 如果前置条件不满足,会在 stderr 打印 vlink-bench: skipping <url> (<reason>) 并从计划中剔除,避免底层后端(如 iceoryx)直接 std::terminate 把整个 bench 进程带崩。当前 bench 识别的规则:
| scheme | 前置条件 | 不满足时的 reason |
|---|---|---|
| shm:// | 构建已启用 shm 后端;RouDi / shm 运行时问题在具体 case 中记录 | worker 启动或运行失败 |
| mqtt:// | 环境变量 VLINK_MQTT_BROKER 非空 | VLINK_MQTT_BROKER not set |
| fdbus:// | FdbusConf::has_name_server() 为真 | name_server not running |
shm:// 不在 URL 过滤阶段初始化 RouDi,避免环境权限或库版本问题直接终止整个 bench。RouDi 未就绪时,对应 case 会在报告里记录失败,其他 URL 仍可继续测试。
其它 scheme(intra / shm2 / dds / ddsc / ddsr / ddst / zenoh / someip / qnx)目前不做额外前置检查,仍受 VLINK_SUPPORT_* 编译宏门控。
常用参数:
| 参数 | 说明 |
|---|---|
| -p / --preset | 预设矩阵,支持 showcase / quick / full;省略时走 showcase 默认矩阵(2 分钟内跑完的基础覆盖包) |
| -u / --url | URL 列表,可重复,也可用逗号分隔;省略时取当前编译启用并通过前置过滤的内建 URL;showcase 默认使用跨进程 URL 集合(intra 在 process 模式必跳,需要请显式 --url intra://... 并搭配本进程模式) |
| -s / --suite | 测试套件:throughput latency topology serialization backpressure(slow consumer 慢消费者背压测试,最大速率 + 4KiB payload + 订阅者每条 sleep {100, 1000, 10000} us,观察 lossy / blocked / normal 行为);showcase 默认覆盖 throughput + latency,其余留给显式 suite 或 full |
| -m / --mode | 执行模式:local-direct local-loop process;showcase / quick 默认仅 process(强调跨进程真实 IPC),full 三种全开 |
| -t / --topology | 拓扑:1:1 1:n n:1 n:n;showcase 默认 1:1,full 全部覆盖 |
| --pattern | 速率模式:max fixed burst;showcase 默认 max,latency suite 内部使用固定 rate |
| -k / --payload | 负载类型:bytes string rawdata;showcase 默认 bytes,string 主要保留在 serialization |
| -q / --qos | QoS profile 列表;full 默认 sweep sensor(Reliable)与 best(BestEffort) |
| --size | 吞吐测试 payload 大小列表(字节);showcase 默认 16384, 262144, 1048576(3 档,挑大消息差异),full 扩展到 16–4 MiB |
| --latency-size | 时延测试 payload 大小列表(字节);showcase 默认 128, 1024, 8192, 65536, 524288, 2097152(6 档,覆盖控制消息 → 大消息全谱) |
| --topology-size | 拓扑测试 payload 大小列表(字节);showcase 默认 4096 |
| -r / --rate | 固定速率场景的总 cadence 列表(Hz),burst 场景也会把它当作 burst 调度频率;showcase latency suite 默认 1000(中频典型负载,1000 Hz × 2.5s = 2500 个延迟样本统计置信度足够),多 publisher 按 worker 分摊 |
| -f / --fanout | 1:n 场景 subscriber 数量列表;showcase 默认值为 4, 16,但默认矩阵不启用 topology suite;full 扩到 1, 2, 4, 8, 16 |
| --publishers | 多 publisher 场景数量列表;showcase 默认值为 4, 16,但默认矩阵不启用 multi-publisher topology;full 扩到 1, 2, 4, 8, 16 |
| --burst | burst 场景每轮总发送条数列表,多 publisher 会按 worker 分摊;showcase 默认值为 32,但默认矩阵不启用 burst |
| --property / --pub-property / --sub-property | 节点、发布端、订阅端属性(key=value 形式) |
| --warmup | 每个 scenario 的 warmup 毫秒数;省略时由 preset 决定(showcase 1000,full 1000) |
| --duration | 每个 scenario 的 measure 毫秒数;省略时由 preset 决定(showcase 2000,full 2500) |
| --drain | 每个 scenario 的 drain 毫秒数;省略时由 preset 决定(showcase / full 基线 300,并按 payload 大小自动加长:drain = base + payload_kib / 4,封顶 1500ms,保证大消息队列能完全排空) |
| --repeat | 每个 scenario 的重复次数;showcase 默认 1(单次跑,duration 已 2500ms 给足统计置信度),full 默认 3,需要 worst-of-N 抗噪时显式传 --repeat 2 或更多 |
| --serialization-duration | serialization suite 的单 case 毫秒数;省略时由 preset 决定(showcase 默认值 800,但默认矩阵不启用 serialization;full 1200) |
| --repeat | 每个 scenario 的重复次数,必须 > 0,默认 1 |
| --report | 输出目标:html json csv terminal both;可重复,也可用逗号分隔;默认输出 html 和 terminal |
| --no-pager | 关闭终端分页的交互式视图,直接打印表格摘要;可与任意 --report 组合使用,不再强制要求 terminal |
| -o / --output | 输出文件前缀,不带扩展名;省略时默认生成 vlink-bench-YYYYMMDD-HHMMSS(在当前目录绝对化) |
| --verbose | 打印 planned/skipped 与逐 case 进度 |
说明:
plot 不重新执行 benchmark,只读取已有 json 结果并重新生成你选中的 json/csv/html/terminal 输出。
pub 和 sub 是 process 模式内部使用的 worker 子命令,通常不需要手工调用。 它们由主进程通过 vlink/base/process 拉起,并通过标准输入接收对齐起跑信号;正常情况下主进程会统一等待 worker 完成,再汇总生成最终报告。
vlink-bench 的默认设计不是把所有维度做笛卡尔积,而是按场景层分组展开。这样默认报告更容易解释;跨 transport 对比时,仍应优先看同一 suite/mode/payload 下的受控切片。默认 preset 只会对内建矩阵做分层抽样;一旦你显式传入 --size / --latency-size / --topology-size / --rate / --burst,bench 就按给定列表原样展开,不再裁剪成代表性子集。
showcase 默认矩阵(无 --preset,目标 2 分钟内跑完):
quick 预设:
full 预设(正式报告 / 横向对比):
run 执行期间,每个 scenario 的 title 行下方会原地刷新一行进度条,阶段分为 warmup / measure / drain / wrap-up,底层基于 MessageLoop + Timer 驱动 100ms tick 重绘:
当 --report 包含 terminal 且当前终端支持交互时,vlink-bench 会进入分页表格视图。视图里的每一行都是聚合后的 case,不是原始 repeat 样本。交互视图建议终端高度至少 8 行;过小的终端会提示先调整窗口大小。默认首屏是 transport 视图;如果当前 preset 同时包含 serialization,可用 u 切换到 serialization 视图。
顶部 header 压缩为 3 行:banner、filter/sort 状态行、列头;底部会在 sort / filter / export 等状态变化时以 footer flash 短暂提示(2–3 帧)结果。
按键说明:
| 按键 | 功能 |
|---|---|
| Up / Down | 选中上一条 / 下一条 |
| Left / PgUp | 上一页 |
| Right / PgDn | 下一页 |
| b / Space | 上一页 / 下一页(单键备选) |
| Home / End | 跳到第一条 / 最后一条 |
| [ / ] | 在选中 case 的 detail 面板内向上 / 向下滚动 |
| u | 循环切换 suite 过滤 |
| m | 循环切换 mode 过滤 |
| t | 循环切换 transport 过滤 |
| f | 切换仅显示不稳定 case |
| s | 在默认、RecvMB/s、P95、Loss 排序之间循环;视图始终先按稳定性分组,再在组内应用所选排序 |
| o | 切换升 / 降序(作用在稳定性分组内) |
| / | 进入搜索:对 url / qos / properties / transport 做子串匹配,大小写不敏感 |
| x | 清除当前搜索 |
| e | 把当前视图(应用了 filter / sort / search)导出为 ./vlink-bench-export-<timestamp>.csv |
| ? / h | 打开 / 关闭帮助浮层 |
| q / Esc | 退出交互视图(或关闭帮助浮层) |
补充说明:
HTML 报告面向“先看结论、再定位问题、最后看细节”的阅读顺序:
补充说明:
在 vlink-monitor 的交互界面中,选中某行话题后按 Enter 键,工具会根据 discovery 提供的 schema_type 选择 vlink-eproto sub 或 vlink-efbs sub,然后在当前终端清屏后直接执行对应命令,并传入 URL、序列化类型、-x/--encoding 以及 schema 目录(-d proto_dir 或 -d fbs_dir),实现从监控到消息内容查看的一键跳转。若 monitor 启动时指定了 -b/--blob,则这里会强制传入 -x blob。
若 monitor 的服务发现结果表明该话题属于字段模型读取场景(发现 Getter,或发现 Setter 且没有 Publisher),还会自动追加 -g/--getter;否则默认按 Subscriber 模式启动。