Rustprofile:面向 Linux 的持续 CPU、off-CPU 与采样堆分析器

💡 原文中文,约5300字,阅读约需13分钟。
📝

内容提要

rustprofile 是面向 Linux 的 CPU、off-CPU 与堆分析器,支持 native 进程、Docker 和 Kubernetes。它输出 pprof、Firefox profile 和诊断 JSON,可选 SVG 火焰图及 OTLP。支持按线程采样、窗口切分、导入 perf.data 和符号服务。需 root 运行,Linux 5.4+,构建需 Rust 1.88+。部署需特权权限,限制包括压缩输入 512 MiB 等。

🔎

延伸解读

部署权限与安全边界

该工具要求 root 或特权模式运行,Docker 场景需 host PID namespace、Docker socket 和 --privileged,Kubernetes 则需 hostPID 与 privileged security context。这些权限接近节点级管理权限,使用时需评估安全风险,避免在不可信环境中暴露。serve 默认仅绑定 loopback,非 loopback 必须设置 --bearer-token,且 CORS 默认关闭,这些设计有助于降低远程访问风险。

内核版本与功能降级

CPU profiling 要求 Linux 5.4+,heap profiling 要求 5.12+。在 5.4-5.11 内核上,若请求包含 heap,只有通过 --allow-partial 降级为仅 CPU 才能继续。此外,5.8+ 优先使用 lifecycle eBPF 事件,而 5.4-5.7 会回退到每秒 procfs 对账,并在 diagnostics 中记录 warning。用户需根据目标内核版本调整参数,避免功能不可用或数据不完整。

输出限制与数据完整性

工具对输入和输出设有明确上限:压缩输入 512 MiB、解压后 profile 128 MiB、diagnostics 超过 1 MiB 会被忽略,viewer 的 samples/stacks 上限 65,536、functions 上限 262,144、threads 上限 4,096。当输出反压时,会暂时舍弃 SVG、Firefox profile 和未提交的 OTLP 导出,但 CPU/off-CPU/heap pprof 和 diagnostics 仍会写出,保证权威数据不丢失。用户需注意这些限制,避免因

Q&A

rustprofile 是什么工具?它主要支持哪些场景?

rustprofile 是面向 Linux 的持续 CPU、off-CPU 与采样堆分析器,支持 native 进程、Docker 容器和 Kubernetes 应用容器。

rustprofile 可以输出哪些格式的分析结果?

rustprofile 输出 gzip 压缩的 pprof profile、Firefox processed profile 和诊断 JSON,并可选导出静态 SVG 火焰图和 OTLP Profiles。

如何对 Docker 容器进行 CPU 分析?

使用 --docker-container 参数指定容器 ID 或名称,例如:sudo target/release/rustprofile record --docker-container my-api --duration 10m --window 60s --output ./profiles。

rustprofile 对 Linux 内核版本有什么要求?

CPU profiling 需要 Linux 5.4 或更新版本;heap profiling 需要 Linux 5.12 或更新版本。Linux 5.4-5.11 应使用 --profiles cpu,包含 heap 的请求只有在 --allow-partial 能保留另一种 profile 时才会降级继续。

rustprofile 的 launch 命令与 record 命令有何不同?

launch 会先暂停新命令再挂载采集器,并在 cgroup v2 上跟踪启动命令的 CPU/off-CPU 子进程;heap 仍只跟踪 init/root 进程。record 用于附加到已有进程或容器。

rustprofile 在输出反压时如何处理?

当输出发生反压时,output worker 只会为仍在写出的后续窗口暂时舍弃派生输出(如 SVG、Firefox profile 和未提交的 OTLP 导出),但 CPU/off-CPU/heap pprof 和 diagnostics 仍会写出。本窗口的 output_backpressure 会记录是否 shed、pending window 数等信息。

rustprofile 的 serve 命令有哪些限制?

serve 必须在 --profile PATH 与 --directory DIR 中二选一;默认只绑定 loopback,非 loopback 必须设置 --bearer-token;CORS 默认关闭;压缩输入上限 512 MiB,解压后 profile 上限 128 MiB;viewer 的 samples/stacks 上限 65,536,functions 上限 262,144,threads 上限 4,096;POST 请求体限制 8 MiB,响应限制 32 MiB。

rustprofile 如何导入已有的 perf.data 文件?

使用 import 命令,例如:target/release/rustprofile import --input perf.data --format auto --window 60s --firefox-profile jslb --output ./imported。import 读取 perf.data/simpleperf 的 IP/callchain,不附着 probe,也不做实时 DWARF unwind。

🏷️

标签

➡️

继续阅读