2004 年 5 月 27 日更新

Sun Studio 9:性能分析器自述文件

目录

  1. 简介
  2. 从 IDE 启动性能分析器
  3. 关于 Sun Studio 9:C 编译器性能分析器
  4. 新特性和更改的特性
  5. 软件更正
  6. 问题和解决办法
  7. 限制和不兼容
  8. 文档错误
  9. 必要的补丁程序

 


A. 简介

本文档包含有关 SunTM Studio 9 的相关信息:性能分析器及其随附分析工具的相关信息。性能分析器和分析工具包括用于收集和操作程序性能数据的命令、一个图形用户界面,以及用来显示性能数据的命令行接口 er_print。本文档中使用的术语“收集器”是指用于收集性能数据及其基础库的工具。这些工具指 collect 命令、dbx collector 子命令以及 IDE 中的性能数据收集功能。

本文档描述了此发行版本中引入的新功能和软件更正,并列出了已知的问题、限制和不兼容性。本文档中的信息更新和扩展了软件手册中的信息。

对于 Sun Studio 9 版本,性能分析器需要有许可证。可以使用 snit 命令运行 [序列号安装工具] 来 安装本软件的序列号许可证。有关详细信息,参见 snit(1) 手册页。

产品文档

注意—如果 Sun Studio 9 编译器和工具未安装在缺省 /opt 目录中,请询问系统管理员以获得系统中的等价路径。

 


B. 从 IDE 启动性能分析器

要从 IDE 中启动 [性能分析器],请执行以下某一操作:

要从 IDE 中打开 [收集器] 窗口,请执行以下操作之一:

 


C. 关于 Sun Studio 9:性能分析器性能分析器

本发行版的 Sun Studio 9:性能分析器适用于下列操作系统:

程序性能分析工具收集程序性能的统计分析文件,跟踪对关键库例程的调用并以表格和图形方式显示数据。收集的数据将被转换成性能度量。可以在加载对象级、函数级、源代码行级或指令级以表格方式查看度量。这些工具提供浏览程序结构的方式,可用于在导致资源占用、低效率或时间延迟的代码中标识函数和路径。性能分析器 GUI 还可在时间线显示中显示性能数据。

此发行版本的性能分析器收集器允许利用 Java 虚拟机 (JVM)中的基础支持,对用 JavaTM 编程语言编写的应用程序进行分析。2003 年 10 月发行的 JVMTM 软件版本 1.4.2_02 中包含该支持。该支持在以后的 JVM 版本中可能更改。如果利用更高的 JVM 版本使用此版本的性能分析器收集器,则该收集器有可能无法收集用 Java 编程语言编写的应用程序的分析信息。Sun 公司希望以后的性能分析器收集器的发行版本能够在 JVM 分析技术 日益更新的情形下仍支持 Java 分析。

 


D. 新增和更改的功能

本节描述了本发行版本性能分析器的新功能和更改功能。

