tprof 命令
tprof [ -c ] [ -C { all | CPUList } ] [ -d ] -D ] [ -e ] [ -F ] [ -j ] [ -k ] [ -l ] [ -m ObjectsList ] [ -M SourcePathList ] [ -p ProcessList ] [ -P { all | PIDsList } ] [ -s ] [ -S SearchPathList ] [ -t ] [ -T BufferSize ] [ -u ] [ -v ] [ -V VerboseFileName ] [ -z ] { { -r RootString } | { [ -A { all | CPUList }] [ -r RootString ] -x Program } }
- 除路径列表外,所有的列表类型输入用逗号分隔,路径列表用冒号分隔。
- 当此命令以实时方式运行时,每个 CPU 的概要分析方式自动禁用。
- 如果每个 CPU 概要分析被打开,则其微概要分析自动禁用。
- 如果指定 -x 标志不带 -A 标志,则 tprof 以实时方式运行。
- 如果指定 -x 标志带 -A 标志,则 tprof 以自动离线方式运行。
- 如果 -x 标志省略,则 tprof 以后处理方式或人工离线方式运行,这取决于有无 cooked 文件和 -F 标志。
tprof 命令报告单个程序和整个系统的 CPU 使用情况。对任何使用可能是 CPU 受限的 JAVA、C、C++ 或 FORTRAN 程序的人,和想了解程序的哪些部分大量占用 CPU 的人,该命令是一个有用的工具。
tprof 命令负责分配对象代码、进程、线程、子例程(用户方式、内核方式以及共享库),甚至是程序的源代码行或单个指令使用 CPU 的时间。给子例程分配使用 CPU 时间被称为概要分析,而给源程序代码行分配使用 CPU 时间被称为微概要分析。
对于子例程级概要分析,不用修改可执行程序即可运行 tprof 命令,就是说不必使用专用编译器标志进行重新编译。除非已除去回退表,否则即使可执行程序已卸载也还是如此运行。但是,必需进行重新编译才能获取微概要分析文件,除非列表文件已经可用。要在一个程序上执行微概要分析,要么用 -g 来编译该程序且源文件应可访问 tprof,要么用 -qlist 来编译该程序,且对象列表文件和源文件或者只有对象列表文件对于 tprof 应该是可访问的。要充分利用 tprof 微概要分析能力,最好既提供 .lst 列表文件又提供源文件。
tprof 可用以下四种方式运行:
- 实时或在线方式
- 人工离线方式
- 自动离线方式
- 后处理方式
如果指定 -x 标志但未指定 -A 标志,则 tprof 以实时方式运行。在实时方式下,tprof 在后台启动 AIX trace 实用程序并处理所产生的跟踪数据。当被概要分析的程序结束时,tprof 收集符号名称信息并生成报告。
此方式不允许对每个 CPU 进行概要分析。
如果指定 -A 标志带 -x 标志,则 tprof 以自动离线方式运行。在此方式下,tprof 启动 AIX trace 实用程序,并将跟踪数据记录在一个文件中。一旦跟踪数据收集完成,就收集符号名信息,tprof 打开跟踪日志文件并处理数据以生成报告。在此方式下,除了tprof 报告文件,tprof 生成以下文件:
- RootString.syms
- RootString.trc[-cpuid]
tprof 使用的所有输入文件和报告文件都被命名为 RootString.suffix,其中 RootString 要么用 -r 指定,要么是用 -x 指定的程序名。
任何时候 tprof 命令都可重新处理这些文件来生成概要分析报告。这被称为人工离线方式。RootString.syms 文件包含符号名称信息,与 gensyms 命令的输出相似。 RootString.trc [-cpuid] 文件是跟踪日志文件。当每个 CPU 跟踪功能打开时,-cpuid 被添加到名称上。在此情况下,每个文件仅包含来自一个 CPU 的跟踪数据。
如果 -c 和 -A 一起使用,则不生成这两个文件。而是创建了以下两个文件:
- RootString.csyms
- RootString.ctrc[ -cpuid ]
这些文件是 cooked,即它们是正常跟踪和名称文件的一个预处理版本。tprof 后处理 cooked 文件更快。
如果 -A 标志和 -x 标志都未指定,则 tprof 要么以人工离线方式运行,要么以后处理方式运行。要 tprof以后处理方式运行,以下文件必须可用:
- RootString.csyms
- RootString.ctrc[ -cpuid ]
当 tprof 带 -c 标志(以除了后处理方式以外的任何方式)运行时,就生成了这些文件。要tprof 以人工离线方式运行,以下文件必须可用:
- RootString.syms
- RootString.trc [-cpuid]
通过用户人工使用 gensyms 命令和 AIX 跟踪工具,或者通过不带 -c 标志以自动离线方式运行 tprof 来生成这些文件。
tprof 总是首先查找 RootString.csyms 和 RootString.ctrc[-cpuid]。仅当这些文件不可用时,才查找 RootString.syms 和 RootString.trc[-cpuid]。要阻止 tprof 查找 rootstring.csyms 和 RootString.ctrc[-cpuid],也就是说,强制使用人工离线方式,请使用 -F 标志。
tprof 生成一个名为 RootString.prof 的报告文件,该文件可以是进程、线程、对象代码和子例程级概要分析报告。该文件可包含以下部分和子节:
- 摘要报告部分
- 按进程名的 CPU 使用情况摘要
- 按线程(tid)的 CPU 使用情况摘要
- 全局(关于系统中所有进程的执行情况)概要文件部分
- 用户方式例程的 CPU 使用情况
- 内核例程的 CPU 使用情况
- 内核扩展的 CPU 使用情况摘要
- 每个内核扩展的子例程的 CPU 使用情况。
- 共享库的 CPU 使用情况摘要
- 每个共享库的子例程的 CPU 使用情况。
- 每个 JAVA 类的 CPU 使用情况。
- 每个 JAVA 类的每个 JAVA 方法的 CPU 使用情况。
- 进程和线程级概要分析部分(每个进程或线程为一个部分)
- 适用于本进程/线程的用户方式例程的 CPU 使用情况
- 适用于本进程/线程的内核例程的 CPU 使用情况
- 适用于本进程/线程的内核扩展的 CPU 使用情况摘要。
- 适用于本进程/线程的每个内核扩展的子例程的 CPU 使用情况。
- 适用于本进程/线程的共享库的 CPU 使用情况摘要。
- 适用于本进程/线程的每个共享库的子例程的 CPU 使用情况。
- 适用于本进程/线程的每个 JAVA 类的 CPU 使用情况。
- 适用于本进程/线程的每个 JAVA 类的 JAVA 方法的 CPU 使用情况。
摘要报告部分总是在 RootString.prof 报告文件中。基于概要分析标志,全局概要分析部分的各个子节可被打开和关闭:
- -u 打开子节 a
- -k 打开子节 b
- -e 打开子节 c 和 d
- -s 打开子节 e 和 f
- -j 打开子节 g 和 h
进程和线程级概要分析部分是为用 -p、-P 和 -t 标志选择的进程和线程创建的。存在于每个进程的每个线程的每个部分中的子节等同于存在于全局部分中的子节,使用概要分析标志(-u、-s、-k、-e、-j)来选择这些子节。
当用 -C 标志调用时,tprof 也有选择地生成每个 CPU 的概要分析报告(每个 CPU 生成一个概要分析报告)。生成的 tprof 报告有相同的结构,用约定的规则给它命名:RootString.prof[-cpuid]。
如果指定 -m,则 tprof 生成微概要分析报告。报告使用以下命名约定:RootString.source.mprof,其中 source 是源文件的基本名。如果有多个源文件有相同的基本名,则一个唯一标识它们的号码附加在报告文件名后面,例如,RootString.Filename.c.mprof-1。微概要分析报告含如下信息:
- 作过注释的源文件的全路径名。
- 与概要文件样本符合的、含有源文件的所有行号的热行概要文件部分,它按 CPU 的使用情况进行排序。对于每个源行,用一行来报告所有进程所用时间的百分比,其后跟有按单个进程细分的其它行。
- 一个该源文件中每个功能的源行概要分析部分,包括 CPU 使用情况。该部分包含源行号、CPU 的使用情况和源代码。如果该源文件的 .lst 文件可访问 tprof,则将来自 .lst 文件的指令行和来自源文件的源行集结在一起并适当分配 CPU 的使用。对于每个源文件,这将由指令提供中断。
如果一个源文件不存在,但有一个 .lst 文件存在,tprof 仅显示基于源文件行和来自 .lst 文件的指令的 CPU 使用情况。
如果这些文件都不存在,但源文件用 -g 编译过,则 tprof 可检索源文件行号,并生成一个相似的报告,但源文件代码列丢失。
如果请求每个 CPU 进行概要分析,则微概要分析自动禁用。如果 .c 文件包含在另一个.c 文件中,则 tprof 不能报告正确的源文件行信息。tprof 不能对 JAVA 类或方法进行微概要分析。
以下限制适用于运行 tprof 命令的非 root 用户:
- Tprof 将不能验证正在运行的内核与 /unix 文件相同。这就意味着即使显示警告消息,在多数情况下,正在运行的内核与 /unix 也是相同的,因此数据应该准确。
- 当由非 root 用户运行 gennames 时,给出与限制 #1(以上所述)相同的警告,并标记 gennames 文件。如果在脱机方式下运行 tprof,则 gennames 文件将 tprof 标记为未验证内核。
- tprof 将不能打开并读没有设置读许可权的文件上的符号。一些专用、共享库不具有读许可权,而一些内核扩展不可读。
解析 CPU 活动的程度取决于获得的样本数目以及热点的程度。当一个带有几个热点的程序可用相对较少的样本进行概要分析时,程序的较少执行的部分在概要分析报告中不可见,除非获得更多的样本。在用户程序运行少于一分钟的情况下,要在评估中获得高可信度的分辨率可能不够。
一个简单的方案是重复执行用户程序或脚本直到达到所需的分辨率。程序运行时间越长,概要分析分辨率就越高。如果你怀疑概要分析的准确度,运行 tprof 命令几次即可,然后比较所产生的概要分析文件。
在这三个命令之间最重要区别是 tprof 收集数据而不会影响被概要分析的程序的执行时间,而且除了生成微概要分析报告以外,无需重新编译就可以处理已实现优化和分解的二进制文件。 gprof 和 prof 都没有微概要分析的能力,也不能处理已进行优化或分解的二进制文件(它们需要专门编译标志),而且重要的是在执行期间会产生程序执行降速。
prof 和 gprof 工具都是标准的,是许多 UNIX 系统(包括此操作系统)上受支持的概要分析工具。prof 和 gprof 提供了子程序概要分析功能,以及每个子程序被调用的次数的精确计数。gprof 命令也提供了一个非常有用的调用图,显示每个子程序被特定父程序调用的次数和每个子程序调用其子的次数。tprof 命令既不提供子程序调用计数,也不提供调用图信息。
像 tprof 命令一样,prof 和 gprof 命令都通过采样用户程序的程序计数器来获取每个子程序的 CPU 消耗量估计。
tprof 收集整个系统的 CPU 的使用信息,而 prof 和 gprof 仅收集单个程序和仅在用户方式下所花时间的概要分析信息。tprof 也提供已概要分析的用户程序执行期间所有活动进程的摘要以及完全支持库和内核方式概要分析的摘要。
tprof 支持 JAVA 应用程序的概要分析,而 prof 和 gprof 不支持。
- 基本全局程序和线程级摘要
<!--[if !supportLists]-->2. <!--[endif]-->$ tprof -x sleep 10
<!--[if !supportLists]-->3. <!--[endif]-->2002 年 3月 20 日 星期一 00:39:26 系统:AIX 5.2 节点:dreaming 机器:000671894C00
<!--[if !supportLists]-->4. <!--[endif]-->启动命令 sleep 10
<!--[if !supportLists]-->5. <!--[endif]-->停止跟踪收集。
<!--[if !supportLists]-->6. <!--[endif]-->生成 sleep.prof
产生的 sleep.prof 文件仅包含摘要报告部分。
- 带有所有选项的全局概要分析
<!--[if !supportLists]-->8. <!--[endif]-->$ tprof -skeuj -x sleep 10
<!--[if !supportLists]-->9. <!--[endif]-->2002 年 3月 20 日 星期一 00:39:26 系统:AIX 5.2 节点:dreaing 机器:000671894C00
<!--[if !supportLists]-->10. <!--[endif]-->启动命令 sleep 10
<!--[if !supportLists]-->11. <!--[endif]-->停止跟踪收集。
<!--[if !supportLists]-->12. <!--[endif]-->生成 sleep.prof
产生的 sleep.prof 文件包含摘要报告部分和全局概要分析部分。
- 单个进程级概要分析
<!--[if !supportLists]-->14. <!--[endif]-->$ tprof -u -p workload -x workload
<!--[if !supportLists]-->15. <!--[endif]-->2002 年 3月 20 日 星期一 00:39:26 系统:AIX 5.2 节点:dreaing 机器:000671894C00
<!--[if !supportLists]-->16. <!--[endif]-->启动命令 workload,停止跟踪收集。
<!--[if !supportLists]-->17. <!--[endif]-->生成 workload.prof
产生的 workload.prof 文件包含摘要报告和全局用户方式概要分析部分,以及仅包含一个用户方式概要分析子节的进程‘workload’的一个进程级概要分析部分。
- 多个进程级概要分析
<!--[if !supportLists]-->19. <!--[endif]-->$ tprof -se -p send,receive -x startall
<!--[if !supportLists]-->20. <!--[endif]-->2002 年 3月 20 日 星期一 00:39:26 系统:AIX 5.2 节点:dreaming 机器:000671894C00
<!--[if !supportLists]-->21. <!--[endif]-->启动命令 startall
<!--[if !supportLists]-->22. <!--[endif]-->停止跟踪收集。
<!--[if !supportLists]-->23. <!--[endif]-->生成 startall.prof
产生的 startall.prof 文件包含摘要报告、全局共享库方式概要分析、全局内核扩展例程概要分析部分以及两个进程级概要分析部分:一个为进程‘send’,一个为进程‘receive’。每个进程级部分包含两个子节:一个为共享库概要分析信息,一个为内核扩展概要分析信息。
- 微概要分析
<!--[if !supportLists]-->25. <!--[endif]-->$ tprof -m ./tcalc -u -x ./tcalc
<!--[if !supportLists]-->26. <!--[endif]-->2002 年 3月 20 日 星期一 00:47:09 系统:AIX 5.2 节点:dreaming 机器:000671894C00
<!--[if !supportLists]-->27. <!--[endif]-->启动命令 ./tcalc
<!--[if !supportLists]-->28. <!--[endif]-->停止跟踪收集。
<!--[if !supportLists]-->29. <!--[endif]-->生成 tcalc.prof
<!--[if !supportLists]-->30. <!--[endif]-->生成 tcalc.tcalc.c.mprof
产生的 tcalc.prof 文件包含摘要报告和全局用户方式概要分析部分。产生的 tcalc.tcalc.c.mprof 文件包含微概要分析报告。
- 自动离线方式
<!--[if !supportLists]-->32. <!--[endif]-->tprof -c -A all -x sleep 10
<!--[if !supportLists]-->33. <!--[endif]-->启动命令 sleep 10
<!--[if !supportLists]-->34. <!--[endif]-->停止跟踪收集。
<!--[if !supportLists]-->35. <!--[endif]-->2002 年 3 月 20 日,星期一 00:52:52
<!--[if !supportLists]-->36. <!--[endif]-->系统:AIX 5.2 节点:dreaming 机器
====================================================================
tprof -x sleep 5
Process PID TID Total Kernel User Shared Other
======= === === ===== ====== ==== ====== =====
wait 8196 8197 40.36 40.36 0.00 0.00 0.00
wait 53274 61471 38.46 38.46 0.00 0.00 0.00
wait 49176 57373 4.62 4.62 0.00 0.00 0.00
wait 57372 69667 4.52 4.52 0.00 0.00 0.00
./xxxxx 209070 876621 2.62 1.45 0.63 0.54 0.00
./xxxxx 209070 1306857 2.35 0.45 1.09 0.81 0.00
./xxxxx 209070 1011735 1.90 0.36 1.09 0.45 0.00
./xxxxx 209070 1130543 1.90 0.54 0.90 0.45 0.00
./xxxxx 209070 1261733 1.54 0.18 1.09 0.27 0.00
./xxxxx 209070 1396843 0.72 0.54 0.00 0.18 0.00
dtgreet 110674 254095 0.72 0.45 0.00 0.27 0.00
/usr/bin/tprof 409664 872671 0.09 0.09 0.00 0.00 0.00
PID-1 -1 893131 0.09 0.00 0.00 0.09 0.00
/usr/bin/trcstop 430324 901143 0.09 0.00 0.00 0.09 0.00
======= === === ===== ====== ==== ====== =====
Total 100.00 92.04 4.80 3.17 0.00
命令执行之后,会产生一个sleep.prof的文件,上面就是截取的一段内容,可以根据./xxxx后面几列
的内容计算出5秒之内xxxxx进程占用的cpu时间,从而计算出比较精确的xxxx的即时的cpu占用率,
这里要说明的是ps -aux 出来的那个cpu占用率不是即时的。我只找出了这个方法使用程序来得到进程
的cpu占用率的即时值。topas的输出结果,java逮不到。