Oracle® Developer Studio 12.5:概述

退出打印视图

更新时间: 2016 年 6 月
 
 

用于调整应用程序性能的工具

Oracle Developer Studio 软件提供了多个可用于检查应用程序行为的工具,从而支持性能调优。

    这些性能工具包括:

  • 性能分析器和关联的工具。一组高级性能工具和实用程序,用于帮助您发现代码中影响性能的问题所在的位置。

  • 简单性能优化工具 (Simple Performance Optimization Tool, SPOT)。一种命令行工具,它与性能分析器工具配合使用,生成 Web 页来报告这些工具收集的数据。

  • IDE 中的分析工具。可用于从 IDE 内部检查项目的性能。

性能分析器工具

Oracle Developer Studio 软件提供了一组可以结合使用的高级性能工具和实用程序。收集器、性能分析器、线程分析器和 er_print 实用程序有助于您评估代码的性能、识别潜在性能问题并定位出现这些问题的代码部分。这些工具统称为性能分析器工具。

可以选择使用 Oracle Developer Studio C、C++ 和 Fortran 编译器,以实现用于提高程序性能的硬件和高级优化技术。同时,性能分析器工具也设计为在 Oracle Sun 硬件上与编译器一起使用,在 Oracle Sun 计算机上运行时可帮助您提高程序的性能。

利用性能分析器工具,可以控制收集的数据、深入检测数据,以及检查程序与硬件的交互。性能分析器工具设计用于在最新 Oracle Sun 硬件上运行的复杂的、计算密集型应用程序,并经过此类测试。

性能分析器工具还能够对 OpenMP 并行应用程序和基于 MPI 的分布式应用程序进行分析,帮助您确定是否在应用程序中有效地使用了这些技术。

要使用性能分析器工具,必须执行以下两步:

  1. 在性能分析器中分析目标应用程序,或者使用 collect 命令从目标应用程序收集性能数据。

  2. 使用性能分析器图形工具、er_print 命令行实用程序或线程分析器图形工具检查数据,检查是否存在数据争用和死锁数据。

收集性能数据以分析应用程序

收集器通过使用分析和跟踪函数调用来收集性能数据。这些数据可能包括调用堆栈、微状态计数信息(仅在 Oracle Solaris 平台上)、线程同步延迟数据、硬件计数器溢出数据、消息传递接口 (Message Passing Interface, MPI) 函数调用数据、内存分配数据以及操作系统和进程的摘要信息。收集器可收集 C、C++ 和 Fortran 程序的所有类型的数据,以及用 Java 编程语言编写的应用程序的分析数据。可使用 collect 命令、从性能分析器中的 "Profile Application"(分析应用程序)对话框或使用 dbx 调试器的 collect 子命令来运行收集器。

Oracle Developer Studio IDE 分析工具也使用收集器来收集信息。

要使用 collect 命令收集数据:

% collect [collect-options] executable executable-options

可向 collect 命令添加选项来指定想要收集的数据类型。例如,使用 –i on 选项时,收集器将执行输入/输出跟踪。通过在可执行文件之后指定参数,可将参数传递到目标可执行文件。

缺省情况下,收集器会创建一个名为 test.1.er 的数据目录,但可在命令行上指定其他名称。test.1.er 目录为实验目录,其名称必须始终以 .er 结尾,以便工具将其识别为实验目录。

以下命令显示如何在 synprog 程序上使用 collect

% collect synprog

Creating experiment database test.1.er (Process ID: 11103) ...
00:00:00.000  ===== (11103) synprog run
00:00:00.005  ===== (11103) Mon  22 Sep 14  17:05:51 Stopwatch calibration
  OS release 5.11 -- enabling microstate accounting 5.11.
        0.000096 s.  (22.4 % of 0.000426 s.) -- inner
	N = 1000, avg = 0.096 us., min = 0.090, max = 0.105
        0.000312 s.  (67.0 % of 0.000466 s.) -- outer
	N = 1000, avg = 0.312 us., min = 0.307, max = 0.457
00:00:00.006  ===== (11103)  Begin commandline
	icpu.md.cpu.rec.recd.dousl.gpf.fitos.uf.ec.tco.b.nap.sig.sys.so.sx.so
00:00:00.006  ===== (11103) start of icputime
    3.003069 wall-secs.,   2.978360 CPU-secs., in icputime
