OProfile 守护进程 oprofiled 定期收集样品,并把它们写入 /var/lib/oprofile/samples/ 目录。在读取数据之前,请以根用户身份执行以下命令来确定所有数据都被写入这个目录中了:
opcontrol --dump |
每个样品文件名称都基于可执行文件的名称,使用右括号(})来代替每个正斜线(/)。文件名的结尾是井号(#)和用于该样品文件的计数器号码。例如,以下文件包括了计数器0所收集的 /sbin/syslogd 这个可执行文件的样品数据:
}sbin}syslogd#0 |
一旦抽样数据被收集,你可以使用以下工具来分析它们:
op_time
oprofpp
op_to_source
op_merge
使用这些工具以及被建档的二进制文件来生成可以进一步被分析的报告。
警告 | |
---|---|
被建档的可执行文件必须使用这些工具来分析数据。如果它在数据收集后必须被改变,请备份用来创建样品的可执行文件,以及这些样品文件。 |
每个可执行文件的样品都被写入一个样品文件。每个动态链接库的样品也被写入一个样品文件。在 OProfile 运行的时候,如果被监视的可执行文件改变了,而且用于这个可执行文件的样品文件存在,这个现存的样品文件就会被自动删除。因此,如果这个样品文件要被保留,它就必须在可执行文件被新版本替代前和所用的可执行文件一起备份。关于如何备份样品文件的详情,请参阅第 43.4 节。
op_time 提供了对所有建档的可执行文件的总览。
以下是输出示例的一部分:
581 0.2949 0.0000 /usr/bin/oprofiled 966 0.4904 0.0000 /usr/sbin/cupsd 1028 0.5218 0.0000 /usr/sbin/irqbalance 1187 0.6026 0.0000 /bin/bash 1480 0.7513 0.0000 /usr/bin/slocate 2039 1.0351 0.0000 /usr/lib/rpm/rpmq 6249 3.1722 0.0000 /usr/X11R6/bin/XFree86 8842 4.4885 0.0000 /bin/sed 31342 15.9103 0.0000 /usr/bin/gdmgreeter 58283 29.5865 0.0000 /no-vmlinux 82853 42.0591 0.0000 /usr/bin/perl |
每个可执行文件都在它自己的行上列出。第一列是为该可执行文件记录的样品数量。第二列是样品和样品总数的百分比。第三列没有被使用,第四列是这个可执行文件的名称。
关于 op_time 命令行选项的列表,请参阅它的说明书页。例如 -r 选项被用来按照样品数量的大小给输出排序;-c 选项在指定计数器号码时有用。
要检索关于指定可执行文件的详细信息,使用 oprofpp:
oprofpp <mode> <executable> |
<executable> 必须是到要分析的可执行文件的完整路径。<mode> 必须是以下之一:
按照符号列举样品数据。例如:以下是运行命令 oprofpp -l /usr/X11R6/bin/XFree86 的部分输出:
vma samples % symbol name ... 08195d10 4 3.0303 miComputeCompositeClip 080b9180 5 3.78788 Dispatch 080cdce0 5 3.78788 FreeResource 080ce4a0 5 3.78788 LegalNewID 080ce640 5 3.78788 SecurityLookupIDByClass 080dd470 9 6.81818 WaitForSomething 080e1360 12 9.09091 StandardReadRequestFromClient ... |
第一列是虚拟内存地址(vma)的起点。第二列是该符号的样品数量。第三列是该符号的样品和该可执行文件的总体样品的百分比。第四列是符号的名称。
要把输出按照样品的数量多少排序(反向),使用 -r 和 -l 选项。
列举某个符号名称特有的样品数据。例如:以下输出是从命令 oprofpp -s StandardReadRequestFromClient /usr/X11R6/bin/XFree86 中截取的:
vma samples % symbol name 080e1360 12 100 StandardReadRequestFromClient 080e1360 1 8.33333 080e137f 1 8.33333 080e13bb 1 8.33333 080e13f4 1 8.33333 080e13fb 1 8.33333 080e144a 1 8.33333 080e15aa 1 8.33333 080e1668 1 8.33333 080e1803 1 8.33333 080e1873 1 8.33333 080e190a 2 16.6667 |
第一行是符号/可执行文件组合的摘要。
第一列包括抽样的虚拟内存地址。第二列是该内存地址的抽样数量。第三列是该内存地址的样品和该符号的样品总数的百分比。
按照符号列举样品数据,比 -l 更详细。例如:
vma samples % symbol name 08083630 2 1.51515 xf86Wakeup 08083641 1 50 080836a1 1 50 080b8150 1 0.757576 Ones 080b8179 1 100 080b8fb0 2 1.51515 FlushClientCaches 080b8fb9 1 50 080b8fba 1 50 ... |
数据和 -l 选项一样,只不过,对于每个符号来说,每个所用的虚拟内存地址都被显示。对于每个虚拟内存地址,样品数量以及样品和该符号的样品数量的百分比也被显示。
按照 gprof 格式把输出生成到文件中。如果生成的文件叫做gmon.out,gprof 就能够被用来进一步分析数据。详情请参阅 gprof 的说明书页。
能够进一步限定数据的其它选项如下:
使用指定的样品文件 <file-name>。按照默认设置,/var/lib/oprofile/samples/ 中的样品文件会被使用。使用这个选项来指定来自前一个会话的样品文件。
使用 <file-name> 作为要检索数据的可执行文件的名称。
给 C++ 符号名称解码(demangle)。
给 C++ 符号名称解码(demangle),简化 STL 库的解码名称。
为指定计数器收集信息。若没有指定,默认的计数器是0。
每个样品都显示源码中的行号。当可执行文件被编译时,应该使用 GCC 的 -g 选项。否则,该选项将无法显示行号。红帽企业 Linux 的可执行文件默认都没有使用这个选项编译。
vma samples % symbol name linear info 0806cbb0 0 0 _start ../sysdeps/i386/elf/start.S:47 |
在输出中不包括用逗号分隔的符号列表。
显示包含共享库的附加列。这个选项只有在配置 OProfile 时指定了 --separate=library 选项,同时又没有指定 --dump-gprof-file 选项时才会生成结果。
按照指定列顺序来显示输出。该选项不能和 -g 一起使用。
使用以下字母来代表列:
指定到会话的完整路径或相对于 /var/lib/oprofile/samples/ 目录的目录。
指定要分析的可执行文件所在的用逗号分隔的路径列表。