Oracle Solaris Studio 12.2:性能分析器

第 4 章 性能分析器工具

性能分析器是一款用于分析收集器所收集性能数据的图形化数据分析工具。收集器可以从“性能分析器”菜单选项或者通过使用 collect 命令或 dbx 中的 collector 命令来启动。收集器在进程执行过程中收集性能信息以创建实验,如第 3 章中所述。性能分析器读入这些实验,分析数据,然后以表格和图形显示这些数据。命令行工具 er_print 实用程序也可用来以 ASCII 文字格式显示实验数据。有关更多信息,请参见第 5 章

本章包含以下主题:

启动性能分析器

要启动性能分析器,请在命令行中键入以下内容:


% analyzer [control-options] [experiment-list]

experiment-list 命令参数是以空格分隔的实验名称、实验组名称或这两者的列表。如果不提供实验列表,分析器将启动并自动打开“打开实验”对话框,这样您就可以导航到某个实验并将其打开。

您可以在命令行中指定多个实验或实验组。如果指定其中包含后续实验的实验,将会自动装入所有后续实验。初始创始进程的数据将与所有子孙进程的数据聚集在一起。要装入个别后续实验,必须显式指定每个实验或者创建实验组。也可以在 .er.rc 文件中放入 en_desc 指令(请参见en_desc { on | off | =regexp })。

要创建实验组,可以在 collect 实用程序中使用 -g 参数。要手动创建实验组,请创建首行为以下内容的纯文本文件:

#analyzer experiment group

然后将实验名称添加到随后的行中。文件的扩展名必须为 erg

也可以使用分析器窗口中的“文件”菜单来添加实验或实验组。要打开后续进程上所记录的实验,必须在“打开实验”对话框(或“添加实验”对话框)中键入文件名称,因为文件选择器不允许将实验作为目录打开。

分析器显示多个实验时,缺省情况下聚集所有实验的数据。组合和查看数据时,就好像数据来自一个实验一样。但是,还可以选择比较实验而不是聚集数据。请参见比较实验

可以在“打开实验”对话框或“添加实验”对话框中单击要装入的实验或实验组的名称来预览该实验或实验组

您还可以按以下所示通过命令行启动性能分析器来记录实验:


% analyzer [Java-options] [control-options] target [target-arguments]

分析器启动并显示“收集”窗口,显示指定的目标及其参数以及用于收集实验的设置。有关详细信息,请参见从分析器记录实验

分析器命令选项

这些选项控制分析器的行为,分为三个组:

Java 选项

这些选项为运行分析器的 JVM 指定设置。

-j | --jdkhome jvm-path

指定运行分析器的 JVM 软件的路径。如果未指定 -j 选项,则首先采用缺省路径,方法是在环境变量中检查 JVM 的路径(先检查 JDK_HOME,再检查 JAVA_PATH)。如果这两个环境变量均未设置,将使用 PATH 上找到的 JVM。使用 -j 选项可覆盖所有缺省路径。

-J jvm-options

指定 JVM 选项。可以指定多个选项。例如:

控制选项

这些选项控制 GUI 的字体大小,并在启动分析器之前显示版本和运行时信息。

-f | --fontsize size

指定要在分析器 GUI 中使用的字体大小。

-v | --verbose

启动之前列显版本信息和 Java 运行时参数。

信息选项

这些选项不调用性能分析器 GUI,但将有关 analyzer 的信息列显至标准输出。以下每个选项都是独立选项;它们不能与其他 analyzer 选项、目标或 experiment-list 参数结合使用。

-V | --version

列显版本信息并退出。

-? | --h | --help

列显用法信息并退出。

分析器缺省设置

启动时,分析器使用名为 .er.rc 的资源文件来确定各种设置的缺省值。首先读取系统范围的 er.rc 缺省值文件,然后读取用户的起始目录中的 .er.rc 文件(如果有),最后读取当前目录中的 .er.rc 文件(如果有)。您的主目录中的 .er.rc 文件的缺省值覆盖系统缺省值,当前目录中的 .er.rc 文件的缺省值覆盖主目录缺省值和系统缺省值。.er.rc 文件由分析器和 er_print 实用程序使用。er_src 实用程序也使用 .er.rc 中应用至源文件和反汇编编译器注释的所有设置。

有关 .er.rc 文件的更多信息,请参见分析器缺省设置一节。有关使用 er_print 命令设置缺省值的信息,请参见设置缺省值的命令仅为性能分析器设置缺省值的命令

性能分析器 GUI

分析器窗口具有菜单栏、工具栏以及一个包含用于显示各种数据的标签的拆分窗格。

菜单栏

菜单栏包含“文件”菜单、“视图”菜单、“时间线”菜单和“帮助”菜单。

“文件”菜单用来打开、添加和删除实验和实验组。利用“文件”菜单可以通过性能分析器 GUI 来收集实验数据。有关使用性能分析器收集数据的详细信息,请参阅从分析器记录实验。从“文件”菜单,还可以创建新的分析器窗口并将分析器中当前显示的数据打印到文件或打印机。

利用“视图”菜单可以配置实验数据的显示方式。

正如其名称所表示的那样,“时间线”菜单可以帮您浏览时间线显示,分析器数据显示对其进行了介绍。

“帮助”菜单提供性能分析器的联机帮助、新功能摘要、快速参考和快捷键以及故障排除。

工具栏

工具栏提供了几组图标作为快捷方式,此外包含“查找”功能以帮助您在标签中定位文本或突出显示的行。有关“查找”功能的更多详细信息,请参阅查找文本和数据

分析器数据显示

性能分析器使用拆分窗口将数据显示在两个窗格中。每个窗格都含有标签,以便您可以为同一实验或实验组选择不同的数据显示。

