#arm #cpu #profiler #sampling #stack #linux #debugging

nokia/nwind

Linux 的采样 CPU 性能分析器

2 个版本

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

#281性能分析

824 星 & 28 关注者

310KB
8K SLoC

Rust 7.5K SLoC // 0.0% comments GNU Style Assembly 839 SLoC // 0.0% comments C++ 15 SLoC Shell 12 SLoC // 0.1% comments

类似于 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许可证定义的,您提交的任何有意包含在作品中的贡献,都应作为上述双重许可,没有附加条款或条件。

依赖项

约6MB
约117K SLoC