Perfetto 后台后台后台后台后台后台后台后台后台后台
Perfetto 后台后台后台后台后台后台后台后台后台后台【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfettoPerfetto 后台追踪指南使用 --background-wait 在 Android/Linux 上长时间采集与安全回收 trace 文件在 Android 设备或 Linux 服务器上进行长时间性能采集时往往需要断开 adb/ssh 会话后让采集任务继续运行稍后再回来停止会话并取回 trace 文件。本文基于 Perfetto 官方文档与源码系统讲解如何用--background-wait将perfetto守护化为后台进程、如何优雅地通过信号停止采集以及如何借助平台自带的inotify机制确保取回的文件完整无损。读完本文你将掌握一套可复制、可落地的后台长 trace 采集 安全回收实战方案。适用场景为什么需要在后台运行 trace假设你要在一台 Android 设备或 Linux 服务器上录制一段长时间运行的 trace例如复现偶发的性能问题、监控数小时的内存或调度行为随后就终止掉当前的 adb/ssh 会话。当你之后重新登录时希望停止这次追踪会话并取回 trace 文件同时保证文件内容完整。这种需求下直接在前台运行perfetto显然不行一旦 shell 会话被关闭前台进程会随终端一起退出trace 录制随即中断。Perfetto 为此提供了专门的后台化daemonize能力让perfetto命令本身脱离终端转为一个后台进程继续采集并把它的进程 IDPID打印出来供后续操作使用。与同样常用于后台采集的--detach/--attach模式相比详见 docs/concepts/detached-mode.md该文档明确提示这两个模式属于高级用法、通常不建议普通场景使用--background系列是官方推荐的简单方案它不需要为消费者端配置额外的write_into_file等前置条件一条命令即可完成后台化。核心命令--background 与 --background-wait后台采集由两个命令行参数驱动二者的关系如下参见 docs/reference/perfetto-cli.md 与 src/perfetto_cmd/perfetto_cmd.cc参数简写行为--background-d立即从命令行界面退出采集在后台继续stdout 打印后台进程 PID--background-wait-D与--background类似但会等待最长 30 秒所有数据源成功启动后才退出退出码为 0 表示所有数据源已就绪非 0 表示出错或超时--notify-fdFD—与--background-wait类似但不做守护化而是在数据源启动完成后向指定文件描述符写入一个状态字节并关闭它成功写0超时/出错写非 0Windows 不支持官方明确建议优先使用--background-wait而不是--background前者会等到所有数据源data source都启动完毕后才让前台进程退出从而确保 trace 开头不会有数据丢失。这一点在源码中有完整的实现佐证在 src/perfetto_cmd/perfetto_cmd.cc 中当background_为真时进程调用base::Daemonize(...)完成守护化父进程在回调中打印 PID如果同时设置了background_wait_则父进程进入WaitOnBgProcessPipe()等待子进程通过管道回报状态。WaitOnBgProcessPipe()src/perfetto_cmd/perfetto_cmd.cc使用poll以 30000ms 为超时监听后台进程写回的状态字节超时或读取失败都会在 stderr 打印错误信息并返回非 0 退出码。后台子进程在完成真正的采集启动流程后通过ConnectToServiceRunAndMaybeNotify()里的NotifyBgProcessPipe()src/perfetto_cmd/perfetto_cmd.cc回报WaitStatuskWaitOk 0表示成功kWaitOtherError 1表示其他错误kWaitTimeout 2表示超时枚举定义见 src/perfetto_cmd/perfetto_cmd.h。也就是说--background-wait其实是一个守护化 数据源就绪握手的组合前台进程只有确认后台采集端已经把所有数据源启动并收到成功应答后才会退出避免了传统nohup ... 方案中进程刚 fork 出来就被当作成功、实际数据源还没起来的竞态。开始后台录制一条命令完成守护化使用tracebox或perfetto即可启动后台录制。最基础的命令如下perfetto -c config.cfg --txt -o trace.pftrace --background-wait命令参数说明-c config.cfg指定 trace 配置文件路径--txt表示该配置文件是文本格式pbtxt。配置文件也支持从 stdin 传入此时-c -。-o trace.pftrace指定输出 trace 文件路径-表示输出到 stdout。输出格式遵循 protos/perfetto/trace/trace.proto 中定义的格式。--background-wait后台化并等待数据源全部启动最多 30 秒。执行后stdout 会打印出后台perfetto进程的 PID例如12345记录这个 PID后续停止采集时需要向它发送信号。配套选项--no-clobber不要覆盖已存在的输出文件与-o配合使用。--txt配置文件为文本 pbtxt 格式不带该参数时按二进制 proto 解析。如果配置了触发trigger相关的字段trigger_config还可以用--activate-trigger等参数激活特定 trigger适合后台长跑场景中的按需触发。优雅停止kill 之后为什么必须等待 close_write当你想结束这次后台采集时需要向后台perfetto进程发送SIGINT或SIGTERM信号kill pid # 或 kill -TERM pid / kill -INT pid这里的信号处理流程在源码中有明确实现SetupCtrlCSignalHandler()src/perfetto_cmd/perfetto_cmd.cc注册了 Ctrl-C 处理器收到SIGINT/SIGTERM后打印日志SIGINT/SIGTERM received: disabling tracing.然后先对消费者端执行一次Flush()把缓冲区中剩余的数据冲刷出去冲刷成功后再调用DisableTracing()停止追踪。也就是说信号触发的是先 flush 再停的优雅关闭流程而非立即暴毙。关键陷阱在于kill命令是异步返回的。kill只是把信号投递出去就立刻返回了而此时后台 Perfetto 进程可能仍在把 trace 的最后一部分数据写入磁盘即执行上述 flush 关闭输出文件的收尾工作。如果此时立刻去拷贝 trace 文件拿到的很可能是不完整、末尾截断的文件。为此官方给出的做法是等待 trace 文件上的close_write事件。该事件表示 Perfetto 已经完成写入并关闭了文件此刻文件才是完整可用的。Linux 平台下可以用inotify系列工具来监听这一事件。补充长 trace 与 write_into_file后台长 trace 通常还会在 TraceConfig 中开启边录边写能力让数据周期性地落到磁盘而非全部积压在内存。相关字段见 docs/concepts/config.mdwrite_into_file (bool)为 true 时周期性地把 trace 缓冲区排空写入输出文件。此时用户态缓冲区只需足够容纳两个写入周期之间的数据即可典型设备数据速率约为 1-4 MB/s因此 16MB 内存缓冲区大约能支撑约 4 秒的写入周期。file_write_period_ms (uint32)覆盖默认的排空周期5 秒。周期越短需要的用户态缓冲区越小但追踪的性能侵入性越高若设置值小于 100ms追踪服务会按 100ms 处理。max_file_size_bytes (uint64)写入达到 N 字节后自动停止采集用于限制 trace 文件大小。完整的长 trace 配置示例可参考 test/configs/long_trace.cfg。总结来说设置write_into_file: true、较长的duration_ms并把内存缓冲区配置为 32MB 或更大即可支撑数小时的后台采集。等待文件落盘Linux 与 Android 的 inotify 方案close_write事件需要借助平台特定的inotify工具来监听官方针对两种常用平台给出了两条等价命令。LinuxinotifywaitDebian 系 Linux 使用inotify-tools软件包中的inotifywaitkill pid inotifywait -e close_write trace.pftrace执行逻辑先向后台 Perfetto 进程发送终止信号然后立即用inotifywait监听trace.pftrace的close_write事件。inotifywait会阻塞直到检测到文件被写入并关闭后才返回——此时 kill 之后 Perfetto 的 flush 关闭文件流程必然已完成文件才是完整可靠的。如果你的发行版尚未安装可通过包管理器安装sudo apt-get install inotify-tools # Debian/Ubuntu 系AndroidinotifydAndroid 上使用 toybox 自带的inotifydkill pid inotifyd - trace.pftrace:w | head -n0参数拆解inotifyd的第一个参数是事件处理脚本-表示忽略事件内容不执行任何动作仅等待第二个参数trace.pftrace:w表示监视该文件上的wCLOSE_WRITE即写入后关闭事件| head -n0使管道尽快结束从而让整条命令在事件发生的那一刻立即返回避免inotifyd无限期挂起。执行完成后trace.pftrace就是一个完整、可安全取走的 trace 文件可以adb pull到本地或直接用trace_processor、Perfetto UI 打开分析。完整实战流程与验证把以上步骤串起来一次完整的后台采集会话如下# 1. 启动后台采集等待数据源就绪后才返回最多 30s perfetto -c config.cfg --txt -o /data/misc/perfetto-traces/trace.pftrace --background-wait 12345 # - 打印出的后台进程 PID # 2. 断开 adb/ssh去忙别的事…… 数小时后回来 # 3. 优雅停止并等待文件完整落盘Android 示例 kill 12345 inotifyd - trace.pftrace:w | head -n0 # 4. 此时文件已完整拉取到本地 adb pull /data/misc/perfetto-traces/trace.pftrace .如何验证文件完整性用ls -l trace.pftrace观察文件大小是否稳定不再增长在 Linux 上inotifywait返回后再确认一次文件的 mtime将文件交给 trace 处理器验证trace_processor trace.pftrace select count(*) from slicetrace_processor的使用参见 docs/analysis/trace-processor.md能正常出结果通常说明文件头尾完整。常见问题与注意事项为什么不用--background而用--background-wait--background立即退出前台进程此时数据源可能尚未启动完成trace 开头可能缺数据--background-wait通过父子进程管道握手确保所有数据源启动后才退出且以退出码反映启动成败脚本化时更容易判断。kill之后文件还是缺尾巴几乎可以肯定是取文件太快kill返回 ≠ 写入完成务必等待close_write事件后再拷贝。--detach和--background互斥吗是。源码中明确检查了二者互斥见 src/perfetto_cmd/perfetto_cmd.cc且--detach模式要求 TraceConfig 中write_into_file为 truesrc/perfetto_cmd/perfetto_cmd.cc。日常后台采集请优先使用--background-wait。守护化后还能不能拿到错误信息--background-wait在数据源启动超时或失败时会在 stderr 打印Timeout waiting for all data sources to start或Background process failed, WaitStatusN之类的诊断信息src/perfetto_cmd/perfetto_cmd.cc并返回非 0 退出码。Windows 支持吗--background/--background-wait依赖 Unix 的 daemonize 与管道机制源码中相关路径均有#if !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)保护--notify-fd在 docs/reference/perfetto-cli.md 中也明确标注 Windows 不支持本文方案面向 Linux/Android。关联资源官方后台追踪文档docs/learning-more/tracing-in-background.md命令行参数完整参考docs/reference/perfetto-cli.md后台化与信号处理实现src/perfetto_cmd/perfetto_cmd.cc、src/perfetto_cmd/perfetto_cmd.cc长 trace 配置说明与示例docs/concepts/config.md、test/configs/long_trace.cfg高级分离模式对比阅读docs/concepts/detached-mode.md后台采集的另一种形态开机自启抓取上次开机 tracedocs/data-sources/previous-boot-trace.md【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考