数据显示,左窗格

左窗格按标签出现的顺序显示主要分析器显示中的标签:

如果调用分析器时没有指定目标,系统将提示您打开一个实验。

缺省情况下,选中第一个可见的标签。仅显示适用于装入实验中的数据的标签。

打开实验时某个标签是否显示在分析器窗口的左窗格中取决于启动分析器时读取的 .er.rc 文件中的标签指令以及标签是否适用于实验中的数据。您可以使用“设置数据表示”对话框中的“标签”标签(请参见“标签”标签)来选择要为实验显示的标签。

“MPI 时间线”标签

“MPI 时间线”标签显示一组水平栏,这些水平栏与 MPI 实验中的进程一一对应,其间以指示消息的对角线连接。每个栏中的区域都根据所在的 MPI 函数着色,或者表明该进程不在 MPI 内(即,位于应用程序代码中的其他位置)。

选择栏的某个区域或消息线可在“MPI 时间线控件”标签中显示有关该选定区的详细信息。

拖动鼠标可使“MPI 时间线”标签沿水平(时间)轴或垂直(进程)轴放大,具体取决于拖动的主方向。

可以将“MPI 时间线”的图像打印到打印机或 .jpg 文件。选择“文件”->“打印”并选择“打印”或“文件”,然后指定打印机或文件名。

“MPI 图表”标签

“MPI 图表”标签显示“MPI 时间线”标签中显示的 MPI 跟踪数据的图表。它可显示与 MPI 执行有关的数据图。更改“MPI 图表”标签中的控件然后单击“重画”,将显示一个新的图表。选择图表中的某个元素可在“MPI 图表控件”标签中显示有关该元素的更多详细信息。

拖动鼠标可使“MPI 图表”标签在拖动鼠标形成的矩形区域上放大。

可以将 MPI 图表的图像打印到打印机或 .jpg 文件。选择“文件”->“打印”并选择“打印”或“文件”,然后指定打印机或文件名。

“争用”标签

“争用”标签显示在数据争用实验中检测到的所有数据争用列表。有关更多信息,请参见《Oracle Solaris Studio 12.2:线程分析器用户指南》

“死锁”标签

“死锁”标签显示在死锁实验中检测到的所有死锁列表。有关更多信息,请参见《Oracle Solaris Studio 12.2:线程分析器用户指南》

“函数”标签

“函数”标签显示由函数及其度量构成的列表。度量是根据在实验中收集的数据得出的。度量可以是独占的,也可以是包含的。独占的度量表示仅由函数本身使用。非独占的度量表示可由函数及其所调用的所有函数使用。

collect(1) 手册页中提供了收集的每种数据的可用度量列表。仅列出具有非零度量的函数。

时间度量显示为秒,精度可达到毫秒。百分比精确到 0.01%。如果某个度量值正好为零,则其时间和百分比显示为 "0"。如果值不是恰好为零,但小于精度,则其值将显示为 "0.000",其百分比为 "0.00"。由于进行了舍入,百分比总和可能不会恰好是 100%。计数度量显示为整数计数。

初始显示的度量基于收集的数据以及从各种 .er.rc 文件中读取的缺省设置。初始安装性能分析器时,缺省值如下所示:

如果收集的数据类型多于一种,则显示每种类型的缺省度量。

可以更改或重新组织显示的度量;有关详细信息,请参见联机帮助。

要搜索函数,请使用查找工具。有关“查找”工具的更多详细信息,请参阅查找文本和数据

要选择单个函数,请单击该函数。

要选择在标签中连续显示的多个函数,请选择组中的第一个函数,然后按住 Shift 键并单击组中的最后一个函数。

要选择标签中不连续显示的多个函数,请选择组中的第一个函数,然后通过按住 Ctrl 键并单击每个函数来选择其他函数。

单击工具栏上的“编写过滤器子句”按钮时,将打开“过滤数据”对话框,对话框的“高级”标签处于选中状态,并且在“过滤器子句”文本框中装入了反映“函数”标签中的一个或多个选择的过滤器子句。

还可以在“函数”标签中右键单击打开上下文菜单并为所选函数设置预定义过滤器。上下文菜单显示:

选择其中一个选项时,将打开“过滤数据”对话框并选中“高级”标签,同时“过滤器子句”文本框装入了可实现所选“设置过滤器”的过滤器表达式。单击“设置”,然后单击“应用”以过滤数据。有关更多信息,请参见过滤数据

“调用者与被调用者”标签

“调用方与被调用方”标签显示代码中函数之间的调用关系,同时显示性能度量。“调用方与被调用方”标签允许通过一次为一个调用构建调用堆栈片段详细检查代码分支的度量。

该标签显示三个独立的面板:“调用方”面板位于顶部,“堆栈片段”面板位于中部,“被调用方”面板位于下部。首次打开“调用方与被调用方”标签时,“堆栈片段”面板中的函数即为在分析器的另一个标签(如“函数”标签或“源”标签)中选择的函数。“调用方”面板列出用于调用“堆栈片段”面板中函数的函数,“被调用方”面板列出由“堆栈片段”面板中函数调用的函数。

通过将调用方和被调用方添加到调用堆栈,可以以一次一个调用的方式围绕中心函数构造调用堆栈片段。

通过双击“调用方”窗格或“被调用方”窗格中的函数,或者通过选择函数并单击“添加”按钮,可以将调用添加到堆栈片段。删除函数调用与添加类似,方法是双击位于调用堆栈片段顶部或底部的函数,或者选择顶部或底部函数并单击“删除”。添加和删除任务还可以通过上下文菜单执行,方法是右键单击函数并选择适当的命令。

