Sun Studio 12:性能分析器

第 5 章 内核分析

本章介绍如何在 Solaris OS 运行负载时使用 Sun Studio 性能工具分析内核。如果在 Solaris 10 OS 上运行 Sun Studio 软件,则可以进行内核分析。在 Solaris 9 OS 和 Linux 系统上可进行内核分析。

内核实验

可以使用 er_kernel 实用程序记录内核分析数据。

er_kernel 实用程序使用 DTrace 驱动程序,该驱动程序是 Solaris OS 中内置的综合动态跟踪工具。

er_kernel 实用程序捕获内核分析数据,并以与用户分析数据相同的格式将数据记录为分析器实验。实验可以由 er_print 实用程序或性能分析器进行处理。内核实验可以显示函数数据、调用者-被调用者数据、指令级数据和时间线,但是不能显示源代码行数据(因为大多数 Solaris OS 模块不包含行号表)。

为内核分析设置系统

您需要先设置对 DTrace 驱动程序的访问,才能使用 er_kernel 实用程序进行内核分析。

通常,DTrace 驱动器仅限于用户 root 使用。要以 root 之外的用户身份运行 er_kernel 实用程序,必须具有分配的特定权限,而且是组 sys 的成员。要分配必要的权限,请将以下行添加到文件 /etc/user_attr 中:


username::::defaultpriv=basic,dtrace_kernel,dtrace_proc

要将您自己添加到组 sys,请将您的用户名添加到文件 /etc/group 中的 sys 行。

运行 er_kernel 实用程序

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

Procedure分析内核

  1. 通过键入以下内容来收集实验:


    % er_kernel -p on
    
  2. 在单独的 shell 中运行所需的任意负载。

  3. 负载完成后,按 Ctrl-C 来终止 er_kernel 实用程序

  4. 将生成的实验(缺省情况下名为 ktest.1.er)加载到性能分析器或 er_print 实用程序中。

    内核时钟分析将生成一个标有“KCPU 周期”的性能度量。在性能分析器中,对于“函数”标签中的内核函数 、“调用者-被调用者”标签中的调用者与被调用者以及“反汇编”标签中的指令,将显示该性能度量。“源”标签不显示数据,因为附带的内核模块通常不包含文件和行符号表信息 (stab)。

    您可以将 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 指定为用连字符分隔的两个这样的数字,这会导致数据收集暂停,直到经过第一个时间之后才开始收集数据。当到达第二个时间时,数据收集终止。如果第二个数字为零,则在初次暂停之后收集数据,直到该程序运行结束。即使该实验已经终止,也允许目标进程运行至结束。

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

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

Procedure在有负载时的分析

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

  1. 通过键入以下内容来收集实验:


    % er_kernel -p on load
    
  2. 通过键入以下内容来分析实验:


    % analyzer ktest.1.er
    

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

Procedure一起分析内核和负载

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

  1. 通过键入 er_kernel 命令和 collect 命令,同时收集内核分析数据和用户分析数据:


    % er_kernel collect load
    
  2. 通过键入以下内容一起分析这两个分析数据:


    % analyzer ktest.1.er test.1.er
    

    分析器显示的数据同时显示 ktest.1.er 中的内核分析数据和 test.1.er 中的用户分析数据。时间线允许您查看两个实验之间的相关性。


    注 –

    要将脚本用作负载,并分析其各个部分,请使用相应的参数在脚本内的不同命令前放置 collect 命令。


分析特定的进程或内核线程

您可以通过一个或多个 -T 参数来调用 er_kernel 实用程序,以指定分析特定的进程或线程:

在为目标线程调用 er_kernel 实用程序之前,必须已经创建了目标线程。

如果指定一个或多个 -T 参数,将生成标有 Kthr Time 的附加度量。并为分析的所有线程捕获数据,而不管是否在 CPU 上运行。特殊的单帧调用栈用于指示进程是已挂起(函数 <SLEEPING>)还是正在等待 CPU (函数 <STALLED> )。

Kthr Time 度量高、但 KCPU 周期度量低的函数,是为已分析的线程花费很长时间等待某些其他事件的函数。

分析内核分析数据

内核实验中记录的几个字段与用户模式实验中相同字段的含义不同。用户模式实验仅包含单个进程 ID 的数据;而内核实验的数据可能适用于许多不同进程 ID。分析器中一些字段标签在这两种类型的实验中所具有的不同含义,可以在下表中更好地表示出来:

表 5–1 分析器中内核实验的字段标签含义

分析器标签 

用户模式实验中的含义 

内核实验中的含义 

LWP 

用户进程 LWP ID 

进程 PID;0 表示内核线程 

线程 

进程内的线程 ID 

内核 TID;内核 DID 表示内核线程 

例如,在内核实验中,如果希望仅过滤几个进程 ID,请在“过滤数据”对话框的“LWP 过滤器”字段中输入感兴趣的 PID。