ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Matter 项目 Perfetto 追踪后端全解:从单应用抓取到系统级多应用性能分析

2026/9/19 11:22:41 拓冰建站 浏览量
Matter 项目 Perfetto 追踪后端全解:从单应用抓取到系统级多应用性能分析 Matter 项目 Perfetto 追踪后端全解从单应用抓取到系统级多应用性能分析【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip本指南深入讲解 connectedhomeipMatter SDK中基于 Perfetto 实现的数据记录与追踪后端。核心素材来自 src/tracing/perfetto/README.md并结合该目录下的源码与构建配置展开剖析。读者将掌握两套完整实战方案使用--trace-to perfetto:文件路径捕获单个应用的追踪数据以及借助traced守护进程与matter.cfg配置实现跨多个应用的系统级追踪同时理解追踪宏、后端注册、事件存储等底层机制。一、背景Matter 追踪子系统与 Perfetto 后端connectedhomeip 内置了一套运行时可配置的追踪与日志基础设施见 src/tracing/README.md。整个子系统由 GN 构建参数matter_enable_tracing_support控制禁用时全部追踪代码会被整体编译剔除对二进制体积的影响降到最低。该子系统主要承载两类数据底层追踪Low-Level Tracing用于跟踪执行流程、测量关键操作的耗时。分为作用域式成对的 begin/end 事件与瞬时式单个时间点事件两种通过线程安全的MATTER_TRACE_*宏对外暴露宏契约定义在 src/tracing/macros.h。数据记录/指标Data Logging / Metrics上报 Matter 消息收发、DNSSD 节点发现以及带数值和错误码的运行指标通过MATTER_LOG_*宏驱动由实现chip::Tracing::Backend接口的后端在运行时注册接收。在 Linux/Android 平台上matter_trace_config构建参数默认指向 Perfetto 后端见 src/tracing/tracing_args.gni即本指南的主角——一个基于 Perfetto其中BUILD.gn提供sdk与sdk_config目标参照 Perfetto 官方的 Tracing SDK 集成指南实现。二、源码布局与构建结构后端全部源码集中在src/tracing/perfetto/目录文件职责include/matter/tracing/macros_impl.h将MATTER_TRACE_*宏桥接到 PerfettoTRACE_EVENT_*宏simple_initialize.cpp /.h封装perfetto::Tracing::Initialize的简化初始化入口file_output.cpp /.hFileTraceOutput类把追踪写入本地文件event_storage.cpp /.h注册静态事件存储并支持 flushperfetto_tracing.cpp /.hPerfettoBackend实现chip::Tracing::Backend高层数据记录matter.cfg系统级追踪的 Perfetto 文本配置示例BUILD.gn 将这些文件组织为 5 个可独立引用的目标perfetto_tracing仅宏实现供matter_trace_config直接引用、file_output、simple_initialization、event_storage以及聚合的perfetto静态库。命令行工具侧examples/common/tracing/BUILD.gn 通过matter_commandline_enable_perfetto_tracing默认current_os linux控制是否把perfetto:file_output、perfetto:event_storage、perfetto:simple_initialization编入 chip-tool 等命令行应用。三、方案一捕获单个应用的追踪进程内模式最快捷的用法是让应用自身通过 Perfetto SDK 在进程内直接写追踪文件。以 chip-tool 在配网pairing过程中抓取追踪为例out/linux-x64-chip-tool/chip-tool \ pairing onnetwork 1 20202021 \ --trace-to perfetto:$HOME/tmp/test_perfetto.log其中--trace-to是 chip-tool 的通用参数定义见 examples/chip-tool/commands/common/CHIPCommand.cpp 的StartTracing()参数声明在 CHIPCommand.h 的构造函数中支持逗号分隔的多个目标。该参数由 TracingCommandLineArgument.cpp 解析perfetto 系列目标有下面两种形态perfetto使用系统后端perfetto::kSystemBackend数据由中央traced守护进程采集见下一节perfetto:文件路径使用进程内后端perfetto::kInProcessBackend直接输出到指定文件。两者都会调用chip::Tracing::Perfetto::Initialize()完成初始化、注册事件存储并把PerfettoBackend注册进 Matter 追踪后端注册表chip::Tracing::Register。命令结束时会由StopTracing()触发FlushEventTrackingStorage()冲刷事件并关闭文件输出。生成的追踪文件可直接拖入 Perfetto UIui.perfetto.dev进行可视化分析——这是 README 给出的官方消费途径无需额外安装桌面工具。四、方案二捕获多个应用的追踪系统级模式当希望同时观察多个进程例如 chip-tool 控制器与设备端应用的track_event事件时改用系统级追踪。仓库在matter.cfg中提供了一份开箱即用的track_event采集配置Perfetto 官方仓库还有更多示例可参考。4.1 准备 Perfetto 工具链系统级采集需要traced与perfetto两个工具二者均在 perfetto 子模块内构建。README 给出的简化步骤为cd third_party/perfetto/repo tools/install-build-deps tools/gn gen --argsis_debugfalse out/linux tools/ninja -C out/linux tracebox traced traced_probes perfettotools/install-build-deps安装构建依赖首次需要与平台相关tools/gn gen以 release 配置生成构建文件tools/ninja产出tracebox、traced守护进程、traced_probes采集探针与perfetto命令行客户端。4.2 三步完成系统级采集第一步启动中央守护进程traced --background第二步用文本格式配置启动perfetto客户端输出写入~/tmp/example.logperfetto -o ~/tmp/example.log --txt -c src/tracing/perfetto/matter.cfg-c指向的配置文件即仓库中的 src/tracing/perfetto/matter.cfg。它默认采集 5 分钟但可随时手动停止。第三步让应用接入系统追踪——此时--trace-to不带路径out/linux-x64-chip-tool/chip-tool \ pairing onnetwork 1 20202021 \ --trace-to perfetto应用通过perfetto::kSystemBackend把track_event发送到已运行的traced守护进程由守护进程统一聚合后写入perfetto -o指定的输出文件。这样即可在同一条时间轴上对比控制器与设备端的事件。五、matter.cfg 配置文件逐项解读src/tracing/perfetto/matter.cfg 虽短小但完整定义了一次系统级采集的关键参数# One buffer allocated within the central tracing binary for the entire trace, # shared by the two data sources below. buffers { size_kb: 20480 fill_policy: RING_BUFFER } # grab track events data_sources { config { name: track_event } } # 5min trace, but can be stopped prematurely. duration_ms: 300000 write_into_file: true配置项取值含义buffers.size_kb20480在中央 traced 二进制内为整条追踪分配 20 MB 共享环形缓冲区buffers.fill_policyRING_BUFFER缓冲区满后采用环形覆盖策略保留最近的数据data_sources.config.nametrack_event开启 Perfetto Track Event 数据源对应 Matter 中的TRACE_EVENT/MATTER_TRACE_*事件duration_ms300000默认采集 5 分钟可提前手动停止write_into_filetrue直接写入文件配合perfetto -o指定输出路径若需延长采集时长或扩大缓冲直接修改duration_ms与size_kb即可。作为对照进程内模式FileTraceOutput::Open见 file_output.cpp动态构造的是 1 MB 缓冲 track_event数据源的简化配置。六、底层实现剖析6.1 追踪宏桥接macros_impl.h 是matter_trace_config指向的核心头文件。它先通过PERFETTO_DEFINE_CATEGORIES定义一个名为Matter、描述为 Matter trace events 的事件类别再提供全部宏实现#define MATTER_TRACE_BEGIN(label, group) TRACE_EVENT_BEGIN(Matter, label, class_name, group) #define MATTER_TRACE_END(label, group) TRACE_EVENT_END(Matter) #define MATTER_TRACE_INSTANT(label, group) TRACE_EVENT_INSTANT(Matter, label, class_name, group) #define MATTER_TRACE_SCOPE(label, group) TRACE_EVENT(Matter, label, class_name, group)MATTER_TRACE_SCOPE对应作用域式单宏自动配对 begin/endMATTER_TRACE_BEGIN/END为显式成对事件MATTER_TRACE_INSTANT记录瞬时事件另有MATTER_TRACE_COUNTER宏通过内部静态计数器配合TRACE_COUNTER输出单调递增的计数序列适合统计型指标。头文件开头还通过#if defined(MATTER_TRACE_BEGIN)检查防止宏被重复定义——这正是 Perfetto 后端独占追踪宏设计的一部分由于TRACE_EVENT_*直接内联Matter 默认不再为 Perfetto 后端提供TraceBegin/End/Instant回调版本见 perfetto_tracing.h 中EXPLICITLY not provided的注释以避免双层分发带来的额外开销。注意追踪标签与瞬时值必须是常量字符串因为 Perfetto 会将其标记为perfetto::StaticString以便缓存。6.2 初始化与事件存储simple_initialize.cpp 把 Perfetto 初始化收敛为一个函数void Initialize(uint32_t backends) { perfetto::TracingInitArgs args; args.backends backends; perfetto::Tracing::Initialize(args); }按注释约定backends通常传perfetto::kSystemBackend对接traced守护进程、perfetto::kInProcessBackend进程内自采自写或两者组合。event_storage.cpp 负责事件存储的注册与冲刷文件顶部PERFETTO_TRACK_EVENT_STATIC_STORAGE()基于macros_impl.h中定义的类别注册静态存储RegisterEventTrackingStorage()调用perfetto::TrackEvent::Register()在启动追踪前必须调用FlushEventTrackingStorage()调用perfetto::TrackEvent::Flush()在停止/收尾阶段把内存中的事件落盘。6.3 文件输出file_output.h 中的FileTraceOutput类封装了一次完整的文件会话Open()自动创建目标文件所在目录0640 权限随后构造 Perfetto 追踪配置1 MB 缓冲 track_event数据源通过perfetto::Tracing::NewTrace()建立会话并StartBlocking()开始采集Close()则依次执行FlushBlocking()、StopBlocking()并关闭文件描述符。它把CHIP_ERROR与 POSIXerrno做了桥接任何一步失败都会返回对应的 Matter 错误码。6.4 高层数据记录后端perfetto_tracing.cpp 中的PerfettoBackend把 Matter 的高层数据记录翻译为 Perfetto 瞬时事件全部落在Matter类别下消息收发LogMessageReceived/LogMessageSend输出 Message Received/Message Send 事件并以message_type参数标注Group/Secure/Unauthenticated节点发现LogNodeLookup携带node_id与compressed_fabric_idLogNodeDiscovered区分Intermediate中间结果、Final解析完成与Retry Different三种状态同时记录解析出的addressLogNodeDiscoveryFailed额外附上error经chip::ErrorStr格式化指标事件LogMetricEvent依据MetricEvent的值类型kInt32/kUInt32/kChipErrorCode输出带value或error字段的瞬时事件事件名使用perfetto::DynamicString以支持动态键名。七、使用前提与注意事项平台与构建开关Perfetto 后端默认仅在current_os linuxmatter_trace_config同时覆盖 android见 tracing_args.gni时启用命令行应用的 perfetto 支持同样以 Linux 为默认examples/common/tracing/BUILD.gn 中的matter_commandline_enable_perfetto_tracing。其他平台默认走none完全编译剔除或 darwin 后端。追踪为显式启用opt-in且启用后main()需显式注册后端。SDK 依赖perfetto_tracing目标依赖 third_party/perfetto/BUILD.gn 提供的sdk目标编译repo/sdk/perfetto.cc与perfetto.h构建前需确认 perfetto 子模块已就位。系统级模式的顺序务必先启动traced --background再启动perfetto -c matter.cfg客户端最后才启动应用否则应用可能因无法连接守护进程而丢失系统追踪。追踪数据消费无论perfetto:path还是系统级采集生成的.log文件均可导入 Perfetto UI 进行时间轴、火焰图与事件过滤分析README 明确指出追踪文件through the Perfetto UI可用这也是最直观的调试手段。综上Perfetto 后端为 Matter 开发者提供了从单进程快速取证到多进程协同排障的一体化追踪方案进程内模式零依赖、即插即用系统级模式则可借助matter.cfg灵活调整缓冲与时长。配合Matter事件类别与Message Send/Received、NodeLookup/Discovered、Discovery Failed、指标事件等预置埋点开发者能够在同一时间轴上完整还原一次配网、发现或消息交互的全过程从而高效定位协议时序与性能瓶颈。【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考