通过选择某个函数并单击“设置头部”、“设置中心”或“设置尾部”,可以将函数设置为调用堆栈片段的头部(顶部)、中心或尾部(底部)。此新排序可导致调用堆栈片段中目前存在的其他函数移动到调用方区域或被调用方区域中与堆栈片段中所选函数的新位置相对的适当位置。

可以使用位于“堆栈片段”面板上方的“后退”和“前进”按钮转到调用堆栈片段的某次更改。

添加或删除堆栈片段中的函数时,针对整个片段计算度量并在该片段中最后一个函数的旁边显示这些度量。

可以通过在“调用方与被调用方”标签中右键单击打开上下文菜单并为所选函数设置预定义过滤器。上下文菜单显示:

选择其中一个选项时,将打开“过滤数据”对话框并选中“高级”标签,同时“过滤器子句”文本框装入可实现所选“设置过滤器”的过滤器表达式。单击“设置”,然后单击“应用”以过滤数据。有关更多信息,请参见过滤数据

“调用方与被调用方”标签显示归属度量:

有关度量的更多信息,请参见函数级度量:独占、包含和归属

“调用树”标签

“调用树”标签将程序的动态调用图显示为树,其中每个函数调用显示为可以展开和折叠的节点。展开的函数节点显示从该函数产生的所有函数调用,同时显示这些函数调用的性能度量。选择某个节点时,位于右侧的“摘要”标签将显示该函数调用及其被调用方的度量。为归属度量给出的百分比就是总程序度量的百分比。树的缺省根目录是 <Total>,这不是一个函数,而是表示程序的所有函数的 100% 的性能度量。

“调用树”标签允许向下掘取到具体的调用跟踪并分析哪些跟踪具有最大的性能影响。可以通过程序结构进行导航,搜索高度量值。


提示 –

要方便地查找最耗时的分支,右键单击任一节点并选择“展开最热分支”。


可以通过在“调用树”标签中右键单击打开上下文菜单,为所选函数设置预定义过滤器。上下文菜单显示:

选择其中一个选项时,将打开“过滤数据”对话框并选中“高级”标签,同时“过滤器子句”文本框装入可实现所选“设置过滤器”的过滤器表达式。单击“设置”,然后单击“应用”以过滤数据。有关更多信息,请参见过滤数据

“双重数据源”标签

“双重数据源”标签显示所选数据争用或死锁涉及到的两个源上下文。仅当装入了数据争用检测或死锁实验时才会显示此标签。

“源-反汇编”标签

“源-反汇编”标签中上面的窗格显示带注释的源,下面的窗格显示带注释的反汇编。缺省情况下该标签不可见。可以使用“视图”菜单中的“设置数据表示”选项来添加“源-反汇编”标签。

“源”标签

如果源代码可用,“源”标签显示包含所选函数源代码的文件,在每个源代码行左侧的列中,都提供有性能度量注释。高度量值用橙色高亮显示,指明这些源代码行位于资源使用的热点区域。对于每个热点源代码行,还在滚动条旁边的右边界中显示一个橙色的导航标记。低于热点阈值的非零度量不高亮显示,但用黄色导航标记进行标记。要快速导航到具有度量的源代码行,可以单击右边界中的橙色或黄色标记以跳到具有度量的代码行。还可以右键单击度量本身并选择诸如“下一个热点代码行”或“下一个非零度量代码行”之类的选项以跳到下一个具有度量的代码行。

高亮显示度量的阈值可以在“源代码/反汇编”标签中的“设置数据显示”对话框中进行设置。可以在 .er.rc 缺省值文件中设置缺省阈值。有关 .er.rc 文件的更多信息,请参见分析器缺省设置

“源”标签在源代码的列标题中显示源文件和相应对象文件的完整路径以及装入对象的名称。少数情况下,会使用同一源文件编译多个目标文件,此时“源”标签显示包含所选函数的目标文件的性能数据。

分析器在可执行文件中记录的绝对路径名下查找包含所选函数的文件。如果文件不在此处,分析器尝试在当前工作目录中查找具有相同基本名称的文件。如果移动了源,或者实验记录在其他文件系统中,可以在当前目录中设置指向原始路径名的源的副本或符号链接,以便查看带注释的源。也可以使用“设置数据显示”对话框中的设置:通过“搜索路径”标签(请参见“搜索路径”标签),您可以管理要用来搜索源文件的目录列表;通过“路径映射”标签(请参见“路径映射”标签),您可以将文件路径的前面部分从一个位置映射到另一个位置。

在“函数”标签中选择一个函数并且“源”标签打开时,显示的源文件为该函数的缺省源上下文。函数的缺省源上下文是包含函数的第一条指令(对于 C 代码,为函数的左花括号)的文件。紧接着第一条指令,带注释的源文件为函数添加索引行。源窗口用尖括号中的红色斜体文本显示索引行,格式如下:

<Function: f_name>

函数可能具有其他源上下文,即包含归属于该函数的指令的其他文件。这些指令可能来自头文件或内联到所选函数中的其他函数。如果存在其他源上下文,则缺省源上下文的开头将包含指示其他源上下文所在位置的扩展索引行列表。

<Function: f, instructions from source file src.h>

双击引用其他源上下文的索引行,将在与索引函数关联的位置打开包含该源上下文的文件。

为了便于导航,其他源上下文也以一个索引行列表开头,通过这些索引行可以返回到缺省源上下文和其他源上下文中定义的函数。

源代码中插入了所有选择显示的编译器注释。可以在“设置数据表示”对话框中设置显示的注释类别。可以在 .er.rc 缺省值文件中设置缺省类别。

可以更改或重新组织“源”标签中显示的度量,有关详细信息,请参见联机帮助。

“行”标签