00:00:03.009  ===== (11103) start of muldiv
    3.007489 wall-secs.,   2.997647 CPU-secs., in muldiv
00:00:06.017  ===== (11103) start of cputime
    3.002315 wall-secs.,   2.989407 CPU-secs., in cputime
00:00:09.019  ===== (11103) start of recurse
    3.082371 wall-secs.,   3.069782 CPU-secs., in recurse
...
(为了节省空间而对输出进行了编辑)
...

数据存储在 test.1.er 目录中,可使用性能分析器或 er_print 进行查看。

有关对可以下载的样例应用程序使用性能分析器的逐步说明,请参见Oracle Developer Studio 12.5:性能分析器教程

有关如何分析应用程序以及使用收集器的详细信息,请参见性能分析器中的 "Help"(帮助)菜单、Oracle Developer Studio 12.5:性能分析器手册以及 collect(1) 手册页。

使用性能分析器检查性能数据

利用性能分析器可以深入了解应用程序的行为,从而能够找出代码中的问题方面。性能分析器可确定哪些函数、代码段和源代码行占用的系统资源最多。性能分析器可以分析单线程、多线程和多进程应用程序,然后提供分析数据以帮助确定可提高应用程序性能的方面。

可使用 analyzer 命令运行性能分析器。启动性能分析器的 analyzer 命令的基本语法如下:

% analyzer [experiment-list]

experiment-list 是使用收集器收集的实验的一个或多个文件名。如果想要装入多个实验,请以空格为分隔符来指定名称。在多个实验上调用时,缺省情况下,性能分析器将聚集实验数据;但是,如果在命令行上的实验名称前指定 –c 选项,也可用于对实验进行比较。

如果不在命令行上指定实验,则性能分析器将显示 "Welcome"(欢迎)屏幕以帮助您开始。

要在性能分析器中打开实验 test.1.er

% analyzer test.1.er

实验的初始视图是 "Overview"(概述),可在其中快速了解程序所用时间和资源的概况,并可选择要在性能数据视图中看到的性能度量。

下图显示性能分析器 "Functions"(函数)视图,对 synprog 示例进行 test.1.er 实验。"Functions"(函数)视图显示由 synprog 程序的各个函数所使用的 CPU 时间。单击 gpf_work 函数时,右侧的 "Selection Details"(选择详细信息)窗口显示 gpf_work 函数资源使用情况的详细信息。在 "Functions"(函数)视图底部,"Called-by/Calls"(调用方/调用)区域显示被 gpf_work 调用的函数;双击调用可导航到 "Functions"(函数)视图中的相应的函数。

image:性能分析器 “Functions“(函数)标签的屏幕快照

有关使用性能分析器的信息,请参见Oracle Developer Studio 12.5:性能分析器手册、性能分析器集成帮助以及 analyzer(1) 手册页。

有关对可以下载的样例应用程序使用性能分析器的逐步说明,请参见Oracle Developer Studio 12.5:性能分析器教程

使用 er_print 实用程序检查性能数据

er_print 实用程序以纯文本格式显示性能分析器中呈现的大多数显示内容,但时间线显示、MPI 时间线显示和 MPI 图表显示除外。

可以使用 er_print 实用程序显示函数、调用方和被调用方的性能度量、调用树、源代码列表、反汇编代码列表、抽样信息、数据空间数据、线程分析数据以及执行统计信息。

er_print 命令的一般语法如下:

% er_print -command experiment-list

可以指定一个或多个命令以指明要显示的数据的类型。experiment-list 是使用收集器收集的实验的一个或多个文件名。对多个实验进行调用时,缺省情况下,er_print 将聚集实验数据,但也可用于对实验进行比较。

以下示例说明了用于显示程序函数信息的命令。所示输出针对在本文档上一节的性能分析器屏幕抓图中使用的同一个实验。

%  er_print -functions test.1.er
Functions sorted by metric: Exclusive Total CPU Time