注意—如果 Sun Studio 9 编译器和工具未安装在缺省 /opt 目录,请询问系统管理员以了解系统中的实际安装路径。

  1. 新建 Linux 分发系统
  2. 数据空间分析
  3. 子孙进程
  4. 数据收集输出重定向
  5. 分析器命令行参数
  6. 新建分析器 API 共享库软件包
  7. 说明文件支持 Collect 命令
  8. 在实验预览和实验标题中的说明
  9. 增强的源和反汇编显示
  10. 增强的 er_src 命令
  11. Java 方法签名
  12. 处理堆跟踪时的 mmap 调用
  1. 新建 Linux 分发系统

    现在可以在 Sun Studio 9 for Linux 中使用性能分析器,但是 Sun Studio 9 for Solaris 除外。支持下列 Linux 操作系统:

    • Java Desktop System 1.0
    • SuSE Linux Enterprise Server 8
    • RedHat Enterprise Linux 3
    在这两个操作系统上可用的公用程序相同,不同之处在于 Linux 发布系统中不包含 er_kernel。collect 命令在 Linux 上具有更多限制。只有基于时钟的分析和堆跟踪才可用;有关详细信息,请参见收集手册页。在 Linux 之下可以进行多线程应用程序的分析,但是目前在 Linux 操作系统的 RedHat 版本之下进行分析时,会出现很高的数据偏差。

  2. 数据空间分析

    数据空间分析现在适用于用于 SPARC 平台的 C 程序。数据空间配置文件是与内存相关的事件的数据集合,如缓存未命中将报告造成事件的数据对象引用,而不仅仅是发生内存相关事件的指令。

    数据空间分析的分析信息将显示在命令行或分析器 GUI 中,如下所示:

    • er_print 命令拥有三个与数据空间分析相关的新选项中:data_objectsdata_osingledata_olayout
    • 分析器现在包含两个与数据空间分析相关的标签,分别标记为“数据对象”和“数据布局”。如果数据空间分析出现在实验中,则将自动显示这些标签。

    有关详细信息,请参见 analyzer(1)、collect(1) 和 er_print(1) 手册页。

  3. 子孙进程

    后代进程的记录已获得增强,包含记录所有后代进程的能力,而不仅仅是使用 forkexec 命令及其变量创建进程。为了支持增强的功能,collect -F 命令现在拥有一个新选项:collect -F all。由 F all 而非 F on 处理的后代(如 system 调用),名称中带有代码字母“c”。

    可以明确选择要通过命令行公用程序 er_print 或分析器 GUI 显示的后代进程的数据。

    有关详细信息,请参见 collect(1) 手册页。

  4. 数据收集输出重定向

    collect 命令拥有一个新选项 collect -O 文件,使用该选项可以将 collect 的所有输出重定向到名为文件的文件。该命令不能从产生的目标重定向输出。

  5. 分析器命令行参数

    分析器命令(启动脚本)现在接受对长参数使用双破折号,比如 --jdkhome--fontsize

  6. 新建分析器 API 共享库软件包

    分析器 API 的共享库已放入单独的软件包中,因此可以独立而自由的进行分发。

  7. 说明文件支持 Collect 命令

    collect 命令拥有一个新的命令行选项:collect -C 注释。注释将添加到实验的说明文件中。最多可以应用 10 个 -C 参数。

  8. 在实验预览和实验标题中的说明

    实验预览和实验标题将显示实验中任何说明文件的内容。

  9. 增强的源和反汇编显示

    带注释的源代码和反汇编已经对替代源上下文代码的处理方式进行了改进。以红色斜体显示的索引行表示从另一个文件的什么位置插入代码。使用 [源] 标签,在索引行上单击鼠标即可在替代源文件中打开源窗口。

  10. 增强的 er_src 命令

    命令行公用程序 er_src 现在可以显示一个函数列表、处理 Java .class 文件,以及通过替代源上下文显示源代码和反汇编。

  11. Java 方法签名

    Java 长名称格式显示完整的方法签名,而不仅仅是单独的函数名称。

  12. 处理堆跟踪时的 mmap 调用

    在进行堆跟踪时,对 mmap 的调用将被视为内存分配。

 


E. 软件更正

下列错误已被更正。

  1. 以中文区域设置查看分析器联机帮助时抛出的异常。
  2. 在中文区域设置中,当在分析器中打开实验时发生核心转储。
  3. SISEGV error in liber_dbe.so 当 Java 实验使用 -j off 和过滤运行时,在 liber_dbe.so 中出现 SISEGV 错误。
  4. 分段重新装入 libjvm 将造成段重叠警告和“未知”警告。
  5. 难以理解子孙进程的消息。
  6. 截断展开的栈时,性能分析器和 er_print 不进行指示。
  7. 除非首先给出 data_objectsdata_olayout 命令,否则 data_osingle 命令不识别结构名。
  8. 除非可访问原始对象或使用 -A copy 将原始对象归档,否则反汇编列表不能正确解析针对其符号名的调用。
  9. .

 

 


F. 问题和解决办法

本节讨论了已知的软件问题及其可能的解决方法。有关更新信息,请查看开发人员门户中的信息,网址:http://developers.sun.com/prodtech/cc/support_index.html

