我孤身走在路上, 石子在雾中发亮,夜很安静,荒原面对太空,星星互诉衷肠
系统性能分析神器perf
系统性能分析神器perf

系统性能分析神器perf

perf工具是Linux系统中的性能分析工具,全称为Performance Analysis Tool。它是Linux内核中的一部分,最早出现在Linux内核版本2.6.31中。perf工具由Linux社区开发,目的是为了提供一个强大的、统一的性能分析工具,利用Linux内核中的性能计数器子系统(Performance Counters for Linux,PCL)来监控和统计系统和应用程序的性能指标。

perf工具的主要应用场景包括:

  1. CPU性能分析:可以监控CPU使用率、分析CPU缓存命中率、指令分支预测等,帮助开发者优化程序性能。
  2. 内存性能分析:可以分析内存访问模式、内存访问延迟等,以便于发现内存瓶颈问题。
  3. 软件和硬件事件监控:可以跟踪各种软件事件(如系统调用、上下文切换)和硬件事件(如CPU周期、缓存命中和未命中)。
  4. 程序热点分析:可以定位程序中的性能热点,即程序运行中最消耗资源的部分。
  5. 动态追踪:可以动态地追踪内核或用户态程序的函数调用和事件,无需重新编译程序。
  6. 性能计数器管理:可以管理和配置处理器的性能计数器,进行更深入的性能分析。

perf工具的使用通常涉及以下几个基本命令:

  • perf stat:用于收集整体性能计数器数据。
  • perf top:提供一个实时的性能热点视图。
  • perf record:记录性能数据供之后分析。
  • perf report:分析perf record收集的性能数据。
  • perf list:列出可用的性能事件。

perf是一个功能强大的性能分析工具,它可以帮助开发者和系统管理员诊断性能问题,优化软件和系统的性能。

对CPU进行采样

对于CPU或进程的采样,可以使用perf record命令,然后通过perf report来解析采样数据。以下是一些示例:

  1. 对整个系统CPU进行采样:
perf record -a

这个命令会对所有CPU上的所有进程进行采样。-a参数表示监控所有CPU。

  1. 对特定的CPU进行采样:
perf record -a --cpu=1

这个命令只对编号为1的CPU进行采样。

  1. 对特定进程进行采样:
perf record -p 12345

这里12345是你想要采样的进程的PID。

  1. 对特定进程及其子进程进行采样:
perf record -g -p 12345

-g参数表示记录调用栈信息,这在分析程序的函数调用关系时非常有用。

采样完成后,可以使用perf report来查看采样结果:

perf report

这个命令会读取默认生成的perf.data文件,并显示一个交互式的文本用户界面,列出采样中消耗CPU最多的函数。用户可以通过这个界面来浏览和分析性能瓶颈。

如果你想要对采样结果进行更详细的分析,可以使用:

perf report -n --stdio

-n参数可以显示样本的数量,--stdio参数则将结果以标准输出的形式展示,而不是交互式界面。

以上命令都是在默认的采样频率下运行的,你也可以通过-F选项指定采样频率(单位是Hz):

perf record -F 99 -a

这个命令将以每秒99次的频率对所有CPU进行采样。调整采样频率可以帮助你在减少数据量和保持足够采样精度之间找到平衡。

perf stat命令是用来收集和显示一段时间内的性能计数器事件的统计信息。这个命令对于快速评估程序或系统的整体性能特征非常有用。

以下是一个perf stat命令的使用实例,它将运行一个程序并报告该程序执行期间的一些关键硬件事件的统计数据:

perf stat -B ls

在这个例子中,-B选项是用来开启详细模式,ls是要执行并收集性能数据的命令。这条命令会执行ls(列出当前目录下的文件和目录),同时收集和显示与之相关的性能数据。

perf stat默认会显示一些基本的性能事件,如CPU周期数、指令数和缓存引用等。如果你想要收集特定的性能事件,可以使用-e选项来指定。例如:

perf stat -e cache-misses,cache-references,instructions,cycles ./your_program

这个命令会在运行./your_program的同时,收集缓存未命中数、缓存引用数、指令数和CPU周期数。

perf stat还可以用于监控特定的CPU或者进程。例如,监控特定CPU上的事件:

perf stat -a --cpu=0 -e cycles,instructions ls

这里-a表示监控所有进程,--cpu=0表示只监控0号CPU。

又比如,监控特定进程ID(比如1234)的性能事件:

perf stat -p 1234 -e cycles,instructions

这里-p 1234表示监控进程ID为1234的进程。

perf stat可以帮助你快速了解程序在运行时的性能特征,从而为性能优化提供线索。

通常如果内容很多,我们需要更仔细的分析的话可以将结果转换成火焰图,步骤如下:

生成火焰图通常需要几个步骤:首先使用perf record来收集性能数据,然后用perf script处理这些数据,并最后用火焰图生成工具来生成火焰图。火焰图是一种可视化的堆栈跟踪,它可以帮助你直观地理解程序运行时的时间都花费在哪些函数上。

以下是生成火焰图的一般步骤:

  1. 收集性能数据 使用perf record来收集程序的性能数据。为了生成火焰图,通常需要记录调用栈信息:
   perf record -g -F 99 ./your_program

这里-g表示记录调用栈信息,-F 99表示采样频率为每秒99次,./your_program是你要分析的程序。

  1. 生成堆栈跟踪 使用perf script来导出收集到的性能数据,并为火焰图生成做准备:
   perf script > out.perf

这会将perf record收集到的数据转储到out.perf文件中。

  1. 生成火焰图 火焰图的生成需要使用专门的工具。一个常用的工具是Brendan Gregg的FlameGraph工具集。你需要从GitHub上克隆这个工具集,并使用它来生成火焰图:
   git clone https://github.com/brendangregg/FlameGraph
   cd FlameGraph
   ./stackcollapse-perf.pl < ../out.perf > out.folded
   ./flamegraph.pl out.folded > flamegraph.svg

这些命令做了以下几件事:

  • 从GitHub克隆FlameGraph工具集。
  • 使用stackcollapse-perf.pl脚本来处理perf script输出的数据。
  • 使用flamegraph.pl脚本来生成火焰图,输出为SVG格式。
  1. 查看火焰图 最后,我们可以使用任何支持SVG格式的浏览器或图片查看器来查看生成的flamegraph.svg文件。

这里要注意的是以上步骤中的FlameGraph工具集需要Perl环境来运行。如果你的系统中没有安装Perl,你需要先安装Perl环境。

生成火焰图是一个复杂的过程,需要对性能分析有一定的理解。火焰图提供了一个非常直观的方式来查看程序中哪些函数占用了大部分时间,从而帮助我们识别程序的性能瓶颈。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

31 − = 23