Excl.     Incl.      Name
Total     Total
CPU sec.  CPU sec.
50.806    50.806     <Total>
 5.994     5.994     so_burncpu
 5.914     5.914     real_recurse
 3.502     3.502     gpf_work
 3.012     3.012     sigtime_handler
 3.002     3.002     bounce_a
 3.002     3.002     cputime
 3.002     3.002     icputime
 2.992     2.992     sx_burncpu
 2.992     2.992     underflow
 2.792     2.792     muldiv
 2.532     2.532     my_irand
 1.831     1.831     gethrtime
 1.031     1.991     tailcall_b
 0.961     0.961     inc_middle
 0.961     0.961     tailcall_c
 0.941     0.941     gethrvtime
 0.941     0.941     gettimeofday
 0.911     2.902     tailcall_a
 0.801     0.801     dousleep
 0.650     0.650     inc_entry
 0.640     0.640     inc_exit
 0.480     3.012     fitos
 0.330     0.330     inc_func
 0.320     0.320     inc_body
 0.320     0.320     inc_brace
 0.290     4.003     systime
 0.260     0.260     ext_macro_code

删除了若干行

如果在启动 er_print 时指定实验名称并忽略命令,还可以交互方式使用 er_print。您可以在 (er_print) 提示符下键入命令。

有关 er_print 实用程序的信息,请参见Oracle Developer Studio 12.5:性能分析器手册和 er_print(1) 手册页。

使用线程分析器分析多线程应用程序性能

线程分析器是性能分析器的一个专门版本,用于检查多线程程序。线程分析器可以检测导致用 POSIX 线程 API、Oracle Solaris 线程 API、OpenMP 指令或混用这几项编写的代码中出现数据争用和死锁的多线程编程错误。

线程分析器用于检测多线程程序中的两个常见线程问题:

  • 数据争用问题,在单个进程中的两个线程同时访问同一个共享内存位置且没有独占锁定同时至少一个访问为写访问时发生。

  • 死锁问题,当两个或多个线程由于相互等待另一线程完成任务而被阻塞时发生。

线程分析器已针对多线程程序分析进行了简化,仅显示性能分析器的 "Races"(争用)、"Deadlocks"(死锁)和 "Dual Source"(双源)数据视图。对于 OpenMP 程序,还显示 "OpenMP Parallel Region"(OpenMP 并行区域)和 "OpenMP Task"(OpenMP 任务)视图。

您可以检测源代码或二进制代码中的数据争用。在这两种情况下,您必须检测代码才能收集到必要的数据。

使用线程分析器:

  1. 检测代码以分析数据争用。对于源代码,请在编译时使用 –xinstrument=datarace 编译器选项。对于二进制代码,使用 discover -i datarace 命令创建检测后的二进制文件。

    死锁检测不需要测试。

  2. collect 命令与 –r race 选项连用来运行可执行文件以收集数据争用数据,与 –r deadlock 选项连用来收集死锁数据或者与 –r all 选项连用来收集这两种类型的数据。

  3. 使用 tha 命令启动线程分析器,或使用 er_print 命令显示生成的实验。

下图显示的线程分析器窗口包含在 OpenMP 程序中检测到的数据争用以及造成数据争用的调用堆栈。

image:线程分析器的 “Race Details“(争用详细信息)容器的屏幕抓图,其中包含了 OpenMP 程序中数据争用的调用堆栈跟踪

有关使用线程分析器的信息,请参见 tha(1) 手册页和Oracle Developer Studio 12.5:线程分析器用户指南

简单性能优化工具 (Simple Performance Optimization Tool, SPOT)

简单性能优化工具 (Simple Performance Optimization Tool, SPOT) 可帮助您诊断应用程序中的性能问题。SPOT 对应用程序运行一组性能工具并生成 Web 页来报告这些工具收集的数据。也可独立于 SPOT 运行这些工具。

SPOT 是对 Oracle Developer Studio 性能分析器的补充。性能分析器会告诉您应用程序运行过程中耗用时间的位置。不过,在某些情况下,您可能需要更多信息来帮助诊断应用程序的问题。SPOT 便能在此时为您提供帮助。

SPOT 使用 collect 实用程序作为它的工具之一。SPOT 使用 er_print 实用程序和另外一个实用程序 er_html 以 Web 页的形式显示分析数据。

使用 SPOT 之前,应通过某种程度的优化(使用 –O 选项)和调试信息(使用 –g 选项)对应用程序二进制文件进行编译,以使 SPOT 工具将性能信息体现到代码行中。

通过启动应用程序或连接到正在运行的应用程序,可使用 SPOT 收集性能数据。

要运行 SPOT 并启动您的应用程序:

% spot executable

要对已经运行的应用程序运行 SPOT:

% spot -P process-id

SPOT 在每次运行应用程序时都会生成一个报告,还会生成一个将各次运行产生的 SPOT 数据进行比较的报告。