某些问题是由于 Solaris 操作系统错误而产生的,可通过安装相应的补丁程序进行修复。更多信息请参见此自述文件中的必要的补丁程序部分。某些在性能分析器中出现的错误实际上是收集器的错误。编译器和 dbx 中的错误也会影响性能分析器。本部分还介绍了某些并非由于错误而导致的问题。

性能工具的错误
  1. 没有最新的 Java 虚拟机,Java 分析可能崩溃。

  2. Java 同步跟踪和堆跟踪可能会有性能问题。

  3. dbx 下不支持 Java 分析。

  4. 在不同操作期间 Java 分析可能丢失数据。

  5. 无法打印 [汇总] 标签或 [事件] 标签的数据。

  6. 对于并行指令行重复计算度量

  7. 并不总是更新颜色选择器图例面板

  8. er_print 公用程序查找到太多给定名称的函数

  9. 具有不同体系结构的库在归档时可能无法正确处理

  10. 无法从单个 dbx 会话运行多个实验。

 

  1. 没有最新的 Java 虚拟机,Java 分析可能崩溃。

    使用 1.4.2_02 版之前 JVM 机进行的 Java 分析可能会因 JVM 软件中的错误而导致失败。在使用 1.4.2_02 版之前 JVM 机的 Intel 平台上进行 Java 分析总是失败,如果使用较早的 JVM,会在实验中写入一条警告消息。(Java 编程语言错误 4757672、4762958、4763610、4808151、4812196、4505739)

  2. Java 同步跟踪和堆跟踪可能会有性能问题。

    Java 同步跟踪和堆跟踪可能会有性能问题,特别是在处理使用堆跟踪 的大型实验时。

  3. dbx 下不支持 Java 分析。

    因为 JVM 软件无法支持调试代理和分析代理,所以不支持使用 dbx 收集器或 Sun Studio IDE 中的收集器图形界面进行 Java 分析。 (4771337)

  4. 在不同操作期间 Java 分析可能丢失数据。

    在收集垃圾数据、调用 system.* 方法、监视器等待期间或其他时间内,数据收集可能会丢失数据。JVM 软件在上述时间内不展开 Java 栈。此时,事件归属于人造函数 <no java callstack recorded>。 (4824989, 4762954)

  5. 无法打印 [汇总] 标签或 [事件] 标签的数据。

    性能分析器无法打印摘要标签或事件标签中的数据。要打印函数或加载对象的摘要数据,可以使用 er_print 命令。 (4286674)

  6. 对于并行指令行重复计算度量

    在并行性编译器指令行中以注释的源代码形式报告的度量被重复计算。源代码中的并行 do、for 或代码段程序块的度量是正确的。在函数级也存在一些重复计数错误。 (4656193)

  7. 并不总是更新颜色选择器图例面板

    更改颜色后并不总是更新颜色选择器图例面板。颜色选择器图例面板不能与[泄漏列表]标签正确交互作用。 (4948522, 4825896)

  8. er_print 公用程序查找到太多给定名称的函数

    er_print 公用程序在源代码和反汇编列表中显示太多的给定名称函数。 (5033124)

  9. 具有不同体系结构的库在归档时可能无法正确处理

    具有相同名称但体系结构不同的库在使用 collect -A copy 命令时无法正确复制。 (4970739)

  10. 无法从单个 dbx 会话运行多个实验。

    尝试从单个 dbx 会话运行多个实验失败。 (4999242)

 

Linux 特定的性能工具错误
  1. 从并行线程的 MP 分析少计数据

  2. Java 分析不显示 JVM 的反代码化名称

  3. Sample Data for MP Programs May Be Incorrect

 

  1. 从并行线程的 MP 分析少计数据

    在 Linux 的 Red Hat 和 SUSE 版本上会出现此问题。 (5020387)

  2. Java 分析不显示 JVM 的反代码化名称

    当用不支持的工具 GNU 2.x 生成 JVM 1.4.2_02 和 JVM 以后的 1.4.x 版本时出现此问题。(无错误编号)

  3. MP 程序的示例数据可能错误

    CPU 时间可能与示例时间不一致。 (5025963)

 

使用 Solaris 操作系统修补程序可以更正的问题

