网站首页 > 技术文章 正文
perf 是Linux的一款性能分析工具,能够进行函数级和指令级的热点查找,可以用来分析程序中热点函数的CPU占用率,从而定位性能瓶颈。
perf:Performance analysis tools for Linux.
系统性能优化通常可以分为两个阶段:性能分析和性能优化。
- 性能分析的目的是查找性能瓶颈、热点代码,分析引发性能问题的原因;
- 基于性能分析,可以进行性能优化,包括:算法优化(空间复杂度和时间复杂度的权衡)和代码优化(提高执行速度、减少内存占用)。
1、perf 的原理
Linux性能计数器是一个基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。
通过 perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。
Perf 可以对程序进行函数级别的采样,从而了解程序的性能瓶颈在哪里。其基本原理是:每隔一个固定时间,就是CPU上产生一个中断,看当前是哪个进程、哪个函数,然后给对应的进程和函数加一个统计值,这样就知道CPU有多少时间在某个进程或某个函数上了。
2、perf 的安装
在终端输入下面命令即可:
sudo apt install linux-tools-common linux-tools-generic linux-tools-`uname -r`
3、top 的使用
top 命令也是Linux下的性能分析工具,能够实时显示系统中各个进程的资源占用状况。
使用 perf 之前,可以先用 top 命令查看指定进程(xxx)的CPU占用率是否异常,命令如下:
top -p `ps aux | grep "xxx" | grep -v grep | cut -c 9-15` -d 1 -b
上面命令的含义是通过 top 查看指定进程(xxx)的整体运行情况,其中,
- top -p:指定进程
- top -d 1:指定屏幕刷新时间,1s刷新一次
- top -b:表示以批处理模式操作
- ps aux:列出所有进程
- grep:查找指定进程
- grep -v:反向查找
- cut -c 9-15:选择每行指定列的字符
4、perf 的使用
使用 perf 进行性能分析,主要使用下面两个命令:
- perf record:保存perf追踪的内容,文件名为perf.data
- perf report:解析perf.data的内容
比如要分析进程 xxx,启动该进程后,首先启动使用下面命令:
sudo perf record -a --call-graph dwarf -p `ps aux | grep "xxx" | grep -v grep | cut -c 9-15`
其中,
- -a:表示对所有CPU采样
- --call-graph dward:表示分析调用栈的关系
- -p:表示分析指定的进程
通过 Ctrl + C 结束后,会生成 perf.data 文件,然后通过 report 导出报告,即可以查看 main 函数和子函数的CPU平均占用率。
sudo perf report -i perf.data > perf.txt
5、perf 使用示例
比如,有下面一段代码。
#include <iostream>
#include <cmath>
using namespace std;
void for_loop()
{
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 10000; j++) {
int x = sin(i) + cos(j);
}
}
}
void loop_small()
{
for (int i = 0; i < 10; i++) {
for_loop();
}
}
void loop_big()
{
for (int i = 0; i < 100; i++) {
for_loop();
}
}
int main()
{
loop_big();
loop_small();
return 0;
}
其中,
- for_loop()是一个两层循环,每次都要计算正弦和余弦的和,这是一个比较耗时的函数;
- loop_small()把for_loop()循环10次;
- loop_big()把for_loop()循环100次。
可以明显看出 main() 函数中 loop_big() 函数会占大部分CPU,下面通过 perf 命令验证下。
1)假设指定可执行文件的名称为“perf_for”,
g++ perf_for.cpp -o perf_for
2)运行 perf_for 之后,启动 perf record:
sudo perf record -a --call-graph dwarf -p `ps aux | grep "perf_for" | grep -v grep | cut -c 9-15` -d 1 -b
3)结束后,通过 perf report 导出报告:
sudo perf report -i perf.data > perf.txt
如下图所示,可以看出main函数90%的CPU都花在 loop_big() 函数上。
优化时就可以考虑:
- 首先考虑优化 for_loop() 函数,主要是 sin 和 cos 的计算;
- 若 for_loop() 函数无法优化,就考虑优化 loop_big(),比如减少 for_loop() 函数的调用次数。
猜你喜欢
- 2024-11-11 光伏热水系统性能分析 光伏热水器怎么样
- 2024-11-11 国网考试《电力系统分析》这个知识点建议收藏
- 2024-11-11 Linux下系统 I/O 性能分析的套路 linux io_uring
- 2024-11-11 如何对Linux系统进行性能分析? linux性能调优有哪些
- 2024-11-11 架构师修炼之性能分析:Linux系统性能分析USE方法与工具
- 2024-11-11 性能分析工具——WindowsA 性能分析工具有哪些
- 2024-11-11 Linux系统性能分析命令 linux系统性能分析命令有哪些
- 2024-11-11 超细致的性能测试流程,你get了吗?
- 2024-11-11 RTC 性能自动化工具在内存优化场景下的实践
- 2024-11-11 电动机驱动系统性能分析与优化 驱动电机系统功能
你 发表评论:
欢迎- 11-13第一次养猫的人养什么品种比较合适?
- 11-13大学新生活不适应?送你舒心指南! 大学新生的不适应主要有哪些方面
- 11-13第一次倒班可能会让人感到有些不适应,以下是一些建议
- 11-13货物大小不同装柜算法有哪些?怎么算?区别有哪些?
- 11-13五大基本算法 五大基本算法是什么
- 11-13高级程序员必备:分治算法分享 分冶算法
- 11-13最快速的寻路算法 Jump Point Search
- 11-13手机实时人工智能之「三维动作识别」:每帧只需9ms
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)