“行”标签显示包含源行及其度量的列表。源行标有行所在的函数以及行号和源文件名称。如果函数无行号信息或函数的源文件未知,则在行显示中,函数的所有程序计数器 (program counter, PC) 聚集在一起,显示为该函数的单个条目。在行显示中,来自隐藏了其函数的装入对象中的函数中的 PC 聚集在一起,显示为该装入对象的单个条目。如果从“行”标签中选择一个行,则会在“摘要”标签中显示该行的所有度量。如果从“行”标签中选择一个行后选择“源”或“反汇编”标签,则会将显示定位到适当的行。

“反汇编”标签

“反汇编”标签显示包含所选函数的目标文件的反汇编列表,带有针对每条指令的性能度量注释。

反汇编列表中插入了源代码(如果有)以及所有选择显示的编译器注释。在“反汇编”标签中查找源文件的算法与在“源”标签中使用的算法相同。

与“源”标签相同,“反汇编”标签中显示索引行。但与“源”标签不同的是,其他源上下文的索引行不能直接用于导航。此外,替代源上下文的索引行显示在 #included 或内联代码插入位置的开头,而不是仅在“反汇编”视图的开头列出。来自其他文件的 #included 或内联代码显示为原始反汇编指令,不与源代码交叉在一起显示。但是,将光标置于这些指令之一上并选择“源”标签可以打开包含 #included 或内联代码的源文件。显示此文件时选择“反汇编”标签将在新上下文中打开“反汇编”视图,从而显示插入了源代码的反汇编代码。

可以在“设置数据表示”对话框中设置显示的注释类别。可以在 .er.rc 缺省值文件中设置缺省类别。

分析器突出显示度量等于或大于特定于度量的阈值的行,以便于查找重要的行。可以在“设置数据表示”对话框中设置阈值。可以在 .er.rc 缺省值文件中设置缺省阈值。与“源”标签相同,滚动条旁边显示有勾号(对应于反汇编代码中超过阈值的行的位置)。

"PC" 标签

"PC" 标签显示包含程序计数器 (program counter, PC) 及其度量的列表。PC 标有其所来自的函数及在该函数中的偏移。在 "PC" 显示中,来自隐藏了其函数的装入对象中的函数中的 PC 聚集在一起,显示为装入对象的单个条目。在 "PC" 标签中选择一个行将在“摘要”标签中显示该 PC 的所有度量。从 "PC" 标签中选择一个行后选择“源”或“反汇编”标签会将显示定位到适当的行。

有关 PC 的更多信息,请参见调用栈和程序执行一节。

“OpenMP 并行区域”标签

“OpenMP 并行区域”标签仅适用于使用 OpenMP 3.0 收集器记录的实验。该标签列出程序执行期间遇到的所有并行区域和从相同分析数据计算得出的度量值。针对当前并行区域计算独占度量。非独占度量反映嵌套并行性。它们被归属到当前并行区域和从其创建当前并行区域的父并行区域,甚至进一步递归直至最顶层隐式 OpenMP 并行区域,这表示以串行方式执行程序(在任何并行区域之外)。如果程序中不存在嵌套并行区域,独占度量和非独占度量具有相同的值。

如果多次调用包含并行区域的函数,并行区域的所有实例将聚集在一起,呈现为相应标签中的一个行项目。

该标签可用于进行导航。可以选择感兴趣的项目(如具有最高“OpenMP 等待”时间的并行区域),分析其源或者根据该项目创建并应用过滤器,然后分析其他程序对象如何使用其他标签(函数列表、时间线、线程等等)来表示该项目。

“OpenMP 任务”标签

“OpenMP 任务”标签显示 OpenMP 任务及其度量的列表。此标签仅适用于使用 OpenMP 3.0 收集器记录的实验。

对于使用利用 Oracle Solaris Studio 编译的“OpenMP 任务”的程序,“OpenMP 任务”标签仅应用于利用 OpenMP 3.0 收集器记录的实验。

该标签列出在程序执行期间遇到的任务,以及从分析数据计算的度量值。独占度量仅应用于当前任务。非独占度量包括 OpenMP 任务的度量及其子任务的度量,父子关系是在任务创建时间建立的。来自隐式并行区域的 OpenMP 任务表示以串行方式执行程序。

如果多次调用包含任务的函数,并行区域的所有实例将聚集在一起,呈现为相应标签中的一个行项目。

该标签可用于进行导航。可以选择感兴趣的项目(如具有最高“OpenMP 等待”时间的任务),分析其源或者根据该项目创建并应用过滤器,然后分析其他程序对象如何使用其他标签(函数列表、时间线、线程等等)来表示该项目。

“时间线”标签

“时间线”标签以时间的函数形式显示收集器记录的事件和样本点图。数据显示在水平栏中。对于每个实验,都有一个样本数据栏和一组用于每个 LWP 的栏。LWP 栏中包含一个用于每个记录的数据类型的栏:基于时钟的分析、硬件计数器溢出分析、同步跟踪、堆跟踪以及 MPI 跟踪。

包含样本数据的栏显示在每个样本的每个微状态中花费时间的彩色编码表示。样本显示为时间段,原因是样本点上的数据表示该样本点和上一个样本点之间所花费的时间。单击样本将在“事件”标签中显示该样本的数据。

分析数据栏或跟踪数据栏显示每个记录的事件的事件标记。事件标记包含随事件记录的调用栈的彩色编码表示,如彩色矩形栈。单击事件标记中的彩色矩形将选择对应的函数和 PC 并在“事件”标签中显示该事件和该函数的数据。“事件”标签和“图例”标签中的选定内容会突出显示,并且选择“源”标签或“反汇编”标签可以将标签显示定位在调用栈中的该帧对应的行上。

