OProfile尝。。鲜??

最近使用了一个叫OProfile的用于程序性能测试的开源项目,在这里记录一下使用感受和心得。 什么是OProfile? OProfile诞生于2002年,已经有着18年的历史了。该项目主要用于Linux系统的性能剖析,采用记录CPU事件(events)的方式,最终给使用者提供程序或系统的性能统计数据。 下载安装 OProfile可以从这个网站下载,小编用的是写这篇时最新的1.4.0版本。下载完成后用如下简单命令编译安装: 编译前记得先装好libpopt和binutils的开发包(Debian系对应的是libpopt-dev和binutils-dev)。如果不想折腾源码,Debian系的系统也可以直接sudo apt install oprofile,只是版本会旧一些。 因为主要用于监测Linux系统性能,所以当然只能在Linux上编译啦。 小编测试环境使用的是当下流行的树莓派3B+,编译器使用的是GCC 10。 使用 老版本的OProfile用的是opcontrol加内核模块那一套,1.0之后已经彻底废弃了。现在的主力是三个命令:operf(采样)、opreport(看报告)和opannotate(标注到源码)。它们底层用的是内核的perf_events接口,不需要额外加载内核模块,普通用户就能剖析自己的程序。 准备一个“有问题”的程序 为了试用,我们先写一个自带热点的小程序——经典的朴素矩阵乘法(matmul.c): 编译时记得带上-g,这样后面才能把采样对应回源码;优化照常开-O2,毕竟我们要剖析的是“真实”的程序: 用operf采样 就这么简单,不需要任何参数。采样数据会写进当前目录下的oprofile_data/里,opreport等工具默认也从这里读取。默认采样的事件是CPU_CYCLES,也就是“这段时间CPU的周期都花在哪了”。 用opreport看报告 先看整体情况(以下输出为摘录,具体数字在不同环境下会不一样,下同): 再用-l细化到函数级别: 99.6%的周期都花在mat_mul里——热点一目了然。 用opannotate对应到源码 可以看到绝大部分采样都落在最内层那一行乘加上。这一步能工作的前提,就是前面编译时带上的那个-g。…