下列错误可通过在 Solaris 操作系统中安装相应的补丁程序进行修复。更多信息请参见此自述文件中的必要的补丁程序部分。

  1. 硬件计数器分析期间的应用程序崩溃

  2. LWP 的基于时钟的配置数据丢失

  3. 硬件计数器分析中断丢失

  4. 已装入系统的基于时钟的配置不准确

 

  1. 硬件计数器分析期间的应用程序崩溃

    某些情况下,HW 计数器分析中断会在 UltraSPARC-III 处理器上触发操作系统错误,它可导致 %y 寄存器被破坏。如果此时寄存器处于活动状态,则应用程序可能崩溃。这一问题在 Solaris 8 操作系统 的 HW2 update 和 Solaris 9 操作系统的 update 4 中已被更正。通过较低分辨率的分析和/或使用单个计数器,该问题的发生频率被降低了。 (4793905)

  2. LWP 的基于时钟的配置数据丢失

    在某些情况下,一个或多个 LWP 的分析中断 (SIGPROF) 可能丢失。 解决办法是使用绑定线程,或者如果当前运行在 Solaris 8 操作系统中,可使用 /usr/lib/lwp 中的替代线程库。替代线程库使用绑定线程,即使在支持非绑定线程 API 中亦如此。 (4352643)

  3. 硬件计数器分析中断丢失

    当程序使用非绑定线程运行时,由于硬件计数器上溢而导致的中断 (SIGEMT) 有时会丢失并且无法恢复。解决办法是使用绑定线程,或者如果当前运行在 Solaris 8 操作系统中,可使用 /usr/lib/lwp 中的替代线程库。替代线程库使用绑定线程,即使在支持非绑定线程 API 中亦如此。 (4352643)

  4. 已装入系统的基于时钟的配置不准确

    在系统承受负载时,对应用程序进行分析可导致明显少计用户 CPU 时间,最多可达 20%。缺少的“用户 CPU”时间显示为“系统 CPU”时间或“等待 CPU”时间。 (4509116)

 

