#cpu #profiler #sampling #linux #arm #unwinding #flame-graph

app nokia/nperf

Linux 的采样 CPU 性能分析器

2 个版本

0.1.1 2021 年 10 月 1 日
0.1.0 2021 年 7 月 28 日

#184性能分析

824 星 & 28 关注者

2KB
58

perf 类似的 Linux 采样 CPU 性能分析器

特性

  • 支持 AMD64、ARM、AArch64 和 MIPS64 架构(其中 MIPS64 需要内核的微补丁才能工作)
  • 支持离线和在线堆栈跟踪反汇编
  • 支持没有任何调试信息(没有 .debug_frame 部分)的二进制文件的性能分析
    • 使用基于 .eh_frame 的反汇编(这是正常 C++ 异常处理反汇编堆栈的方式)而不需要 .eh_frame_hdr(这取决于编译器,可能不会输出)
    • 使用基于 .ARM.exidx + .ARM.extab 的反汇编(这是 ARM 特定的,用于替代 .eh_frame
  • 支持跨架构数据分析
  • 完全架构无关的数据格式
  • 内置火焰图生成

为什么我应该使用这个而不是 perf

如果 perf 已经满足您的需求 - 那太好了!继续使用它。

这个项目源于原始 perf 的几个限制,使其在嵌入式环境中进行 CPU 性能分析不太理想。以下是一些限制:

  • 不支持 MIPS64,
  • 由于仅离线堆栈展开,生成的CPU分析数据量很大,所以如果您只有有限的存储空间,您可能需要以非常低的频率或非常短的时间进行性能分析;
  • 缺乏对跨架构分析的支持——如果您在ARM上运行 perf record,那么您还需要在ARM或QEMU下运行 perf report,并且在使用QEMU进行分析时(这取决于您如何编译二进制文件以及使用哪些标志启动 perf)可能需要数小时;
  • 对有限或没有调试信息的二进制文件的分析支持较差,这在大型嵌入式项目中很常见,在这些项目中,调试信息甚至无法适应目标机器,或者不可轻松获得。

构建

  1. 安装至少Rust 1.31

  2. 构建它

     $ cd cli
     $ cargo build --release
    
  3. target/release/ 获取二进制文件。

交叉编译

  1. 在您的 ~/.cargo/config 中配置目标架构的链接器,例如。
[target.mips64-unknown-linux-gnuabi64]
linker = "/path/to/your/sdk/mips64-octeon2-linux-gnu-gcc"
rustflags = [
  "-C", "link-arg=--sysroot=/path/to/your/sdk/sys-root/mips64-octeon2-linux-gnu"
]

[target.armv7-unknown-linux-gnueabihf]
linker = "/path/to/your/sdk/arm-cortexa15-linux-gnueabihf-gcc"
rustflags = [
  "-C", "link-arg=--sysroot=/path/to/your/sdk/sys-root/arm-cortexa15-linux-gnueabihf"
]
  1. 编译,无论是为ARM还是MIPS64

     $ cargo build --release --target=mips64-unknown-linux-gnuabi64
     $ cargo build --release --target=armv7-unknown-linux-gnueabihf
    
  2. target/mips64-unknown-linux-gnuabi64/target/armv7-unknown-linux-gnueabihf/ 获取二进制文件。

基本用法

通过PID分析已运行的进程

$ cargo run record -p $PID_OF_YOUR_PROCESS -o datafile

通过名称分析进程,如果尚未运行则等待

$ cargo run record -P cpu-hungry-program -w -o datafile

从收集的数据生成CPU火焰图

$ cargo run flamegraph datafile > flame.svg

如果您在构建目录外运行分析器,请将 cargo run 替换为可执行文件的路径。

许可证

根据您的选择,许可方式为以下之一

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交给作品中的任何贡献,都将根据上述方式双许可,不附加任何额外的条款或条件。

依赖关系

~5–14MB
~152K SLoC