ARTICLE DETAIL

资讯详情

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

Perfetto Linux 全栈追踪实战:用 tracebox 与 TraceConfig 完成从录制到分析的闭环

Perfetto Linux 全栈追踪实战:用 tracebox 与 TraceConfig 完成从录制到分析的闭环 Perfetto Linux 全栈追踪实战用 tracebox 与 TraceConfig 完成从录制到分析的闭环【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto在 Linux桌面、服务器、嵌入式上Perfetto 的整套追踪能力被封装进一个名为tracebox的静态可执行文件中。本文基于仓库中的 Linux 录制指南 recording_linux_traces.md 展开覆盖 tracebox 的下载、TraceConfig配置的编写与裁剪、录制命令的参数与权限要求以及如何用trace_processor查询结果。读完后你可以在任意一台 Linux 机器上独立完成一次“配置驱动”的系统级追踪并拿到可读的调度、内存、CPU 采样数据。适用场景与整体思路Perfetto 在 Linux 上的工作模型与 Android 有明显区别Android 上设备端常驻traced守护进程、主机侧有record_android_trace等辅助脚本而在 Linux 上一切由单个静态链接二进制tracebox驱动它同时打包了追踪守护进程traced、traced_probes和perfetto录制命令。这意味着没有辅助脚本没有 atrace 类别缩写——录制永远是配置驱动的config-driven二进制自包含可以复制到任意 Linux 机器x86_64 与 arm64 构建会按当前主机架构自动分发录制的输出文件就是标准 Perfetto 追踪与平台无关。Android 设备的录制见 recording_android_traces.md两者不要混用。第一步获取 tracebox指南给出的最小安装方式只有两行curl -LO https://get.perfetto.dev/tracebox chmod x tracebox仓库内的 tools/tracebox 脚本揭示了其背后的分发机制这对理解“为什么下载下来就是一个能跑的二进制”很有帮助该脚本是一份自动生成的清单加载器由tools/gen_amalgamated_python_tools生成内嵌TRACEBOX_MANIFEST见 tools/tracebox按platform machine匹配本机架构后下载对应预编译产物覆盖linux-amd64x86_64、linux-armarmv6l/armv7l/armv8l、linux-arm64aarch64等多种 Linux 目标同时也有 macOS 与 Android 版本每个条目带有sha256校验值下载后先验证再落盘缓存目录为~/.local/share/perfetto/prebuilts/且缓存文件名内嵌 SHA 前 16 位使同一机器上可并存多个版本见 download_or_get_cached 实现因此仓库内的tools/tracebox与指南中直接下载的tracebox是同一分发链路的两种入口前者从 git 仓库拿到锁定版本的加载器后者从发布端点直接拿二进制。第二步编写 TraceConfigPerfetto 的录制行为完全由一份TraceConfigprotobuf 决定Linux 上与其他平台格式相同只是可用的数据源集合不同。配置采用 protobuf文本格式书写约定俗成保存为config.pftxt其权威 schema 是 protos/perfetto/config/trace_config.proto。配置的基本骨架摘自 trace_config_reference.mdbuffers { size_kb: 32768 # 缓冲大小单位是 KB不是字节 fill_policy: RING_BUFFER # 保留最新数据DISCARD 则保留最早数据 } duration_ms: 10000 # 省略则一直录到手动停止 data_sources { config { name: linux.ftrace # 指定启用哪个 producer ftrace_config { ... } # 该 producer 自己的选项 } } # ...更多 data_sources 块每个数据源一块...合并两份配置的方法只保留一个buffers段把各自的data_sources块拼接起来每个数据源最多出现一次linux.ftrace尤其如此——把所有ftrace_events/atrace_categories/atrace_apps条目合并进同一个块。Linux 可直接使用的示例配置指南明确列出了四份在 Linux 上“开箱即用”的示例配置均位于 example-configs/ 目录文件用途sched_cpu.pftxtCPU 调度 频率/空闲状态绝大多数性能调查的基础层memory_counters.pftxt系统级 每进程内存随时间变化、LMK 活动cpu_profile.pftxt周期性 CPU 调用栈采样traced_perflong_background.pftxt长时/现场追踪环形缓冲 周期性落盘以最典型的sched_cpu.pftxt为例完整内容如下# CPU scheduling: who ran when, on which core, at what clock speed. # The base layer for almost any performance investigation. buffers { size_kb: 32768 fill_policy: RING_BUFFER } duration_ms: 10000 data_sources { config { name: linux.ftrace ftrace_config { ftrace_events: sched/sched_switch ftrace_events: sched/sched_wakeup ftrace_events: sched/sched_waking ftrace_events: sched/sched_process_exit ftrace_events: sched/sched_process_free ftrace_events: power/cpu_frequency ftrace_events: power/cpu_idle ftrace_events: power/suspend_resume } } } # Resolves thread/process ids in sched events to readable names. data_sources { config { name: linux.process_stats process_stats_config { scan_all_processes_on_start: true } } }它体现了两个常见要点事件要配对sched_switch之外还要开sched_wakeup/sched_waking否则“线程何时可运行”的时间线不完整ID 要可解析linux.process_stats的scan_all_processes_on_start: true负责把调度事件里的 tid/pid 解析成可读的线程/进程名缺了它分析阶段只能看到数字。其余三份示例的关键点memory_counters.pftxt组合了三个数据源——linux.sys_stats周期性轮询/proc/meminfo与/proc/vmstatmeminfo_period_ms: 1000控制采样间隔、linux.process_statsproc_stats_poll_ms: 10000周期性采集每进程 RSS/OOM 分数、linux.ftrace的kmem/rss_stat与lowmemorykiller/lowmemory_kill内核事件共同构成“系统内存 每进程内存 内核回收行为”的完整视图cpu_profile.pftxt启用linux.perf数据源timebase { frequency: 100 }表示每秒 100 次采样callstack_sampling { scope { target_cmdline: ... } }把采样限定到某个进程process_cmdline/target_cmdline匹配进程的命令行子串Linux 上的语义与 Android 一致long_background.pftxt演示了长时追踪的四个关键顶层开关见下文“长时追踪”一节。Linux 裁剪规则从 Android 示例中删什么指南对“把 Android 示例改到 Linux 上用”给出了明确规则ftrace_config里的atrace_categories/atrace_apps是 Android 专属Linux 上无效应删除所有android.*前缀的数据源android.java_hprof、android.heapprofd、android.surfaceflinger.frametimeline、android.log等在 Linux 上都不适用仓库中 java_heap_dump.pftxt、native_heap.pftxt、app_jank.pftxt 这几份示例就是这类 Android 专属配置需要 CPU 调用栈采样时改用 Linux 通用的linux.perfcpu_profile.pftxt的写法而不是 Android 的android.heapprofd路径。一份配置能否被解析只有在录制命令加载配置时才会暴露见下一步所以配置完成后立刻走一次录制流程是最快的校验方式。第三步执行录制核心命令只有一条# ftrace 在大多数发行版上需要 root用 sudo 运行 sudo ./tracebox -o trace.perfetto-trace --txt -c config.pftxt参数与行为要点--txt声明配置文件是文本格式如果用的是二进制编码的配置则省略该参数-o输出文件路径扩展名不限.perfetto-trace、.pftrace、.pb均可-cTraceConfig 文件路径配置中没有duration_ms时录制持续到 Ctrl-C有则到点自动停止配置写错会快速失败字段名拼写错误会在解析阶段报出指明坏字段的解析错误——把它当作配置校验器改完重试即可。文本格式的枚举值是裸标识符fill_policy: RING_BUFFER字符串才需要引号。权限哪些数据源需要 root指南按数据源划清了权限边界这与仓库文档 linux-cookbook.md 中的说明一致数据源权限要求说明linux.sys_stats、linux.process_stats无需 root只轮询/proclinux.ftrace一般需 root读取/sys/kernel/tracinglinux.perf一般需 root依赖perf_event_open受kernel.perf_event_paranoid约束如果不想每次都sudolinux-cookbook 给出的等效一次性授权每次开机后生效是# ftrace 类数据源 sudo chown -R $USER /sys/kernel/tracing # linux.perf 调用栈采样 echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid # 解析内核符号kallsyms调用栈中出现内核帧时需要 echo 0 | sudo tee /proc/sys/kernel/kptr_restrict长时追踪让 trace 活得比内存久对于持续数十分钟以上的现场追踪直接照抄 long_background.pftxt 的写法即可四个顶层开关各司其职buffers { size_kb: 65536 fill_policy: RING_BUFFER } # 不写 duration_ms手动停止Ctrl-C write_into_file: true file_write_period_ms: 2500 flush_period_ms: 30000 max_file_size_bytes: 1000000000write_into_file: truefile_write_period_ms周期性把环形缓冲里的数据流式写入输出文件使追踪总时长可以超过 RAM 能容纳的量flush_period_ms: 30000周期性提交应用侧共享内存缓冲保证事件顺序不乱max_file_size_bytes给输出文件设上限省略duration_ms表示录到手动停止为止。缓冲大小的经验法则来自 trace_config_reference.md10–30 秒的追踪 32–64 MBsize_kb: 32768–65536足够注意所有缓冲单位是KB、时长单位是ms这是最常见的换算坑。RING_BUFFER保留最新数据“关键时刻在结尾”时用DISCARD保留最早数据。第四步分析输出文件就是普通 Perfetto 追踪两条分析路径打开 Perfetto UI把trace.perfetto-trace上传到 ui.perfetto.dev 交互式查看时间线本机查询用trace_processor直接在录制机上跑 PerfettoSQL。针对机器可读、可重复的查询推荐“一次加载、多次查询”的会话模式详见 querying.mdtrace_processor server unix --name mysession --daemonize trace.perfetto-trace trace_processor query --remote mysession SELECT ts, dur, name FROM slice WHERE dur 5e8 LIMIT 5 trace_processor server kill mysession对 Linux 追踪最常用的几类表thread_state每线程 Running/Runnable/Sleeping、sched每 CPU 的 on-CPU 区间、slice一切有时长的对象、counterlinux.sys_stats轮询出来的内存/CPU 计数器、thread/process名字映射。连接键用utid/upid而不是会被系统回收的tid/pid。如果录制的是linux.perf调用栈Linux 上还有一个与 Android 流程不同的收尾步骤用户态符号需要后处理。因为linux.perf记录的是原始指令地址而内核帧在录制时已由 kallsyms 就地解析。linux-cookbook.md 给出的做法是用trace_processor bundle把符号“烤”进 trace前提是目标二进制带调试信息且 Build ID 匹配或使用trace_processor convert profile导出聚合的 pprof 格式该文档中的“CPU profiling with full symbols”“Kernel function graph tracing”symbolize_ksyms: true是 function graph 录制里最常被漏掉的一项等完整配方都可以作为本文配置写法的延伸参考。常见问题速查缓冲/时长单位混淆size_kb是 KBduration_ms是毫秒配置解析错误字段名拼写在录制时才暴露报错会指明坏字段属于预期行为而非 bugaTrace 事件在 Linux 上看不到atrace 类别与 app 事件只流经 Android 上的linux.ftraceLinux 上应使用原生 ftrace 事件sched/*、power/*、kmem/*等调度事件里只有数字 ID补上linux.process_stats数据源并开启scan_all_processes_on_start: truetrace 太大/太短调整size_kb与duration_ms长时追踪加write_into_file: true与file_write_period_ms想确认 tracebox 版本/校验仓库内 tools/tracebox 的 manifest 记录了各架构产物的 SHA-256 与版本号可作比对依据。参考核心指南ai/skills/perfetto/infra-references/recording_linux_traces.md配置形态与数据源速查ai/skills/perfetto/infra-references/trace_config_reference.md示例配置ai/skills/perfetto/infra-references/example-configs/查询手册ai/skills/perfetto/infra-references/querying.mdLinux 端到端配方含符号化docs/getting-started/linux-cookbook.mdtracebox 预编译分发清单tools/traceboxTraceConfig schemaprotos/perfetto/config/trace_config.proto【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表