其他问题
  1. 安装信号处理程序的应用程序的变化行为

  2. dbx 连接到进程时发生数据收集问题

  3. 统计数据显示和抽样 [等待 CPU] 量度的错误值

  4. 短时间周期内的时钟分析数据丢失

  5. 堆栈溢出造成的数据收集中止。

  6. 程序调用 exec 后未完成实验。

  7. 尾调用优化时显示虚假递归。

  8. 概要函数优化时显示虚假递归。

  9. java.util.prefs.FileSystemPreferences 警告消息的解决办法。

  10. 应用程序因在多个共享对象中的多个 libmtsk.a 而死锁。

 

  1. 安装信号处理程序的应用程序的变化行为

    在安装信号处理程序的应用程序上收集性能数据会导致收集器或应用程序的行为改变。在检测位置,收集器库将在实验中记录一条警告消息。

    当预加载收集器库时,收集器的信号处理程序总是将其本身作为主处理程序而重新安装,并将不使用的信号传递给其他任何处理程序。但是,由于它不中断系统调用,安装真正中断系统调用的信号处理程序的应用程序会显示改变的行为。对于异步 I/O 库 libaio.so(使用 SIGPROF 进行异步取消操作),异步取消请求在稍后到达。 (4397578)

    如果将 dbx 连接到应用程序而没有预加载收集器库,则在启用收集时,收集器会将其信号处理程序安装为主处理程序。不过,任何随后安装的信号处理程序均会优先于收集器信号处理程序。如果此信号处理程序没有将 SIGPROFSIGEMT 信号传递到收集器的信号处理程序,则分析数据将丢失。

  2. dbx 连接到进程时发生数据收集问题

    如果将 dbx 连接到一个正在运行的进程而没有预加载收集器库 libcollector.so,可能出现多个错误。

    • 无法收集任何跟踪数据:同步等待跟踪、堆跟踪或 MPI 跟踪。跟踪数据是通过对各个库进行插入操作而收集的。如果未预加载 libcollector.so,则无法执行插入操作。

    • 如果程序在 dbx 连接到进程后安装信号处理程序,并且该信号处理程序不传递 SIGPROFSIGEMT 信号,分析数据和抽样数据将丢失。 (4397578)

    • 如果程序使用异步 I/O 库 libaio.so,基于时钟的分析数据和抽样数据将丢失,因为 libaio.so 会使用 SIGPROF 执行异步取消操作。

    • 如果程序使用硬件计数器库 libcpc.so,则硬件计数器上溢分析实验将会被破坏,因为收集器和程序都在使用该库。如果在将 dbx 连接到进程后加载硬件计数器库,则只要通过广义搜索而不是在 libcpc.so 中搜索来解析对 libcpc 库函数的引用,硬件计数器实验就能顺利进行。

    • 如果程序调用 setitimer(2),则由于收集器和程序同时使用定时器,可能会使基于时钟的分析实验中断。

  3. 统计数据显示和抽样 [等待 CPU] 量度的错误值

    在抽样包和全局统计中有时会记录错误的等待 CPU 度量值。这些值会出现在性能分析器的 [统计] 标签中,并将影响 [时间线] 标签中抽样的显示。 (4615617)

  4. 短时间周期内的时钟分析数据丢失

    当系统时钟与外部源进行同步时,时钟分析数据会丢失数秒钟的时间。此时,系统时钟会递增,直至达到同步。分析信号按设定的时间间隔发出,但在分析包中记录的时间戳包括在发出信号的间隔时间内所设置的任何增量。

  5. 堆栈溢出造成的数据收集中止。

    有时收集器会因栈溢出错误而失败。出现这种情况的原因是收集器使用应用程序的栈,而该应用程序的栈的大小不足,以致不能由该收集器使用。解决办法是增加栈的大小(至少 8 KB)。详细信息,请参见 limit(1) 手册页。对于使用多任务库的并行应用程序,也可以使用环境变量 STACKSIZE 设置每个线程的栈大小。

  6. 程序调用 exec 后未完成实验。

    如果成功收集性能数据的程序调用 exec(2) 或其任何变体,则实验将被异常中止。尽管通过性能分析器或 er_print 仍然可以读取实验,但应在收集数据的计算机上为该实验运行 er_archive(1),以确保该程序所使用的加载对象能被正确归档。

  7. 尾调用优化时显示虚假递归。

    对于某些对共享对象(PIC 代码)进行尾调用并要求确定全局偏移表地 址用以引用全局变量的函数,优化后的代码被错误地报告为递归,并将 真实调用者丢失了。 (4656890)

  8. 概要函数优化时显示虚假递归。

    当通过为较少执行的代码创建概要函数来优化函数时,可能会显示递归错误,因为工具无法判断概要函数的返回地址。 (4800953)

  9. java.util.prefs.FileSystemPreferences 警告消息的解决办法

    如果出现 java.util.prefs.FileSystemPreferences 警告消息,请尝试下面的解决办法:

    %cd /usr/j2sdk1.4.1_01/jre(或 JRE 主目录)
    %mkdir .systemPrefs
    %chmod 777 .systemPrefs
  10. 应用程序因在多个共享对象中的多个 libmtsk.a 而死锁

    链接了多个共享对象(具有多个 libmtsk.a 副本)的应用程序可能在 collect 过程中死锁。解决办法是在调用 collect 命令之前设置环境变量 LD_BIND_NOW。(4881093;编译器错误 4877490)

 


G. 局限和不兼容性