对于某些类型的数据,事件可能会因重叠而不可见。如果两个或多个事件恰好出现在同一位置,则只绘制一个事件;如果一个或两个像素内有两个或多个事件,将绘制全部事件。但是可能无法从视觉上区分它们。在以上两种情况下,绘制的事件下将显示一个小的灰色勾号,以表示重叠。

利用“设置数据表示”对话框的“时间线”标签可以执行以下操作:更改显示的特定于事件的数据的类型;选择线程、LWP 或 CPU 特定于事件的数据的显示;选择在根或叶处对齐调用栈表示;选择显示的调用栈的级别数。

可以更改“时间线”标签中显示的特定于事件的数据的类型,也可以更改映射到所选函数的颜色。有关使用“时间线”标签的详细信息,请参阅联机帮助。

“泄漏列表”标签

“泄漏列表”标签显示两行,上面一行表示泄漏,下面一行表示分配。每一行包含一个调用栈,与“时间线”标签中显示的调用栈类似;在中间,上面有一个条,其长度与泄漏或分配的字节数成比例,下面也有一个条,其长度与泄漏或分配数成比例。

选择泄漏或分配将在“泄漏”标签中显示所选的泄漏或分配的数据,并且在调用栈中选择一个帧(与在“时间线”标签中相同)。

可以通过在“设置数据表示”对话框的“标签”标签中选择“泄漏列表”标签来显示该标签(请参见“标签”标签)。仅在一个或多个装入的实验包含堆跟踪数据时才能使“泄漏列表”标签可见。

“数据对象”标签

“数据对象”标签显示数据对象及其度量的列表。该标签仅应用于包括数据空间分析的实验,包括数据空间分析的实验是对硬件计数器溢出分析的扩展。有关更多信息,请参见数据空间分析

可以通过在“设置数据表示”对话框的“标签”标签中选择该标签来显示该标签(请参见“标签”标签)。仅在一个或多个装入的实验包含数据空间分析时才能使“数据对象”标签可见。

该标签显示针对程序中的各种数据结构和变量的硬件计数器内存操作度量。

要选择单个数据对象,请单击该对象。

要选择在标签中连续显示的多个对象,请选择第一个对象,然后按住 Shift 键并单击最后一个对象。

要选择在标签中不连续显示的多个对象,请选择第一个对象,然后通过按住 Ctrl 键并单击每个对象来选择其他对象。

单击工具栏上的“编写过滤子句”按钮时,将打开“过滤”对话框,此时已选中对话框的“高级”标签,并且在“过滤子句”文本框中装入了反映“数据对象”标签中的选择的过滤子句。

“数据布局”标签

“数据布局”标签显示所有程序数据对象(具有数据派生度量数据)的带注释的数据对象布局。该标签仅适用于包括数据空间分析的实验,包括数据空间分析的实验是对硬件计数器溢出分析的扩展。有关更多信息,请参见数据空间分析

总的来说,标签中显示的布局按照结构的数据排序度量值进行排序。标签显示每个聚集的数据对象及归属于该对象的总度量,后跟数据对象中的所有元素(按偏移量顺序)。每个元素相应地具有其自己的度量,并且在一个 32 字节的块中指示其大小和位置。

可以通过在“设置数据表示”对话框的“标签”标签中选择“数据布局”标签来显示该标签(请参见“标签”标签)。与“数据对象”标签相同,仅在一个或多个装入的实验包含数据空间分析时才可使“数据布局”标签可见。

要选择单个数据对象,请单击该对象。

要选择在标签中连续显示的多个对象,请选择第一个对象,然后按住 Shift 键并单击最后一个对象。

要选择在标签中不连续显示的多个对象,请选择第一个对象,然后通过按住 Ctrl 键并单击每个对象来选择其他对象。

单击工具栏上的“编写过滤子句”按钮时,将打开“过滤”对话框,此时已选中对话框的“高级”标签,并且在“过滤子句”文本框中装入了反映“数据布局”标签中的选择的过滤子句。

"Inst-Freq" 标签

"Inst-Freq"(即“指令-频率)标签显示计数数据实验中各类指令执行频率的摘要。该标签还显示有关装入、存储和浮点指令的执行频率的数据。此外,该标签还包含有关取消的指令和分支延迟槽中的指令的信息。

“统计数据”标签

“统计数据”标签显示所选的实验和样本的各种系统统计数据的总和。总和后面是所选的每个实验的样本的统计数据。有关显示的统计数据的信息,请参见 getrusage(3C) 和 proc(4) 手册页。

“实验”标签

“实验”标签分为两个面板。上面的面板包含一个树,树中包含所有装入实验中的装入对象和每个装入实验的节点。展开“装入对象”节点时,将显示所有装入对象的列表(附带有关装入对象的处理情况的各种消息)。展开实验节点时,将显示两个区域:"Notes"(说明)区域和 "Info"(信息)区域。

"Notes"(说明)区域显示实验中的所有说明文件的内容。可以通过直接在 "Notes"(说明)区域中键入内容来编辑说明。"Notes"(说明)区域包含其自己的工具栏,其中有用来保存或丢弃说明以及撤消或重做自上次保存以后的所有编辑的按钮。

"Info"(信息)区域包含有关收集的实验以及收集目标访问的装入对象的信息,包括在处理实验或装入对象过程中生成的所有错误消息或警告消息。

底部的面板列出来自分析器会话的错误消息和警告消息。

“索引”标签

每个“索引”标签显示归属于各种索引对象(如线程、Cpu 和秒)的数据的度量值。由于索引对象不是分层结构,因此不显示包含的和独占的度量。对于每一种类型,只显示一个度量。

