Linux下代码性能分析手册
这个文档是 Linux 下代码性能分析手册,主要介绍一些常用的性能分析工具及其使用方法,并且给出实际的操作案例。
这个手册可以解决以下的几个问题:
1- 如何排查程序的性能瓶颈
2- 有哪些性能分析工具?适用于哪些场景
3- 举一个调优的实际案例
4- CPU利用率低的常见原因有哪些?
1. 性能分析工具
gprof
gprof 是 Linux 下一个开源的性能分析工具,它可以用来分析程序的性能瓶颈。
假设当前使用cmake来管理工程
cmake的时候添加编译选项,添加-pg,这样执行后会生成一个gmon.out文件,这个文件包含了程序的性能数据。
1 | cmake -DCMAKE_CXX_FLAGS="-pg" .. |
perf
perf 是linux下性能分析的工具,可以查看cpu的指令统计,内存访问统计,以及cpu的负载情况。
第一次执行可能会遇到以下的情况,不是错误,而是Linux的保护机制,需要手动允许
1 | (base) cty@chentaoyang:~/self_project/dvr_sdk/bin$ perf record -e task-clock:u ./fisheye_orthodontics |
因为Linux系统的perf_event_paranoid参数设置较高,限制了对性能监控和观测操作的访问。要解决这个问题,可以尝试降低perf_event_paranoid的值,以允许更多类型的性能监控。
可以按照以下步骤操作:
首先,可以以root权限临时降低perf_event_paranoid的值,例如将其设置为2(允许用户空间的性能监控,但不允许内核空间的性能监控):
1 | sudo sh -c 'echo 2 > /proc/sys/kernel/perf_event_paranoid' |
然后再次尝试运行perf record命令。
如果上述步骤能够解决问题,并且您希望更改永久生效,您可以将设置写入/etc/sysctl.conf文件中。打开该文件:
sudo nano /etc/sysctl.conf
在文件中添加一行:
kernel.perf_event_paranoid = 2
保存并关闭文件,然后运行:
sudo sysctl -p
这将使更改生效。
请注意,降低perf_event_paranoid的值可能会带来安全风险,因为它允许普通用户进行性能监控,因此在进行此更改时请确保您的系统安全。
当然在这里我没有直接运行,而是临时降低了这个值
执行:
1 | perf record -e task-clock:u ./fisheye_orthodontics |
valgrind
valgrind 是 Linux 下一个开源的内存检查工具,可以用来检测程序的内存泄漏、内存访问越界等问题。
这个工具非常强大,并且可以结合可视化工具来进行分析
安装:
1 | sudo apt install valgrind |
valgrind是命令行的工具,kcachegrind是图形化的可视化工具,先执行上述的安装命令
使用:
首先使用valgrind命令来运行程序,然后使用kcachegrind命令来查看结果
1 | valgrind --tool=callgrind ./可执行程序 |
此时就会打开可视化界面,可以看到程序的性能数据,包括函数调用次数、函数调用时间、内存分配次数、内存分配大小等。
2. 系统分析工具
我写了一些脚本,提供了基本的系统性能查看指标
简单查看:
1 |
|
综合分析:
1 |
|
GPU:
1 |
|