43.5. 分析数据

OProfile 守护进程 oprofiled 定期收集样品,并把它们写入 /var/lib/oprofile/samples/ 目录。在读取数据之前,请以根用户身份执行以下命令来确定所有数据都被写入这个目录中了:

opcontrol --dump

每个样品文件名称都基于可执行文件的名称,使用右括号(})来代替每个正斜线(/)。文件名的结尾是井号(#)和用于该样品文件的计数器号码。例如,以下文件包括了计数器0所收集的 /sbin/syslogd 这个可执行文件的样品数据:

}sbin}syslogd#0

一旦抽样数据被收集,你可以使用以下工具来分析它们:

使用这些工具以及被建档的二进制文件来生成可以进一步被分析的报告。

警告警告
 

被建档的可执行文件必须使用这些工具来分析数据。如果它在数据收集后必须被改变,请备份用来创建样品的可执行文件,以及这些样品文件。

每个可执行文件的样品都被写入一个样品文件。每个动态链接库的样品也被写入一个样品文件。在 OProfile 运行的时候,如果被监视的可执行文件改变了,而且用于这个可执行文件的样品文件存在,这个现存的样品文件就会被自动删除。因此,如果这个样品文件要被保留,它就必须在可执行文件被新版本替代前和所用的可执行文件一起备份。关于如何备份样品文件的详情,请参阅第 43.4 节

43.5.1. 使用 op_time

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 选项在指定计数器号码时有用。

43.5.2. 使用 oprofpp

要检索关于指定可执行文件的详细信息,使用 oprofpp

oprofpp <mode> <executable>

<executable> 必须是到要分析的可执行文件的完整路径。<mode> 必须是以下之一:

-l

按照符号列举样品数据。例如:以下是运行命令 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 选项。

-s <symbol-name>

列举某个符号名称特有的样品数据。例如:以下输出是从命令 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

按照符号列举样品数据,比 -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 选项一样,只不过,对于每个符号来说,每个所用的虚拟内存地址都被显示。对于每个虚拟内存地址,样品数量以及样品和该符号的样品数量的百分比也被显示。

-g <file-name>

按照 gprof 格式把输出生成到文件中。如果生成的文件叫做gmon.outgprof 就能够被用来进一步分析数据。详情请参阅 gprof 的说明书页。

能够进一步限定数据的其它选项如下:

-f <file-name>

使用指定的样品文件 <file-name>。按照默认设置,/var/lib/oprofile/samples/ 中的样品文件会被使用。使用这个选项来指定来自前一个会话的样品文件。

-i <file-name>

使用 <file-name> 作为要检索数据的可执行文件的名称。

-d

给 C++ 符号名称解码(demangle)。

-D

给 C++ 符号名称解码(demangle),简化 STL 库的解码名称。

--counter <number>

为指定计数器收集信息。若没有指定,默认的计数器是0。

-o

每个样品都显示源码中的行号。当可执行文件被编译时,应该使用 GCC 的 -g 选项。否则,该选项将无法显示行号。红帽企业 Linux 的可执行文件默认都没有使用这个选项编译。

vma      samples  %      symbol name        linear info
0806cbb0 0        0      _start             ../sysdeps/i386/elf/start.S:47
-e <symbol-name>

在输出中不包括用逗号分隔的符号列表。

-k

显示包含共享库的附加列。这个选项只有在配置 OProfile 时指定了 --separate=library 选项,同时又没有指定 --dump-gprof-file 选项时才会生成结果。

-t <format>

按照指定列顺序来显示输出。该选项不能和 -g 一起使用。

使用以下字母来代表列:

字母描述
v虚拟内存地址
s样品数量
S样品的累计数量
p样品和该可执行文件的样品总数的相对百分比
P样品和该可执行文件的样品总数的累计百分比
q相对于所有抽样的可执行文件的样品百分比
Q相对于所有抽样的可执行文件的样品累计百分比
n符号名称
l源文件的名称和行号,包括完整路径
L源码文件名的基准名称和行号
i可执行文件的名称,包括完整路径
I可执行文件的基准名称
d样品的细节
h显示列标头

表 43-4. 用字母代表列的顺序

--session <name>

指定到会话的完整路径或相对于 /var/lib/oprofile/samples/ 目录的目录。

-p <path-list>

指定要分析的可执行文件所在的用逗号分隔的路径列表。

43.5.3. 使用 op_to_source

op_to_source 工具试图匹配特定指令的样品和源码中相对应的行。所生成的文件应该在左侧列出这些行的样品。它还会在每个函数的开头插入注释,列举该函数的样品总数。

要使用这个工具,可执行文件必须使用 GCC 的 -g 选项编译。红帽企业 Linux 软件包没有默认使用这个选项编译。

op_to_source 的一般语法是:

op_to_source --source-dir <src-dir> <executable>

必须指定包含要被分析的源码和可执行文件的目录。关于额外命令行选项的列表,请参阅 op_to_source 的说明书页。

43.5.4. 使用 op_merge

如果存在多个用于同一可执行文件或库的样品文件,样品文件可以被合并来简化分析。

例如:要合并 /usr/lib/library-1.2.3.so 库的文件,以根用户身份运行以下命令:

op_merge /usr/lib/library-1.2.3.so

结果文件是 /var/lib/oprofile/samples/}usr}lib}library-1.2.3.so

要限制样品文件被合并到指定的计数器,使用 -c 选项,再跟随一个计数器号码。