内容提要
本文介绍 Perfetto Trace 数据丢失的排查方法。数据流经内核 ftrace、producer 共享内存、central buffer 到写文件,任一环节处理不及时都会导致丢数据,且 flush 不等于落盘。建议分析前先查看 stats,定位丢失环节并判断指标可信度。ftrace 丢失会降低调度与唤醒结论的可信度;central buffer 覆盖或丢弃会挤掉低频关键数据。优化措施包括减少事件、增大或拆分 buffer、周期性写文件,并在报告中标注证据可信度与限制。
延伸解读
为什么 Trace 有数据不等于证据完整
Perfetto 的写入路径是异步的:producer 先写共享内存,再提交到 central buffer,最后落盘。任一环节处理不及时都会丢数据,而 flush 只保证数据提交到 tracing service,并不等于写入文件。因此,打开 Trace 后应先查 stats,定位丢失发生在 ftrace、central buffer 还是解析阶段,再判断哪些指标可信。忽略这一步,后续 SQL 分析可能只是把缺失证据包装成表格。
ftrace 丢失对调度类结论的影响
当 stats 出现 ftrace_cpu_has_data_loss,说明内核 per-CPU buffer 到用户态读取之间发生了丢失。这会影响 CPU 调度、Runnable 时间、唤醒关系和 Binder 内核事件等判断。已观察到的 sched 行可作为残留线索,但负向结论必须降级:不能写“没有 Runnable 等待”“没有 wakeup 延迟”。要讨论 CPU busy,还需在同一窗口检查 sched、thread_state、CPU idle 等覆盖情况。
central buffer 覆盖与低频数据被挤掉
central buffer 的 RING_BUFFER 策略会覆盖旧数据,DISCARD 则丢弃新数据。当高频 sched 事件与低频的 process stats、log、FrameTimeline、App Track Event 混放在同一 buffer 时,低频关键数据可能被挤掉,导致线程名、进程名、内存采样或帧指标缺失。建议按 buffer idx 查看 traced_buf_chunks_overwritten 等统计,并将高频与低频数据源分到不同 target_buffer,以隔离竞争。
报告里如何标注 Trace 可信度
有数据丢失的 Trace 不一定完全作废,但报告必须写明边界。建议固定字段记录 trace_quality_status、affected_sources、affected_metrics、usable_metrics、unusable_metrics、evidence_grade、recapture_required 等。例如 ftrace 丢失时,调度归因降级,但 FrameTimeline 若覆盖完整且无 parser 异常仍可使用。每个关键结论都应附上证据来源、可信度和限制条件,避免把“没有看到”写成“没有
Q&A
Perfetto Trace 数据丢失可能发生在哪些环节?
数据丢失可能发生在四个环节:内核 ftrace per-CPU buffer、producer 共享内存、central buffer(Ring 覆盖或 Discard 丢弃)、输出文件与解析阶段。此外,增量状态(如 track descriptor、interned strings)丢失也会导致事件只剩 ID 或无法解析。
如何用 stats 检查 Perfetto Trace 的数据质量?
使用 Trace Processor 查询 stats 表,筛选非零且 severity 为 error 或 data_loss 的项,以及关键 info 项如 traced_buf_chunks_overwritten、ftrace_setup_errors、frame_timeline_event_parser_errors 等。根据统计项名称和 source 判断丢失环节,并评估对结论的影响。
ftrace 数据丢失会影响哪些分析结论?
ftrace 丢失会影响 CPU 调度、Runnable 时间、唤醒关系、Binder 内核事件等判断。已观察到的 sched 行可作为残留线索,但负向结论要全部降级,不能写“没有 Runnable 等待”“没有 wakeup 延迟”“没有调度阻塞”。
central buffer 的 Ring 覆盖和 Discard 丢弃有什么区别?
Ring 覆盖(traced_buf_chunks_overwritten)是写满后覆盖旧数据,Discard(traced_buf_chunks_discarded)是写满后丢弃新数据。两者都会导致数据丢失,但影响不同:覆盖会挤掉低频关键数据,丢弃会丢失后续事件。
如何优化 Perfetto 抓取配置以减少数据丢失?
优化措施包括:减少不必要的事件、增大或拆分 buffer(如高频和低频数据分开)、设置周期写文件(write_into_file 和 file_write_period_ms)、调整 flush_period_ms、使用 incremental_state_config 的 clear_period_ms 定期重发描述信息。对于 ftrace,可增大 buffer_size_kb 和减小 drain_period_ms。
在分析报告中如何标注 Trace 的可信度?
报告应包含结构化字段如 trace_quality_status、affected_sources、affected_metrics、usable_metrics、unusable_metrics、evidence_grade、fallback_used、recapture_required 等,并附自然语言说明,明确哪些结论可信、哪些只能参考、下一次如何补采。每个关键结论都应附上证据来源、可信度和限制条件。