预定义了多个“索引”标签:线程、CPU、样本和秒。您可以定义定制的索引对象,方法是在“设置数据表示”对话框中单击“添加定制索引标签”按钮,以打开“添加索引对象”对话框。也可以在 .er.rc 文件中使用 indxobj_define 指令来定义索引对象(请参见indxobj_define indxobj_type index_exp)。

使用每个“索引”标签顶部的单选按钮可以选择“文本”显示或“图形”显示。“文本”显示类似于“数据对象”标签中的显示,并且使用同样的度量设置。“图形”显示以图形的形式显示每个索引对象的相关值,每个度量用一个单独的直方图表示,按数据排序度量排序。

单击工具栏中的“过滤数据”按钮时,将打开“过滤数据”对话框。单击“高级”标签,“过滤子句”文本框将装入反映“索引对象”标签中的选择的过滤子句。

“内存对象”标签

每个“内存对象”标签显示归属于各种内存对象(例如页)的数据空间度量的度量值。如果一个或多个装入的实验包含数据空间分析,您可以在“设置数据表示”对话框的“标签”标签中选择要显示其标签的内存对象。可以显示任意数量的“内存对象”标签。

预定义了各种“内存对象”标签。您可以定义定制的内存对象,方法是在“设置数据表示”对话框中单击“添加定制对象”按钮,以打开“添加内存对象”对话框。也可以在 .er.rc 文件中使用 mobj_define 指令来定义内存对象(请参见mobj_define mobj_type index_exp)。

使用每个“内存对象”标签上的单选按钮,可以选择“文本”显示或“图形”显示。“文本”显示类似于“数据对象”标签中的显示,并且使用同样的度量设置。“图形”显示以图形的形式显示每个内存对象的相关值,每个度量用一个单独的直方图表示,按数据排序度量排序。

单击工具栏上的“编写过滤子句”按钮时,将打开“过滤”对话框,此时已选中对话框的“高级”标签,并且在“过滤子句”文本框中装入了反映“内存对象”标签中的选择的过滤子句。

数据显示,右窗格

右窗格包含“MPI 时间线控件”标签、“MPI 图表控件”标签、“摘要”标签、“事件”标签、“争用详细信息”标签、“死锁详细信息”标签以及“泄露”标签。缺省情况下显示“摘要”标签。

“MPI 时间线控件”标签

“MPI 时间线控件”标签支持对“MPI 时间线”标签进行缩放、平移、事件移步和过滤。它包括一个可调整“MPI 时间线”标签上显示的 MPI 消息百分比的控件。

通过过滤,可使得当前视图字段以外的数据不再出现在“MPI 时间线”标签和“MPI 图表”标签中显示的数据集中。单击“过滤器”按钮可应用过滤器。反向过滤器按钮用来撤消上一个过滤器;正向过滤器按钮用来重新应用一个过滤器。“MPI 时间线”标签和“MPI 图表”标签间可共享过滤器,但目前尚不适用于其他标签。

可以调整消息滑块来控制显示消息的百分比。选择小于 100% 时,成本最高的消息具有优先权。“成本”定义为消息的发送和接收功能所用的时间。

“MPI 时间线控件”标签也可用于显示“MPI 时间线”标签的功能或消息选项的详细信息。

“MPI 图表控件”标签

“MPI 图表控件”标签具有一组下拉式列表,可用于控制图表的类型、X 和 Y 轴参数以及用于聚集数据的度量和运算符。单击“重画”将可绘制一个新图形。

通过过滤,可使得当前视图字段以外的数据不再出现在“MPI 时间线”标签和“MPI 图表”标签中显示的数据集中。单击“过滤器”按钮可应用过滤器。反向过滤器按钮用来撤消上一个过滤器;正向过滤器按钮用来重新应用一个过滤器。

“MPI 图表控件”标签也可用于显示“MPI 图表”标签中选项的详细信息。

“摘要”标签

“摘要”标签同时以值和百分比的形式显示所选函数或装入对象的所有记录的度量,此外还显示所选函数或装入对象的信息。无论何时在任何标签中选择了新的函数或装入对象,都将更新“摘要”标签。

“事件”标签

“事件”标签显示“时间线”标签中所选事件的详细数据,包括事件类型、叶函数、LWP ID、线程 ID 以及 CPU ID。数据面板的下方显示调用栈,栈中的每个函数都使用彩色编码。单击调用栈中的某个函数将选中该函数。

“时间线”标签中选中某个样本时,“事件”标签将显示样本编号、样本的开始时间和结束时间、微状态及在每个微状态中所花费的时间和彩色编码。

“泄漏”标签

“泄漏”标签显示“泄漏列表”标签中所选的泄漏或分配的详细数据。在数据面板的下方,“泄漏”标签显示检测到所选的泄漏或分配时的调用栈。单击调用栈中的函数将选中该函数。

“争用详细信息”标签

“争用详细信息”标签显示“争用”标签中所选数据争用的详细数据。有关更多信息,请参见《Oracle Solaris Studio 12.2:线程分析器用户指南》

“死锁详细信息”标签

“死锁详细信息”标签显示“死锁”标签中所选的死锁的详细数据。有关更多信息,请参见《Oracle Solaris Studio 12.2:线程分析器用户指南》

设置数据表示选项

您可以通过“设置数据表示”对话框控制数据的表示。要打开此对话框,请单击工具栏中的“设置数据表示”按钮或选择“视图”->“设置数据表示”。

“设置数据表示”对话框具有一个包含多个标签的窗格,这些标签如下所示:

此对话框中的“确定”按钮应用对当前会话所做的更改并关闭对话框。“应用”按钮应用对当前会话的更改,但保持对话框开启状态以便进行更多更改。

“保存”按钮将包括所有自定义内存对象的当前设置存储到主目录或当前工作目录中的 .er.rc 文件中。保存设置会导致所做更改既应用到将来的分析器会话中又应用到当前会话中。


