JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:性能分析器     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  性能分析器概述

2.  性能数据

3.  收集性能数据

4.  性能分析器工具

5.  er_print 命令行性能分析工具

6.  了解性能分析器及其数据

7.  了解带注释的源代码和反汇编数据

8.  操作实验

9.  内核分析

内核实验

为内核分析设置系统

运行 er_kernel 实用程序

分析内核

在有负载时的分析

一起分析内核和负载

硬件计数器溢出的内核分析

分析内核和用户进程

分析内核分析数据

索引

运行 er_kernel 实用程序

您可以运行 er_kernel 实用程序,以便仅分析内核或同时分析内核和正在运行的负载。有关 er_kernel 命令的完整描述,请参见 er_kernel (1) 手册页。

要显示用法消息,请运行不带参数的 er_kernel 命令。

分析内核

  1. 通过键入以下内容来收集实验:
    % er_kernel -p on
  2. 在单独的 shell 中运行所需的任意负载。
  3. 负载完成后,按 Ctrl-C 来终止 er_kernel 实用程序
  4. 将生成的实验(缺省情况下名为 ktest.1.er)装入到性能分析器或 er_print 实用程序中。

    内核时钟分析将生成两个度量:一个是 KCPU 周期(度量名称为 kcycles),该度量用于在内核创建者实验中记录的时钟分析事件;另一个是 KUCPU 周期(度量名称为 kucycles),该度量用于当 CPU 处于用户模式时在用户进程子实验中记录的时钟分析事件。在性能分析器中,对于 "Functions"(函数)标签中的内核函数、"Callers-Callees"(调用方-被调用方)标签中的调用方与被调用方以及 "Disassembly"(反汇编)标签中的指令,将显示这些度量。"Source"(源)标签不显示数据,因为附带的内核模块通常不包含文件和行符号表信息 (stabs)。

    您可以将 er_kernel 实用程序的 -p on 参数替换为 -p high(用于高精度分析)或 -p low(用于低精度分析)。如果期望用 2 到 20 分钟来运行负载,则缺省时钟分析是合适的。如果期望用不到 2 分钟的时间来运行,请使用 -p high;如果期望用 20 分钟以上的时间来运行,请使用 -p low

    您可以添加 -t duration 参数,该参数将导致 er_kernel 实用程序按 duration 所指定的时间自行终止。

    可以将 -t duration 指定为一个具有可选的 ms 后缀的数字,以指示实验应终止的时间(以分钟或秒为单位)。缺省情况下,持续时间以秒为单位。也可以将 duration 指定为用连字符分隔的两个这样的数字,这会导致数据收集暂停,直到经过第一个时间之后才开始收集数据。当到达第二个时间时,数据收集终止。如果第二个数字为零,则在初次暂停之后收集数据,直到该程序运行结束。即使该实验已经终止,也允许目标进程运行至结束。

    如果未指定任何持续时间或时间间隔,在终止之前,er_kernel 将一直运行。可以通过按 Ctrl-C (SIGINT),或者使用 kill 命令并将 SIGINTSIGQUITSIGTERM 发送到 er_kernel 进程终止该实用程序。将其中任何一个信号发送到 er_kernel 时,该进程将终止实验并运行 er_archiv(除非指定了 -A off)。er_archive 实用程序会读取实验中引用的共享对象列表,并为每个共享对象构造一个归档文件。

    如果您希望在屏幕上输出有关运行的更多信息,可以添加 -v 参数。通过 -n 参数,您可以预览将被记录的实验,而无需实际记录任何内容。

    缺省情况下,由 er_kernel 实用程序生成的实验被命名为 ktest.1.er;对于相继的运行,该数字将递增。

在有负载时的分析

如果有要用作负载的单个命令(程序或脚本):

  1. 通过键入以下内容来收集实验:
    % er_kernel -p on load

    如果负载是一个脚本,则该脚本在退出之前,应等待它所产生的任何命令终止,否则实验可能会过早终止。

  2. 通过键入以下内容来分析实验:
    % analyzer ktest.1.er

    er_kernel 实用程序派生一个子进程,并暂停一个静止期,然后子进程会运行指定的负载。在负载终止时,er_kernel 实用程序再次暂停一个静止期,然后退出。实验显示运行负载期间以及之前和之后的静止期内 Oracle Solaris 内核的行为。您可以使用 er_kernel 命令的 -q 参数,以秒为单位指定静止期的持续时间。

