《奔跑吧Linux内核(第2版)卷2:调试与案例分析》- 使用perf工具来进行性能分析
[复制链接]
本帖最后由 maskmoo 于 2024-4-13 21:04 编辑
Perf(Performance Counters for Linux)是一个在Linux系统上进行性能分析的工具,它利用了处理器的性能计数器和其他硬件特性来收集和分析系统和应用程序的性能数据。使用Perf可以了解程序的运行时间、CPU利用率、内存访问模式等信息,从而找出性能瓶颈并进行优化。
安装perf工具:通常,Perf工具包含在Linux内核中,但你可能需要安装额外的调试工具包才能使用完整功能。你可以通过以下命令来安装perf工具及其相关的调试工具
sudo apt update
sudo apt install linux-tools-common linux-tools-generic
验证安装:安装完成后,你可以通过运行以下命令来验证Perf是否正确安装:
perf --version
这将显示Perf工具的版本信息,确认安装成功。
使用Perf进行性能分析:一旦安装完成,你可以使用Perf对程序或系统进行性能分析。以下是一些常用的Perf命令示例:
- perf stat:用于显示程序运行时的统计信息,如CPU周期、缓存命中率等。
- perf record:用于记录程序执行过程中的性能数据。
- perf report:用于分析并生成性能数据的报告。
- perf top:类似于top命令,用于实时监视系统中消耗CPU资源最多的进程。
全部命令:
编写一个简单的测试程序
#include <stdio.h>
#include <stdlib.h>
void foo()
{
int i,j;
for(i=0; i< 10; i++)
j+=2;
}
int main(void)
{
int i;
for(i = 0; i< 100000000; i++)
foo();
return 0;
}
编译完成后通过perf统计运行时间:
perf stat ./test
增加sudo权限
通过record记录程序的性能数据,然后使用report来分析记录的数据
perf record ./test
perf report ./test
perf top查看系统相关资源消耗情况
采集 perf 数据生成火焰图
火焰图是一种用于可视化软件程序的性能数据的图形化工具,由性能专家Brendan Gregg开发。它以直观的方式展示了程序在执行过程中的函数调用关系和时间消耗,能够帮助开发人员快速定位性能瓶颈。
火焰图的基本原理是将程序的执行栈信息按照时间顺序进行堆叠,并通过不同颜色的矩形条来表示每个函数在整个执行过程中所占用的时间比例。这样就可以通过火焰图直观地看出哪些函数占用了大量的执行时间。
可以从GitHub上获取其源代码,并按照文档进行安装和使用:
git clone https://github.com/brendangregg/FlameGraph.git
实验平台的虚拟机里runninglinuxkernel 代码里已经提前下载好了这个项目代码,接下来结合Perf工具来收集程序的性能数据,并使用火焰图来可视化这些数据,具体步骤如下:
cd /home/rlk/rlk/runninglinuxkernel_5.0/kmodules/rlk_lab/rlk_basic/chapter_12_debug/l
ab12_flame_graph
- 编译 test 测试程序
- 运行 perf record 来收集数据 test 测试程序的数据,运行一段时间即可,然后按“ctrl+c”键终止收集数据
- 使用 perf script 命令对 perf 数据进行解析
- 将 perf.unfold 中的符号进行折叠
- 最后生成 svg 图
最终生成的火焰图:
|