进行时钟分析时,收集的数据取决于操作系统所提供的信息。
在 Oracle Solaris 下的时钟分析中,每个线程的状态都按固定的时间间隔存储。 该时间间隔称为分析间隔。使用分析间隔的精度将收集的数据转换为每个状态所用的时间。
缺省分析间隔约为 10 毫秒 (10 ms)。可以指定高精度分析间隔(大约为 1 毫秒)和低精度分析间隔(大约为 100 毫秒)。如果操作系统允许,也可以指定定制间隔。不带任何其他参数运行 collect -h 可输出系统所允许的范围和精度。
下表显示当实验包含时钟分析数据时,性能分析器和 er_print 可显示的性能度量。请注意,来自所有线程的度量加在了一起。
|
计时度量按多种类别说明程序消耗时间的位置,并且可用于改善程序的性能。
高用户 CPU 时间说明程序处理大部分工作的位置。可使用它来查找重新设计算法后可能受益最多的程序部分。
高系统 CPU 时间说明程序在对系统例程的调用中消耗了大量时间。
高等待 CPU 时间说明准备运行的线程数比可用的 CPU 多,或其他进程正在使用 CPU。
高用户锁定时间说明线程无法获得其请求的锁定。
高文本缺页时间意味着链接程序要求的代码会在内存中进行组织,所以很多调用或分支会导致装入新的页面。
高数据缺页时间表明对数据的访问会导致新的页面被装入。重新组织程序的数据结构或算法可以修复此问题。
在 Linux 平台上,只能将时钟数据显示为 CPU 总时间。Linux CPU 时间是用户 CPU 时间和系统 CPU 时间的总和。
如果在 OpenMP 程序上执行时钟分析,还提供其他度量:Master Thread Time(主线程时间)、OpenMP Work Time(OpenMP 工作时间)和 OpenMP Wait Time(OpenMP 等待时间)。
在 Oracle Solaris 上,"Master Thread Time"(主线程时间)是主线程消耗的总时间,它与挂钟时间相对应。该度量在 Linux 上不可用。
在 Oracle Solaris 上,以串行或并行方式执行工作时,"OpenMP Work Time"(OpenMP 工作时间)会累计。在以下情况下,"OpenMP Wait Time"(OpenMP 等待时间)会累计:OpenMP 运行时正在等待进行同步时、该等待正在使用 CPU 时间或正在休眠时,以及正在以并行方式执行工作,但未在 CPU 上安排线程时。
在 Linux 操作系统上,仅当进程在用户模式或系统模式下处于活动状态时,"OpenMP Work Time"(OpenMP 工作时间)和 "OpenMP Wait Time"(OpenMP 等待时间)才会累计。除非您已指定 OpenMP 应执行忙等待,否则,Linux 上的 "OpenMP Wait Time"(OpenMP 等待时间)没有用处。
OpenMP 程序的数据可以在三种查看模式中的任一种模式下显示。在用户模式下,从线程按实际从主线程克隆的方式显示,并使其调用堆栈匹配主线程的调用堆栈。调用堆栈中来自 OpenMP 运行时代码 (libmtsk.so) 的帧会被禁止。在专家用户模式下,主从线程的显示方式不同,编译器生成的显式函数可见,来自 OpenMP 运行时代码 (libmtsk.so) 的框架将被禁止。对于计算机模式,将显示实际的本机堆栈。
er_kernel 实用程序可以收集有关 Oracle Solaris 内核的基于时钟的分析数据。要分析内核,可从命令行直接运行 er_kernel 实用程序,或从性能分析器的 "File"(文件)菜单中选择 "Profile Kernel"(分析内核)。
er_kernel 实用程序捕获内核分析数据,并将数据记录为性能分析器实验,其格式与 collect 实用程序在用户程序上创建的实验格式相同。实验可以由 er_print 实用程序或性能分析器进行处理。内核实验可以显示函数数据、调用方-被调用方数据、指令级数据和时间线,但是不能显示源代码行数据(因为大多数 Oracle Solaris 模块不包含行号表)。
er_kernel 还可以对正在运行的用户有权限的任何进程记录用户级实验。此类实验类似于 collect 创建的实验,但它只包含 "User CPU Time"(用户 CPU 时间)和 "System CPU Time"(系统 CPU 时间)数据,不支持 Java 或 OpenMP 分析。
有关更多信息,请参见Chapter 9, 内核分析。
可以在用 Oracle Message Passing Toolkit(以前称为 Sun HPC ClusterTools)运行的 MPI 实验中收集时钟分析数据。Oracle Message Passing Toolkit 必须至少为版本 8.1。
Oracle Message Passing Toolkit 已集成在 Oracle Solaris 11 发行版中。如果系统中安装了此工具包,您可以在 /usr/openmpi 中找到它。如果您的 Oracle Solaris 11 系统中尚未安装此工具包,当您为系统配置了软件包系统信息库时,可以使用命令 pkg search openmpi 搜索该工具包。有关在 Oracle Solaris 11 中安装软件的更多信息,请参见《在 Oracle Solaris 11 中添加和更新软件》。
在 MPI 实验中收集时钟分析数据时,还可以查看两个其他度量:
MPI Work Time(MPI 工作时间),该度量将在进程正在 MPI 运行时内执行工作(如处理请求或消息)时累计。
MPI Wait Time(MPI 等待时间),该度量将在进程正在 MPI 运行时内等待事件、缓冲区或消息时累计
在 Oracle Solaris 上,以串行或并行方式执行工作时,MPI 工作时间会累计。在以下情况下,MPI 等待时间会累计:MPI 运行时正在等待进行同步时、该等待正在使用 CPU 时间或正在休眠时,以及正在以并行方式执行工作,但未在 CPU 上调度线程时。
在 Linux 上,仅当进程在用户模式或系统模式下处于活动状态时,MPI 工作时间和 MPI 等待时间才会累计。除非您已指定 MPI 应执行忙等待,否则,Linux 上的 MPI 等待时间没有用处。
Oracle Message Passing Toolkit 版本号由安装路径指定,例如 /opt/SUNWhpc/HPC8.2.1,或者,您可以按照如下所示键入 mpirun —V 查看输出,其中版本以斜体表示:
mpirun (Open MPI) 1.3.4r22104-ct8.2.1-b09d-r70
如果您的应用程序是使用 GNU 或 Intel 编译器编译的,并且要对 MPI 使用 Oracle Message Passing Toolkit 8.2 或 8.2.1,则要获取 MPI 状态数据,必须使用 –WI 和 –-enable-new-dtags 选项和 Oracle Message Passing Toolkit link 命令。这些选项将使可执行文件定义 RPATH 及 RUNPATH,从而可使用 LD_LIBRARY_PATH 环境变量启用 MPI 状态库。