一起分析内核和负载

如果有要用作负载的单个程序,并希望同时看到该负载的分析数据和内核分析数据:

  1. 通过键入 er_kernel 命令和 collect 命令,同时收集内核分析数据和用户分析数据:
    % er_kernel collect load
  2. 通过键入以下内容一起分析这两个分析数据:
    % analyzer ktest.1.er test.1.er

    分析器显示的数据同时显示 ktest.1.er 中的内核分析数据和 test.1.er 中的用户分析数据。使用 "Timeline"(时间线)标签可以查看两个实验之间的相关性。


    注 - 要将脚本用作负载,并单独分析脚本的各个部分,请在脚本内的各个命令前放置 collect 命令(带有适当的参数)。


硬件计数器溢出的内核分析

er_kernel 实用程序可以使用 DTrace cpc 提供者(仅在运行 Oracle Solaris 11 的系统上可用)为内核收集硬件计数器溢出分析。

就如使用 collect 命令一样,可以使用 er_kernel 命令的 -h 选项来执行内核的硬件计数器溢出分析。不过,不支持数据空间分析,因此 er_kernel 会忽略数据空间请求。

collect 命令一样,如果使用 -h 选项,但未明确指定 -p 选项,则将禁用基于时钟的分析。要同时收集硬件计数器数据和基于时钟的数据,必须指定 -h 选项和 -p 选项。

要显示处理器支持硬件计数器溢出分析的计算机上的硬件计数器,请运行不带任何其他参数的 er_kernel ——h 命令。

如果芯片上的溢出机制使内核能够指明哪个计数器发生溢出,则可以分析芯片提供的任意多个计数器;否则只能指定一个计数器。er_kernel ——h 输出中将显示一条诸如 "specify HW counter profiling for up to 4 HW counters."(为多达 4 个 HW 计数器指定 HW 计数器分析。)这样的消息,指定您是否可以使用多个计数器。

系统硬件计数器机制可以由多个进程用于执行用户分析;但如果任何用户进程、cputrack 实用程序或另一个 er_kernel 进程正在使用该机制,则不能用于内核分析。如果另一个进程正在使用硬件计数器,则 er_kernel 将报告 "HW counter profiling is not supported on this system"(该系统不支持 HW 计数器分析)。

有关硬件计数器分析的更多信息,请参见硬件计数器溢出分析数据-h counter_definition_1...[, counter_definition_n]

另请参见 er_print 手册页,了解硬件计数器溢出分析的更多信息。

分析内核和用户进程

使用 er_kernel 实用程序可以执行内核和应用程序的分析。可以使用 -F 选项控制是否应跟踪应用程序进程并记录这些进程的数据。

使用 -F on-F all 选项时,er_kernel 将记录所有应用程序进程以及内核上的实验。将跟踪在收集 er_kernel 实验时检测到的用户进程,并且为每个跟踪的进程创建一个子实验。

如果您以非超级用户的身份运行 er_kernel,则可能不会记录许多子实验,因为不享有权限的用户通常无法读取有关其他用户进程的任何内容。

假定有足够的权限,那么用户进程数据也只在进程处于用户模式时才记录,并且只记录用户调用堆栈。每个跟踪的进程的子实验包含 kucycles 度量的数据。子实验使用 _ process-name_PID_process-pid.1.er 格式进行命名。例如,某个在 sshd 进程上运行的实验的名称可能为 _sshd_PID_1264.1.er

要只跟踪某些用户进程,可以使用 -F =regexp 指定正则表达式,以便记录名称或 PID 与正则表达式匹配的进程上的实验。

例如,er_kernel -F =synprog 将跟踪名为 synprog 的程序的进程。

有关正则表达式的信息,请参见 regexp(5) 手册页。

缺省情况下设置 -F off 选项,这样 er_kernel 不会执行用户进程分析。


注 - er_kernel-F 选项不同于 collect-F 选项。collect ——F 命令用于只跟踪那些由命令行中指定的目标创建的进程;而 er_kernel ——F 用于跟踪当前在系统上运行的所有进程。