第 23 章 oprofile
OProfile 是一个由 oprofile 软件包提供的、全系统范围内的性能监控工具的较低的开销。它使用系统处理器中的性能监控硬件来检索系统中内核和可执行文件的信息,如引用内存时、第二级缓存请求数量以及收到的硬件中断数量。OProfile 还能够对在 Java 虚拟机(JVM)中运行的应用程序进行性能分析。
以下是 OProfile 提供的工具选择:
- ophelp
- 显示系统处理器的可用事件,以及每个事件的简短描述。
- operf
主要分析工具。
operf
工具使用 Linux 性能事件子系统,它允许 OProfile 使用系统的性能监控硬件与其他工具进行操作。与之前使用的
opcontrol
工具不同,不需要初始设置,除非使用了--system-wide
选项,否则在没有 root 权限的情况下可以使用它。
- ocount
- 用于计算出现绝对事件数的工具。它可以计算整个系统、每个进程、每个 CPU 或每个线程的事件。
- opimport
- 将外部二进制格式中的示例数据库文件转换为系统的原生格式。仅在分析不同架构的示例数据库时使用这个选项。
- opannotate
- 如果应用程序使用调试符号编译,则为可执行文件创建一个注解的源。
- opreport
- 读取记录的性能数据,并生成根据配置集规格指定的摘要。可以使用不同的配置集规格从同一配置集数据生成不同的报告。
23.1. 使用 OProfile
operf
是收集性能分析数据的推荐工具。工具不需要任何初始配置,并且所有选项都在命令行中传递给它。与传统的 opcontrol
工具不同,operf
可以运行没有 root
特权。有关如何使用 operf 工具的详细信息,请参阅 《系统管理员指南》 中的使用 operf
章节。
例 23.1. 使用 ocount
以下示例显示了在执行 sleep
实用程序期间使用 ocount
的事件量:
$ ocount -e INST_RETIRED -- sleep 1 Events were actively counted for 1.0 seconds. Event counts (actual) for /bin/sleep: Event Count % time counted INST_RETIRED 683,011 100.00
事件是特定于处理器的处理器实施。可能需要设置选项 perf_event_paranoid
,或者将计数限制为仅用户空间事件。
例 23.2. 基本 operf 使用量
在以下示例中,o perf
工具用于从 ls -l ~
命令收集性能分析数据。
为
ls
命令安装调试信息:# debuginfo-install -y coreutils
运行性能分析:
$ operf ls -l ~ Profiling done.
分析收集的数据:
$ opreport --symbols CPU: Intel Skylake microarchitecture, speed 3.4e+06 MHz (estimated) Counted cpu_clk_unhalted events () with a unit mask of 0x00 (Core cycles when at least one thread on the physical core is not in halt state) count 100000 samples % image name symbol name 161 81.3131 no-vmlinux /no-vmlinux 3 1.5152 libc-2.17.so get_next_seq 3 1.5152 libc-2.17.so strcoll_l 2 1.0101 ld-2.17.so _dl_fixup 2 1.0101 ld-2.17.so _dl_lookup_symbol_x [...]
例 23.3. 使用 operf 配置文件 Java 计划
在以下示例中,operf 工具用于从 Java(JIT)程序收集性能分析数据,而 opreport
工具则用于针对每个symbol 数据输出。
安装本示例中使用的演示 Java 程序。它是 java-1.8.0-openjdk-demo 软件包的一部分,该软件包包含在 Optional 频道中。如需有关如何使用 Optional 频道的说明,请参阅添加 Optional 和 Supplementary 软件仓库。启用 Optional 频道时,安装软件包:
# yum install java-1.8.0-openjdk-demo
为 OProfile 安装 oprofile-jit 软件包,以便能够从 Java 程序收集性能分析数据:
# yum install oprofile-jit
为 OProfile 数据创建一个目录:
$ mkdir ~/oprofile_data
使用演示程序更改到该目录:
$
cd /usr/lib/jvm/java-1.8.0-openjdk/demo/applets/MoleculeViewer/
启动配置集:
$ operf -d ~/oprofile_data appletviewer \ -J"-agentpath:/usr/lib64/oprofile/libjvmti_oprofile.so" example2.html
进入主目录并分析收集的数据:
$
cd
$
opreport --symbols --threshold 0.5
示例输出可能类似如下:
$ opreport --symbols --threshold 0.5 Using /home/rkratky/oprofile_data/samples/ for samples directory. CPU: Intel Ivy Bridge microarchitecture, speed 3600 MHz (estimated) Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (No unit mask) count 100000 samples % image name symbol name 14270 57.1257 libjvm.so /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.51-1.b16.el7_1.x86_64/jre/lib/amd64/server/libjvm.so 3537 14.1593 23719.jo Interpreter 690 2.7622 libc-2.17.so fgetc 581 2.3259 libX11.so.6.3.0 /usr/lib64/libX11.so.6.3.0 364 1.4572 libpthread-2.17.so pthread_getspecific 130 0.5204 libfreetype.so.6.10.0 /usr/lib64/libfreetype.so.6.10.0 128 0.5124 libc-2.17.so __memset_sse2