本节讨论系统或其他软件的限制和不兼容。

  1. 性能分析器要求

  2. 分析多线程应用程序

  3. 对使用Java 编程语言编写的应用程序进行分析

  4. 硬件计数器溢出分析

  5. 库插入

  6. 查找源文件和目标文件

  7. 实验不兼容性

  8. 使用 setuid

 

  1. 性能分析器要求

    性能分析器需要 Java 2 软件开发工具包(标准版),版本不低于 1.4。如果使用早期版本,性能分析器可以运行,但可能失败,不是功能出错就是执行混乱。

  2. 分析多线程应用程序

    当从隐含或显式的多线程(使用 libthread.so)应用程序中收集实验时,建议在 Solaris 9 操作系统或 Solaris 8 操作系统中使用交替 libthread 库(/usr/lib/lwp/libthread.so/usr/lib/lwp/64/libthread.so)进行收集。如果在 Solaris 7 操作系统或 Solaris 8 操作环境中使用缺省的 libthread 库,系统会发出警告,提示您数据可能会失真。

  3. 对使用 Java 编程语言编写的应用程序进行分析

    要在用 Java 编程语言编写的应用程序上收集 Java 模式或机器模式分析数 据,您必须使用 Java 2 软件开发工具包的标准版,并且版本号不得低于 1.4.2_02。JVM 软件中存在的错误可能会造成在使用任何早于 1.4.2_02 的 版本时出现程序故障。

    为了能取得 Java 模式分析的最佳效果,您应当使用所能得到的 Java 2 软件开发工具包标准版的最新版本。

  4. 硬件计数器溢出分析

    UltraSPARC® III 系列以前的 UltraSPARC® 处理程序不支持硬件计数器溢出分析。

    Solaris 8 发行版本以前的各版本的操作系统不支持硬件计数器溢出分析。

    某些早期版本的 UltraSPARC®III 硬件不支持基于用户 DTLB 或 ITLB 未中的分析。它们仅支持内核模式的 TLB 计数器。

    如果 cputrack 正在系统中运行,则由于 cputrack 对硬件计数器进行控制,收集器不能收集硬件计数器上溢数据。

  5. 库插入

    收集器在各种系统函数中执行插入操作,包括信号处理、forkexec 调用、硬件计数器库以及某些计时函数,以确保能收集到有效数据。如果程序使用这些函数中的任一个,其行为可能改变。具体来讲,分析计时器和硬件计数器在启用分析时对程序不可用,同时不会因信号传送而中断系统调用。此行为影响异步 I/O 库 libaio.so 的使用,该库会因传送信号而中断系统调用。如果将 dbx 连接到一个正在运行的进程而没有预加载收集器库 libcollector.so,然后启用数据收集,则这些插入不会发生。

  6. 查找源文件和目标文件

    调试器连接到进程时,生成的可执行文件的名称可能具有相对路径,而不是绝对路径,或者即使是绝对路径,对于性能分析器来讲也不可访问。类似的问题会在从归档文件 (.a) 加载目标文件时发生。

    [性能分析器] 从可执行文件或目标文件中记录下来的路径中提取基名 (最后一个 "/" 之后的名称)并按如下方式搜索文件:

    1. 它在 addpathsetpath 命令所提供的目录,或在 [数据表示] 对话框内性能分析器 [搜索路径] 标签中所设置的路径下,按给定的顺序搜索带基名的文件。缺省 setpath 为:
    2. A. 实验的归档目录。
      B. 当前工作目录,即 ./<basename>
    3. 2. 它使用原始记录路径来搜索文件。

    如果无法找到文件,将生成一个错误或警告,显示实验中原先出现的路径。

    要使得 [性能分析器] 能够找到源文件,您可以将包含该文件的目录增加到搜索路径,或设置一个从当前目录指向文件实际位置的符号链接,此外还可以将文件复制到实验。

  7. 实验不兼容性

    性能分析器不能加载用早于 ForteTM Developer 7 软件发行版本的收集器版本创建的实验。

  8. 使用 setuid

    如果进程调用 setuid 或执行 setuid 文件,可能会因权限问题而导致收集器创建实验失败。

    有关数据收集限制的详细信息,请参见 collect(1) 手册页。

 


H. 文档错误

目前没有新的信息。

 


I. 所需修补程序

性能分析工具的某些问题是由 Solaris 操作系统中的错误而引起。要修复这些错误,应该安装相关的补丁程序。要获得必要的补丁程序列表,可在命令提示符下键入不带参数的 collect 命令。补丁程序可以从 http://sunsolve.sun.com 下载。如果目前使用的是 Solaris 8 操作系统,在安装补丁程序之前,应该先安装不低于 update 5 的一个更新版本。

没有安装修补程序前,[收集器] 和 [性能分析器] 可能会遇到下列问题:

 


版权所有 © 2004 Sun Microsystems, Inc., 保留所有权利。必须依据许可证条款使用。