综述
本文是对程序动态工具的调研,通对各种动态分析工具的***原理***、功能、***优缺点***等方面的调研分析来使读者在使用工具时更有针对性。
作为调研,本文并不过多的涉及工具的细节,主要关注点在于工的原理、功能、优缺点(使用领域)。具体工具可做具体了解。
Gprof
简介
Gprof 是GNU gnu binutils工具之一,默认情况下linux系统当中都带有这个工具。Gprof给出了函数调用的次数、调用耗时以及函数的调用关系,通过分析产生的数据结果可以确定程序的执行流程,进而有针对性的对程序进行优化。
功能
可以获得的几种格式的数据:1
- flat profile :给出了每个函数的耗时以及函数被调用的次数。
- call graph:给出了函数调用关系,以及对函数耗时的一个估计。
- 注释的源代码--是程序源代码的一个复本,标记有程序中每行代码的执行次数。
原理
实现原理2
gcc -pg 在应用程序的每个函数中添加了名为 mcount/mcount/_mcount的函数。 应用程序每个函数执行时都会执mcount,而mcount则会在内存中保存一张函数调用图,通过函数调用堆栈的形式,查找子函数、父函数的地址,也保存了与函数相关的调用时间、次数等信息。
程序运行结束后,会在程序退出的路径下生成一个 gmon.out文件。这个文件就是记录并保存下来的监控数据。可以通过命令行方式的gprof或图形化的Kprof来解读这些数据并对程序的性能进行分析。
另外,如果想查看库函数的profiling,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a 库,才可以产生库函数的profiling信息。如果想执行一行一行的profiling,还需要加入“-g”编译参数。
结果产生与分析
图1 Gprof结果信息 3
用法
- 在编译和链接时 加上-pg选项。一般我们可以加在 makefile 中。
- 执行编译的二进制程序。执行参数和方式同以前。
- 在程序运行目录下 生成 gmon.out 文件。如果原来有gmon.out 文件,将会被重写。
- 结束进程。这时 gmon.out 会再次被刷新。
- 用 gprof 工具分析 gmon.out 文件。
优缺点4
###优点
- Gprof为GNU binutils工具之一,默认情况下linux系统当中都带有这个工具,使用方便。
- 生成结果包括函数调用时间以及函数调用关系,可以方便用户利用该数据做进一步分析 。
缺点
- 使用插桩技术,消耗系统资源。函数的每次执行都会调用插桩函数mcount,并且mcount函数会在内存中维护一个函数调用图,使得对CPU和内存资源都带来消耗。
- 程序必须是正常退出才能生成gmon.out文件,也就是说程序必须执行到main函数的return或者exit()。
- 如果程序运行的时间非常短,则Gprof可能无效,因为受到启动、初始化、退出等函数运行时间的影响。
- 不支持多进程,如果分析多进程程序则可能一个进程的gmont.out文件会覆盖另一个进程的gmont.out文件。 解决方法是在执行程序之前执行:export GMON_OUT_PREFIX=x.out 则之后生成的文件名就如x.out.pid,多进程的gmon.out就不会相互覆盖。
- 不支持多线程。缘故是gprof使用ITIMER_PROF定时器, 当超时时由内核向应用程序发送信号。但多线程程序只有主线程接收ITIMER_PROF。 这里有一个简单的实现方法: 对pthread_create进行包装,并以动态库的形式在程序运行前加载。
- 只能分析应用程序在运行过程中所消耗掉的用户时间,无法得到程序内核空间的运行时间。
Ftrace
简介56
ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析。最早 ftrace 是一个 function tracer,仅能够记录内核的函数调用流程。如今 ftrace 已经成为一个framework,采用 plugin (以下一般称为tracer)的方式支持开发人员添加更多种类的 trace 功能。
ftrace一个鲜明的特点就是,对所有的操作都是对文件的操作,比如,使用某一个tracer便将相应的函数名写入current_tracer文件中,# echo function tracer > current_tracer
.
功能
ftrace作为一个平台,采用插件的方式支持开发人员添加自定义的trace功能,简而言之,开发人员可以根据自己的需求来使用已有功能或者根据ftrace提供的API来开发满足自己需求的插件。ftrace自带插件如下表6
插件 | 功能描述 |
---|---|
function tracer | 仅能够记录内核的函数调用流程 |
Schedule switch tracer | 跟踪进程调度情况 |
Wakeup tracer | 跟踪进程的调度延迟,即高优先级进程从进入 ready 状态到获得 CPU 的延迟时间。该 tracer 只针对实时进程。 |
Irqsoff tracer | 当中断被禁止时,系统无法相应外部事件,比如键盘和鼠标,时钟也无法产生 tick 中断。这意味着系统响应延迟,irqsoff 这个 tracer 能够跟踪并记录内核中哪些函数禁止了中断,对于其中中断禁止时间最长的,irqsoff 将在 log 文件的第一行标示出来,从而使开发人员可以迅速定位造成响应延迟的罪魁祸首。 |
Preemptoff tracer | 和前一个 tracer 类似,preemptoff tracer 跟踪并记录禁止内核抢占的函数,并清晰地显示出禁止抢占时间最长的内核函数。 |
Preemptirqsoff tr |