注 –

.er.rc 文件为分析器、er_print 实用程序和 er_src 实用程序提供缺省设置。保存“设置数据首选项”对话框中的更改时,这些更改将更新对这三款实用程序的输出都有影响的 .er.rc 文件。有关 .er.rc 文件的更多信息,请参见分析器缺省设置


“度量”标签

“度量”标签显示所有可用的度量。每个度量具有多个复选框(在一个或多个列中),复选框标有时间%,具体取决于度量的类型。或者,也可以不设置个别度量,而是通过选中或取消选中对话框最底下一行中的复选框,然后单击“应用于所有度量”按钮,来一次设置所有度量。

“排序”标签

“排序”标签显示所显示的度量的顺序以及度量的排序依据选项。

“源/反汇编”标签

“源/反汇编”标签显示一个复选框列表,您可以使用该列表来选择显示的信息,如下所示:

“格式”标签

“格式”标签提供 C++ 函数名称和 Java 方法名称的长名形式、短名形式或重整名称形式选项。如果选中“将 SO 名称附加到函数名称”复选框,则函数或方法所在的共享对象的名称将会附加到函数名称或方法名称。

此外,“格式”标签还显示用户专家机器“视图模式”选项。“视图模式”设置控制对 Java 实验和 OpenMP 实验的处理。

对于 Java 实验:

对于 OpenMP 实验:

对于所有其他实验,所有三种模式显示同样的数据。

“时间线”标签

“时间线”标签显示以下内容:显示的事件特定数据的类型选项,线程、LWP 或 CPU 事件特定数据的显示,调用栈表示在根或叶的对齐方式,显示的调用栈的级别数。

“搜索路径”标签

利用“搜索路径”标签可以管理用来搜索源文件和目标文件的目录列表。特殊名称 $expts 表示装入的实验;所有其他名称应为文件系统中的路径。

“路径映射”标签

使用“路径映射”标签可以将文件路径的前面部分从一个位置映射到另一个位置。您可以指定一组前缀对:原始前缀和新前缀。这样,对于给定的路径,可将路径从原始前缀映射到新前缀。可以指定多个路径映射,这样将依次尝试每个路径映射以查找文件。

“标签”标签

您可以使用“设置数据表示”对话框的“标签”标签来选择要在分析器窗口中显示的标签。

“标签”标签列出适用于当前实验的标签。标准标签列在左边的列中。“索引”标签列在中间的列中,定义的“内存”标签列在右边的列中。

在左边的列中,单击复选框可以选择或取消选择显示标准标签。

在中间的列中,单击复选框可以选择或取消选择显示“索引”标签。预定义的“索引”标签为“线程”、"CPU"、“样本”和“秒”。要添加其他索引对象的标签,请单击“添加定制索引标签”按钮以打开“添加索引对象”对话框。在“对象名称”文本框中,键入新对象的名称。在“公式”文本框中,键入用来将记录的物理地址或虚拟地址映射到对象索引的索引表达式。有关索引表达式规则的信息,请参见indxobj_define indxobj_type index_exp

在右边的列中,单击复选框可以选择或取消选择显示“内存对象”标签。要添加定制对象,请单击“添加定制对象”按钮以打开“添加内存对象”对话框。在“对象名称”文本框中,键入新定制内存对象的名称。在“公式”文本框中,键入用来将记录的物理地址或虚拟地址映射到对象索引的索引表达式。有关索引表达式规则的信息,请参见mobj_define mobj_type index_exp

添加定制索引对象或内存对象后,将会向“标签”标签中添加该对象的复选框,缺省情况下,该复选框是选中的。

查找文本和数据

分析器具有可通过工具栏访问的“查找”工具,该工具在下拉式列表中提供了两个用于搜索给定目标的选项。您可以在“函数”标签或“调用者与被调用者”标签的“名称”列以及“源”标签和“反汇编”标签的“代码”列中搜索文本。您可以在“源”标签和“反汇编”标签中搜索高度量项。包含高度量项的行上的度量值以绿色突出显示。使用“查找”字段旁边的箭头按钮可以向上或向下搜索。

显示或隐藏函数

缺省情况下,“函数”标签和“调用者与被调用者”标签中显示每个装入对象中的所有函数。您可以使用“显示/隐藏/仅 API 函数”对话框来隐藏装入对象中的所有函数,或仅显示表示装入对象中 API 的函数;有关详细信息,请参见联机帮助。

隐藏装入对象中的函数时,“函数”标签和“调用者与被调用者”标签显示表示来自装入对象中的所有函数的聚集的单个条目。同样,“行”标签和 "PC" 标签也显示聚集了装入对象所有函数中 PC 的单个条目。

仅显示装入对象中的 API 函数时,会仅显示表示库中调用的函数,这些函数下面的所有调用(包括回调)都不会显示,无论是在该装入对象中还是在其他装入对象中都是如此。“调用者与被调用者”标签将永不显示此类函数的被调用者。

可以在 .er.rc 文件中使用命令对装入对象的设置进行预设。

同过滤相比,与隐藏的函数对应的度量仍在所有显示中以某种形式表示。

过滤数据

缺省情况下,所有实验、所有样本、所有线程、所有 LWP 和所有 CPU 的数据全部显示在每个标签中。可以使用“过滤数据”对话框选择数据的某个子集。

“过滤数据”对话框中有一个“简单”标签和一个“高级”标签。

有关使用“过滤数据”对话框的详细信息,请参阅联机帮助。

此处所述的过滤器独立于“MPI 时间线控件”标签“MPI 图表控件”标签中所述的 MPI 过滤。这些过滤器不会影响“MPI 时间线”标签和“MPI 图表”标签。

“简单”标签