如果对 PID 使用 SPOT,会按顺序将多个工具连接到 PID 以生成报告。

下图显示了 SPOT 运行报告的一部分,其中显示有关运行 SPOT 的系统及应用程序编译情况的信息。该报告包括指向含有更多信息的其他页面的链接。

image:SPOT 报告的屏幕抓图

SPOT 报告 Web 页面相互链接在一起,便于您检查编译的所有数据。

有关更多信息,请参见 Oracle Solaris Studio 12.2 文档库(网址 http://docs.oracle.com/cd/E18659_01/index.html)中的Oracle Solaris Studio 12.2: Simple Performance Optimization Tool (SPOT) User’s Guide

IDE 中的分析工具

Oracle Developer Studio IDE 提供的交互式图形分析工具可用于检查在 IDE 内部运行的项目的性能。分析工具使用 Oracle Developer Studio 实用程序和操作系统实用程序来收集数据。

可通过 "Profile Project"(分析项目)按钮 image: 使用分析工具。

Monitor Project(监视项目)

提供一些图形,可籍此了解程序的资源使用情况摘要。

Memory Access Errors(内存访问错误)

分析运行中的程序以检测内存访问错误和内存泄漏。

Data Races and Deadlocks Detection(数据争用和死锁检测)

分析运行中的程序以检测线程间实际和潜在的数据争用和死锁。

在分析项目并选择监视项目时,将打开 "Run Monitor"(运行监视器)窗口以显示低影响工具的 CPU 使用情况、内存使用情况和线程使用情况的输出。

下图显示使用运行监视器工具的 IDE。

image:使用运行监视器工具的 IDE 的屏幕抓图

用于执行更详细分析的其他工具对系统和应用程序性能的影响较大,因此运行监视器项目时系统不会自动运行这些工具。高级工具与 "Run Monitor"(运行监视器)工具关联,可通过单击按钮轻松启动以查看 "Hot Spots"(热点)、"Memory Leaks"(内存泄漏)和 "Sync Problems"(同步问题)。

"Data Races and Deadlocks Detection"(数据争用和死锁检测)工具使用的底层技术与线程分析器相同,稍后将在本文档中介绍。该工具将分析添加到线程程序中,然后在程序运行时分析程序,以检测线程中实际和潜在的数据争用和死锁。要启动该工具,请单击 "Profile Project"(分析项目)按钮,选择 "Data Races and/or Deadlocks"(数据争用和/或死锁),指定用于数据收集的选项,然后单击 "Start"(启动)。

下图显示在检测到数据争用之后的 "Data Races and Deadlocks Detection"(数据争用和死锁检测)工具。

image:运行 “Data Race Detection“(数据争用检测)的 IDE 的屏幕抓图

如果在 "Data Race Detection"(数据争用检测)窗口中单击 "details"(详细信息)链接,将打开 "Thread Details"(线程详细信息)窗口以显示发生数据争用的位置。您可以在 "Thread Details"(线程详细信息)窗口中双击线程,以打开发生问题的源文件并转到受影响的代码行。

"Memory Access Error"(内存访问错误)工具使用的底层技术与先前介绍的 discover 相同。该工具会检测程序,然后在程序运行时执行分析以检测内存访问错误和内存泄漏。要启动该工具,请单击 "Profile Project"(分析项目)按钮,选择 "Memory Access Error"(内存访问错误),指定用于数据收集的选项,然后单击 "Start"(启动)。内存访问错误类型将显示在 "Memory Analysis"(内存分析)窗口中。单击某一错误类型时,该类型的错误将显示在 "Memory Analysis Tool"(内存分析工具)窗口中,在其中可查看每个错误的调用堆栈。

下图显示在检测到内存访问错误之后的 "Memory Access Error"(内存访问错误)工具。

image:运行 “Memory Access Errors“(内存访问错误)的 IDE 的屏幕抓图

有关如何使用分析工具的信息,请参见 IDE 集成帮助,访问方法为在 IDE 中按 F1 键或通过 "Help"(帮助)菜单。在 "Help"(帮助)的 "Contents"(内容)标签中参见 "Profiling C/C++/Fortran Applications"(分析 C/C++/Fortran 应用程序)、"Detecting Data Races and Deadlocks"(检测数据争用和死锁)和 "Finding Memory Access Errors in Your Project"(在项目中查找内存访问错误)。