十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Perfetto Data Explorer 的 Slices with Details 节点:从 trace 切片到进程/线程上下文的一站式数据源

Perfetto Data Explorer 的 Slices with Details 节点:从 trace 切片到进程/线程上下文的一站式数据源 Perfetto Data Explorer 的 Slices with Details 节点从 trace 切片到进程/线程上下文的一站式数据源【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto导读Slices with Details带详细上下文的切片是 Perfetto UI 中 Data Explorer数据探索器插件内置的 Source 节点它把 trace 中所有 slice切片数据与进程、线程上下文一次性预连接好让开发者无需手动写 JOIN 就能直接对函数调用、调度区间、GPU 工作等时间区间进行过滤、聚合与排序分析。读完本文你将掌握该节点的完整列语义、底层thread_or_process_slice视图的实现原理、典型分析流程以及它与原始slice表Table Source的差异和选型建议。什么是 Slices with Details在 Perfetto 的 trace 数据模型中slice 表示一段带有起止时间的时间区间用来追踪一段执行过程——例如一次函数调用、一次 CPU 调度驻留、一段 GPU 工作。Slices with Details节点提供了来自 trace 的 slice 数据并自动附带进程与线程上下文是 Data Explorer 中最常用的起点节点之一。从 Data Explorer 插件源码看该节点在节点注册表中以slice为 key 注册显示名Slices图标为bar_chart快捷键为l类型为source并出现在插件首页showOnLandingPage: true对应节点类型NodeType.kSimpleSlices见 core_nodes.ts。在画布上它显示为 Slices with detailsslices_source.ts。如何使用使用方式非常简单原文档给出的核心步骤在 Data Explorer 画布中添加该节点快捷键l即获得全部 slice 数据作为起点节点自动附带进程process与线程thread上下文列无需任何配置数据立即可用后续通过连接 Filter、Aggregation、Sort、Limit 等下游节点进行过滤与分析该节点是纯 Source 节点本身不做任何数据变换也不接受上游输入。在源码层面SlicesSourceNode的可序列化配置SlicesSourceNodeAttrs是一个空对象slices_source.tsvalidate()恒为true无需校验、无必填参数nodeSpecificModify()返回undefined节点没有专属配置面板这些共同印证了零配置的设计。可用列一览原文档将列分为基础列与上下文列两类。结合节点源码slices_source.ts该节点实际暴露 16 个列比原文档列出的更多额外包含track_name、pid、tid、arg_set_id且每个列都带有类型标注列名类型说明idID引用slice.id切片唯一标识符tsTIMESTAMP开始时间戳纳秒durDURATION持续时间纳秒nameSTRING切片名称/标签track_idJOINID引用track.id关联的 track 标识track_nameSTRINGtrack 名称process_nameSTRING进程名称上下文列upidJOINID引用process.id进程标识可与 process 表连接pidINT进程的 pidthread_nameSTRING线程名称上下文列utidJOINID引用thread.id线程标识可与 thread 表连接tidINT线程的 tiddepthINT在 track 内的嵌套深度parent_idJOINID引用slice.id父切片标识嵌套切片用categorySTRING切片类别/类型arg_set_idARGSETID参数集标识可关联切片附加参数其中id、track_id、upid、utid、parent_id均带 JOINID 类型标注意味着在 UI 中可直接用于 Add Columns、Join 等节点与其他表关联。底层数据源thread_or_process_slice视图该节点的数据来源于slices.with_context模块中的thread_or_process_slice表视图它将 slice 数据与进程、线程信息组合在一起。其 SQL 实现位于 with_context.sql同模块还提供了thread_slice、process_slice两个视图。视图构成与 UNION ALL 语义thread_or_process_slice由两个分支通过UNION ALL合并with_context.sql线程切片分支从thread_track出发JOIN _thread_with_process USING (utid)预取线程进程上下文再JOIN slice ON slice.track_id thread_track.id产出线程相关的切片进程切片分支从slice出发JOIN process_track ON slice.track_id process_track.id再JOIN process USING (upid)产出进程级 track 上的切片该分支的thread_name、utid、tid显式置为NULL。因此结果集中凡是线程 track 上的切片都带完整的线程/进程上下文进程级切片只有进程上下文线程相关列thread_name、utid、tid为NULL——这是使用该节点时需要注意的一个细节。性能设计维度表在前、事实表在后源码注释明确解释了 JOIN 顺序的设计考量with_context.sql线程/进程上下文在_thread_with_process中预先物化使thread LEFT JOIN process只发生一次后续所有 JOIN 都是 INNERSQLite 不会把虚拟表跨越 LEFT JOIN 重排因此slice.id上的按 id 驱动的连接得以保留。同时把维度表thread_track、_thread_with_process放在前面、大事实表slice放在最后查询规划器可以从任意被过滤的一侧驱动扫描。与底层slice表的关系底层slice表由 trace processor 的 schema 生成器定义在 slice_tables.pySQL 名__intrinsic_slice对外包装为slice视图核心列包括ts、dur、track_id、category、name、depth、parent_id、arg_set_id、thread_ts、thread_dur等。thread_or_process_slice正是以slice为事实表通过 track 表桥接并补齐进程/线程信息。注意with_context视图并未暴露thread_ts、thread_dur线程局部时间戳如需这两列需使用thread_slice视图或直接查slice表。节点如何生成查询从 UI 到结构化查询当SlicesSourceNode被要求生成查询时它调用StructuredQueryBuilder.fromTable(thread_or_process_slice, slices.with_context, undefined, this.nodeId)slices_source.ts即生成一个PerfettoSqlStructuredQuery其 table 指向thread_or_process_slice并声明引用模块slices.with_contextstructured_query_builder.ts。随后applyNodeColumnSelection会根据用户在 UI 中勾选的列把列选择写入selectColumns若所有列都被勾选则省略显式列选择structured_query_builder.ts。该结构化查询最终由 trace processor 侧的结构化查询生成器转换为实际 SQL生成器同样引用slices.with_context模块见 structured_query_generator.cc保证模块依赖在编译期被正确 include。典型使用场景与等价 SQL原文档给出了三个实战场景这里补充其等价 SQL便于在 trace processor shell 中直接验证场景 1查找特定函数的所有切片在节点后连接 Filter 节点条件name my_function。等价 SQLSELECT * FROM slices.with_context.thread_or_process_slice WHERE name my_function;场景 2按进程分析切片耗时添加 Aggregation 节点GROUP BYprocess_name。等价 SQLSELECT process_name, COUNT(*) AS slice_count, SUM(dur) AS total_dur_ns, AVG(dur) AS avg_dur_ns FROM slices.with_context.thread_or_process_slice GROUP BY process_name;场景 3找出最长的切片添加 Sort 节点dur DESC Limit 节点10 条。等价 SQLSELECT * FROM slices.with_context.thread_or_process_slice ORDER BY dur DESC LIMIT 10;由于视图已经完成上下文连接上述分析无需再手写任何 JOIN。而 filter_during、interval_intersect 等时间区间类下游节点在构建查询时会自动为输入补上dur 0过滤剔除未完成dur 0的切片避免把进行中的切片误当完整区间参与计算structured_query_builder.ts。与 Table Sourceslice 表的对比维度Slices with DetailsTable Sourceslice表数据形态预连接进程/线程上下文的视图原始slice表上下文列自带process_name、thread_name、upid、utid、pid、tid无需自行 JOIN列数量16 列精选常用列更多列含thread_ts、thread_dur、thread_instruction_count等易用性即取即用适合快速分析灵活但需额外连接步骤典型场景快速过滤、按进程聚合、找最长切片需要完整 schema 或自定义深挖时Table Source 的节点文档也印证了这一分工它提供所选表的原始数据所有行与列都可用并提示upid、utid、track_id这类 JOINID 列可配合 Add Columns 节点自行补全上下文见 table_source.md。因此选型建议是日常 80% 的 slice 分析用 Slices with Details只有当需要slice表专属列如线程局部时间戳、指令计数或完整 schema 时才改用 Table Source。小结Slices with Details是 Data Explorer 中零配置、开箱即用的切片分析入口它以slices.with_context模块的thread_or_process_slice视图为数据源把 slice 事实表与进程/线程维度一次连接完成并通过带类型的列元数据支撑后续 Filter、Aggregation、Sort、Interval Intersect 等各类下游节点。理解其 UNION ALL 结构、上下文列的空值语义与底层slice表的差异能帮助你在分析 trace 时更准确地定位数据、写出更高效的查询。【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表