在“简单”标签中,您可以选择您要过滤其数据的实验。然后,您可指定您要显示其度量的样本、线程、LWP 和 CPU。通过单击实验或使用“全选”、“全部清除”或“反向”按钮,可以从“实验”列表中选择一个或多个实验。然后可以使用文本框更改针对这些实验显示的数据。可以同时应用所有这三个过滤器,但在解释由多个 CPU、线程和 LWP 过滤的数据时应该小心。可使用“全部启用”、“启用选定项”、“全部禁用”和“禁用选定项”按钮来启用或禁用实验的数据显示。

实验选择

装入多个实验时,分析器允许按实验过滤。实验可以单个装入,也可以通过指定实验组来装入。

样本选择

样本从 1 到 N 进行编号,您可以选择样本的任意集合。选择包含逗号分隔的样本编号或范围(例如 1–5)列表。

线程选择

线程从 1 到 N 进行编号,您可以选择线程的任意集合。选择包含逗号分隔的线程编号或范围列表。线程的分析数据仅涵盖运行中 LWP 实际调度线程的部分。

LWP 选择

LWP 从 1 到 N 进行编号,您可以选择 LWP 的任意集合。选择包含逗号分隔的 LWP 编号或范围列表。如果记录了同步数据,则报告的 LWP 是同步事件入口处的 LWP,可能与同步事件出口处的 LWP 不同。

在 Linux 系统中,线程和 LWP 同义。

CPU 选择

如果记录 CPU 信息 (Solaris OS),可以选择 CPU 的任意集合。选择包含逗号分隔的 CPU 编号或范围列表。

“高级”标签

在“高级”标签中,您可以指定针对您要在显示中包括的任何数据记录值为真的过滤表达式。有关在过滤表达式中使用的语法的信息,请参见表达式语法

要显示“高级”标签,请单击工具栏上最右侧的按钮,或者在打开的“过滤”对话框中单击该标签。

“高级”标签包含一个标头和一个过滤器规范文本框。标头中有一个文本只读字段(用来输入过滤子句)和可附加 AND、OR 或者可为该子句设置过滤的按钮。装入该字段的内容即可从“函数”标签、“数据对象”标签、“数据布局”标签或任何“内存对象”标签中反映所有单个选择或多个选择。单击其中某一按钮时,该选择会转换成一个子句,然后被添加到过滤器规范或替换过滤器规范。

通过向过滤器规范字段中输入文本或者通过添加子句编写过滤器后,单击“确定”或“应用”以设置过滤器。

如果未正确指定过滤器,系统将发布错误并保留旧的过滤设置。

从分析器记录实验

使用目标名称和目标参数调用分析器时,分析器将启动并打开“Oracle Solaris Studio 性能收集”窗口,利用该窗口,可以在指定的目标上记录实验。如果调用分析器时没有指定参数或指定了实验列表,您可以通过选择“文件”->“收集实验”打开“收集”窗口以记录新的实验。

“收集”窗口的“收集实验”标签有一个面板,您可以使用该面板指定目标、其参数以及用于运行实验的各种参数。面板中的选项对应于 collect 命令中提供的选项,如第 3 章中所述。

紧靠面板下方是一个“预览命令”按钮和一个文本字段。单击该按钮时,将在文本字段中填入单击“运行”按钮时使用的 collect 命令。

在“要收集的数据”标签中,您可以选择要收集的数据的类型。

“输入/输出”标签有两个面板:一个接收收集器自身的输出,另一个用于接收进程的输出。

利用一组按钮,可以执行以下操作:

如果关闭窗口时有实验正在运行,该实验将继续运行。重新打开窗口时,将显示运行中的实验,就像在运行过程中它一直保持打开一样。如果尝试退出分析器时有实验正在运行,则会打开一个对话框,询问是终止运行还是允许继续运行。

分析器缺省设置

分析器中的缺省设置通过 .er.rc 缺省文件进行控制。分析器按以下顺序处理来自数个文件的指令:

最后处理的设置具有优先级。当前目录中的 .er.rc 设置优先于主目录中的 .er.rc 设置,后者又优先于系统范围文件版本中的 .er.rc 设置。

在性能分析器中,可以通过单击“设置数据显示”对话框(可通过“视图”菜单打开)中的“保存”按钮来创建和更新 .er.rc 文件。通过“设置数据表示”对话框保存 .er.rc 文件不仅影响后续的分析器调用,也会影响 er_print 实用程序和 er_src 实用程序。

.er.rc 文件中的设置

.er.rc 文件所包含设置可以执行以下操作:

有关可以在 .er.rc 文件中使用的命令的详细信息,请参见设置缺省值的命令仅为性能分析器设置缺省值的命令

比较实验

可以在分析器中同时装入多个实验或实验组。缺省情况下,在装入同一个可执行文件上的多个实验时,数据将聚集并呈现为好像其为一个实验。同时还可以分别查看数据,从而比较实验中的数据。

要比较分析器中的两个实验,可以以常规方式打开第一个实验,然后选择“文件”>“添加实验”装入第二个实验。要比较它们,请在支持比较的标签中右键单击并选择“比较实验”。

支持比较实验的标签有“函数”、“调用方与被调用方”、“源”、“反编译”、“行”和 PC。在比较模式下,实验或组中的数据在这些标签上以相邻列显示。这些列按装入实验或组的顺序显示,同时带有一个给出实验或组名称的附加标题行。

启用比较模式

缺省情况下,可以通过在 .er.rc 文件中设置 compare on 来启用比较模式。或者,可以在分析器的“设置数据显示”对话框中启用比较模式,方法是在“格式”标签中选择“比较实验”选项。

此外,还可以使用 er_print compare 命令比较实验。有关更多信息,请参见compare { on | off }