跳过导航链接 | |
退出打印视图 | |
Oracle Solaris Studio 12.3 概述 Oracle Solaris Studio 12.3 Information Library (简体中文) |
Oracle Solaris Studio 软件提供了多个可用于检查应用程序行为的工具,从而使您能够对性能调优。
这些性能工具包括:
性能分析器和关联的工具。一组高级性能工具和实用程序,用于帮助您发现代码中影响性能的问题所在的位置。
简单性能优化工具 (Simple Performance Optimization Tool, SPOT)。一种命令行工具,它与性能分析器工具配合使用,生成 Web 页来报告这些工具收集的数据。
DLight 中的分析工具。一组同时运行的图形工具,使您能够以同步方式从多个源分析有关正在运行的应用程序的数据。
IDE 中的分析工具。与 DLight 中的分析工具类似,使您能够在 IDE 中检查项目的性能。
Oracle Solaris Studio 软件提供了一组可以结合使用的高级性能工具和实用程序。收集器、性能分析器、线程分析器和 er_print 实用程序有助于您评估代码的性能、识别潜在性能问题并定位出现这些问题的代码部分。这些工具统称为性能分析器工具。
您可以选择使用 Oracle Solaris Studio C、C++ 和 Fortran 编译器,以实现用于提高程序性能的硬件和高级优化技术。同时,性能分析器工具也设计为在 Oracle Sun 硬件上与编译器一起使用,在 Oracle Sun 计算机上运行时可帮助您提高程序的性能。
相对于 DLight 分析工具,利用性能分析器工具,对所收集数据具有更大的控制能力、检测数据更为深入,同时还能检查程序与硬件之间的交互。性能分析器工具设计用于在最新 Oracle Sun 硬件上运行的复杂的、计算密集型应用程序,并经过此类测试。
性能分析器工具还能够对 OpenMP 并行应用程序和基于 MPI 的分布式应用程序进行分析,帮助您确定是否在应用程序中有效地使用了这些技术。
要使用性能分析器工具,必须执行以下两步:
使用收集器收集性能数据。
使用性能分析器图形工具、er_print 命令行实用程序或线程分析器检查数据,检测多线程应用程序上是否存在数据争用和死锁。
收集器通过使用分析和跟踪函数调用来收集性能数据。这些数据可能包括调用堆栈、微状态计数信息(仅在 Oracle Solaris 平台上)、线程同步延迟数据、硬件计数器溢出数据、消息传递接口 (Message Passing Interface, MPI) 函数调用数据、内存分配数据以及操作系统和进程的摘要信息。收集器可收集 C、C++ 和 Fortran 程序的所有类型的数据,以及用 Java 编程语言编写的应用程序的分析数据。可通过使用 collect 命令、从性能分析器中或使用 dbx 调试器的 collect 子命令来运行收集器。
Oracle Solaris Studio IDE 分析工具也使用收集器来收集信息。
要使用 collect 命令收集数据:
% collect [collect-options] executable executable-options
可向 collect 命令添加选项来指定想要收集的数据类型。例如,使用 -c on 选项时,收集器将记录指令计数。通过在可执行文件之后指定参数,可将参数传递到目标可执行文件。
缺省情况下,收集器会创建一个名为 test.1.er 的数据目录,但可在命令行上指定其他名称。test.1.er 目录为实验目录,其名称必须始终以 .er 结尾,以便工具将其识别为实验目录。
以下命令显示如何在 synprog 程序上使用 collect:
% collect synprog Creating experiment database test.1.er ... 00:00:00.000 ===== (15909) synprog run 00:00:00.002 ===== (15909) Thu 10 Nov 11 15:12:18 Stopwatch calibration OS release 5.10 -- enabling microstate accounting 5.10. 0.001498 s. (32.8 % of 0.004568 s.) -- inner N = 1000, avg = 1.498 us., min = 0.721, max = 596.665 0.003482 s. (72.9 % of 0.004776 s.) -- outer N = 1000, avg = 3.482 us., min = 2.883, max = 599.007 00:00:00.007 ===== (15909) Begin commandline icpu.md.cpu.rec.recd.dousl.gpf.fitos.uf.ec.tco.b.nap.sig.sys.so.sx.so 00:00:00.008 ===== (15909) start of icputime 3.019055 wall-secs., 2.328491 CPU-secs., in icputime 00:00:03.027 ===== (15909) start of muldiv 3.012635 wall-secs., 2.675769 CPU-secs., in muldiv 00:00:06.040 ===== (15909) start of cputime 3.000567 wall-secs., 2.591964 CPU-secs., in cputime 00:00:09.041 ===== (15909) start of recurse ... (output edited to conserve space) ...
数据存储在 test.1.er 目录中,可使用性能分析器或 er_print 进行查看。
有关如何使用收集器的信息,请参见性能分析器中的 "Help"(帮助)菜单、《Oracle Solaris Studio 12.3:性能分析器》手册以及 collect(1) 手册页。
性能分析器是一个图形用户界面 (graphical user interface, GUI),显示收集器记录的数据的度量。这些度量包括:
时钟分析度量,按多种类别说明程序消耗时间的位置。
硬件计数器度量,显示程序所遇到的 CPU 特定事件的相关信息。
同步延迟度量,显示由多线程程序的不同线程执行的任务同步中的延迟。
内存分配度量,显示程序中的内存泄漏。
MPI 跟踪度量,帮助您确定 MPI 程序中可能因 MPI 调用而出现性能问题的位置。
可使用 analyzer 命令运行性能分析器。启动性能分析器的 analyzer 命令的基本语法如下:
% analyzer [experiment-list]
experiment-list 是使用收集器收集的实验的一个或多个文件名。如果想要装入多个实验,请以空格为分隔符来指定名称。对多个实验进行调用时,缺省情况下,分析器将聚集实验数据,但也可用于对实验进行比较。
要在性能分析器中打开实验 test.1.er:
% analyzer test.1.er
下图显示性能分析器 "Functions"(函数)标签,对 synprog 示例进行 test.1.er 实验。"Functions"(函数)标签显示由 synprog 程序的各个函数所使用的 CPU 时间。单击 gpf_work 函数时,右侧的 "Summary"(摘要)标签显示 gpf_work 函数资源使用情况的详细信息。
有关使用性能分析器的信息,请参见《Oracle Solaris Studio 12.3:性能分析器》手册、性能分析器集成帮助以及 analyzer(1) 手册页。
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 User CPU Time Excl. Incl. Name User CPU User CPU sec. sec. 57.290 57.290 <Total> 8.116 8.116 gpf_work 7.305 7.305 real_recurse 4.413 4.413 bounce_a 3.502 3.502 my_irand 3.082 3.082 muldiv 3.032 3.032 cputime 3.022 3.022 icputime 3.012 3.012 sigtime_handler 3.002 3.002 underflow 2.242 2.242 dousleep 2.242 2.242 inc_middle 1.661 1.661 gethrtime 1.511 1.511 inc_entry 1.511 1.511 inc_exit 1.121 1.121 tailcall_c 1.101 3.322 tailcall_a 1.101 2.222 tailcall_b 0.781 0.781 gettimeofday 0.781 0.781 inc_func 0.771 0.771 gethrvtime 0.761 3.973 systime 0.751 0.751 inc_body 0.751 0.751 inc_brace 0.490 0.490 ext_macro_code . .lines deleted
如果在启动 er_print 时指定实验名称并忽略命令,还可以交互方式使用 er_print。您可以在 (er_print) 提示符下键入命令。
有关 er_print 实用程序的信息,请参见《Oracle Solaris Studio 12.3:性能分析器》手册和 er_print(1) 手册页。
线程分析器是性能分析器的一个专门版本,用于检查多线程程序。线程分析器可以检测导致用 POSIX 线程 API、Solaris 线程 API、OpenMP 指令或混用这几项编写的代码中出现数据争用和死锁的多线程编程错误。
线程分析器用于检测多线程程序中的两个常见线程问题:
数据争用问题,在单个进程中的两个线程同时访问同一个共享内存位置且没有独占锁定同时至少一个访问为写访问时发生。
死锁问题,当两个或多个线程由于相互等待另一线程完成任务而被阻塞时发生。
线程分析器针对多线程程序分析经过简化,仅显示性能分析器的 "Races"(争用)、"Deadlocks"(死锁)、"Dual Source"(双源)、"Race Details"(争用详细信息)和 "Deadlock Details"(死锁详细信息)标签。对于 OpenMP 程序,还显示 "OpenMP Parallel Region"(OpenMP 并行区域)和 "OpenMP Task"(OpenMP 任务)标签。
您可以检测源代码或二进制代码中的数据争用。在这两种情况下,您必须检测代码才能收集到必要的数据。
要使用线程分析器:
检测代码以分析数据争用。对于源代码,请在编译时使用 -xinstrument=datarace 编译器选项。对于二进制代码,使用 discover -i datarace 命令创建检测后的二进制文件。
死锁检测不需要测试。
将 collect 命令与 -r race 选项连用来运行可执行文件以收集数据争用数据,与 -r deadlock 选项连用来收集死锁数据或者与 -r all 选项连用来收集这两种类型的数据。
使用 tha 命令启动线程分析器,或使用 er_print 命令显示生成的实验。
下图显示的线程分析器窗口包含在 OpenMP 程序中检测到的数据争用以及造成数据争用的调用堆栈。
有关使用线程分析器的信息,请参见 tha(1) 手册页和《Oracle Solaris Studio 12.3:线程分析器用户指南》。
简单性能优化工具 (Simple Performance Optimization Tool, SPOT) 可帮助您诊断应用程序中的性能问题。SPOT 对应用程序运行一组性能工具并生成 Web 页来报告这些工具收集的数据。也可独立于 SPOT 运行这些工具。
SPOT 是对 Oracle Solaris 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 的系统及应用程序编译情况的信息。该报告包括指向含有更多信息的其他页面的链接。
SPOT 报告 Web 页面相互链接在一起,便于您检查编译的所有数据。
有关更多信息,请参见《《Oracle Solaris Studio 12.2: Simple Performance Optimization Tool (SPOT) User's Guide》》。
DLight 是一种交互式图形工具,采用 Oracle Solaris 动态跟踪 (DTrace) 技术监测正在运行程序的行为。DLight 同时启动多个分析工具,使您能够以同步方式从多个源分析有关正在运行的应用程序的数据。DLight 分析工具能帮助您确定应用程序中出现运行时问题的根本原因。这些工具的影响低,执行分析时不会对程序或系统造成负面影响。
DLight 分析工具需要用于控制用户对 DTrace 功能的访问的特权。因此,应该在您具有管理特权或具有管理员授予您的 dtrace_user、dtrace_proc 和 dtrace_kernel 特权的系统上运行 DLight。
要启动 DLight:
% dlight
选择想要监视的目标应用程序以及希望 DLight 运行的分析工具。目标应用程序可在本地系统上运行,也可在您具有登录访问权限和 DTrace 特权的远程联网系统上运行。
可对尚未运行的可执行文件运行 DLight,也可将其连接到正在运行的进程。还可以将 DLight 连接到包括一个进程以及该进程启动的所有子进程的进程树。当目标程序运行时,DLight 以图形方式显示它所收集到的数据。
DLight 包括以下分析工具:
线程微状态-显示当程序运行时其中运行的线程状态的相关摘要数据。
CPU 使用情况-显示程序运行期间该程序所使用的 CPU 时间的百分比。CPU 时间分为用户 CPU 时间和系统 CPU 时间。
内存使用情况-显示程序的内存堆如何随时间变化。
线程使用情况-显示程序中运行的线程数并指明线程在何时处于等待状态。
I/O 使用情况-显示程序读写的字节数。
每个工具都提供了一个按钮,用于打开显示有更多详细信息的相关工具:
"Thread Details"(线程详细信息)-在 "Thread Microstates"(线程微状态)图形中单击 "Thread Details"(线程详细信息)按钮
"CPU Time Per Function"(每个函数的 CPU 时间)-在 "CPU Usage"(CPU 使用情况)图形中单击 "Hot Spots"(热点)按钮
"Memory Leaks"(内存泄露)-在 "Memory Usage"(内存使用情况)图形中单击 "Memory Leaks"(内存泄露)按钮
"Thread Synchronization Details"(线程同步详细信息)-在 "Thread Usage"(线程使用情况)图形中单击 "Sync Problems"(同步问题)按钮
"I/O Details"(I/O 详细信息)-在 "I/O Usage"(I/O 使用情况)图形中单击 "I/O Details"(I/O 详细信息)按钮
下图显示针对《Oracle Solaris Studio 12.3:DLight 教程》中使用的 ProfilingDemo 示例应用程序运行的 DLight 分析工具。
在图中,当用户单击 "Thread Microstates"(线程微状态)工具中的 "Thread Details"(线程详细信息)按钮后,"Thread Details"(线程详细信息)窗口在 DLight 窗口的左上方打开。当用户单击 "Thread Usage"(线程使用情况)工具中的 "Sync Problems"(同步问题)按钮后,将打开位于右下方的 "Thread Synchronization Details"(线程同步详细信息)窗口。
对进程树目标运行 DLight 时,将显示以下工具:
已分析进程的线程微状态-显示 DLight 使用 "Process Tree Target"(进程树目标)分析的所有进程的所有线程的微状态集合。此图形中的按钮将打开关于以下详细信息的窗口:
进程树微观状态详细信息-显示目标进程及其子进程的各线程的时间线形式的微状态转换。在 "Thread Microstates of Profiled Processes"(已分析进程的线程微观状态)工具中单击按钮可打开此工具。
进程树已阻塞线程详细信息-显示进程及其子进程的锁定统计信息。在 "Thread Microstates of Profiled Processes"(已分析进程的线程微观状态)工具中单击按钮可打开此工具。
已分析进程的 CPU 使用情况-显示在运行目标进程的所有 CPU 分析的所有目标进程的所有线程的累积 CPU 使用情况。
进程树 CPU 热点-通过显示程序中的函数以及该函数及其调用的所有函数使用的 CPU 时间来显示程序进程树中大量使用 CPU 的区域。在 "CPU Usage of Profiled Processes Running"(运行的已分析进程的 CPU 使用情况)工具中单击按钮可打开此工具。
下图显示针对进程树目标运行的 DLight。
图中底部显示进程树已阻塞线程详细信息窗口,该窗口由用户单击 "Thread Microstates of Profiled Processes"(已分析进程的线程微观状态)工具中的锁图标打开。在此窗口的右侧,可以看到发生所选线程锁定的调用堆栈。
这些 "Process Tree Profiling"(进程树分析)图形共同用于确定应用程序的多个进程和多个线程协同工作的方式。您能够看到线程被阻塞的位置以及对 CPU 使用情况的影响,并能够将问题的范围缩小到发生这些问题的代码行。
有关如何使用 DLight 的信息,请参见《Oracle Solaris Studio 12.3:DLight 教程》和 "Help"(帮助)菜单中提供的 DLight 的集成帮助。
IDE 提供的许多分析工具都与 DLight 相同,使您能够在 IDE 中检查项目的性能。只要您运行 C、C++ 或 Fortran 项目,这些工具就会自动运行。这些工具的影响低,执行分析时不会对程序或系统造成负面影响。
数据以图形方式呈现,方便您查看程序对资源使用情况的摘要。运行项目时,"Run Monitor"(运行监视器)窗口会自动打开,显示这些影响较低的工具的输出。可根据需要禁用分析工具,或指定您希望自动运行的那些工具。
缺省的分析工具不将 DTrace 用作底层技术。而是使用 Studio 实用程序和操作系统实用程序收集数据。这种方法使得所有用户都能够使用这些工具,无论他们运行的是 Oracle Solaris 还是 Linux。不过,如果在 Oracle Solaris 上运行 IDE,也可以选择使用 DTrace 的工具并提供更详细的信息。
与在 DLight 中相同,使用 DTrace 的 IDE 工具需要用于控制用户对 DTrace 功能的访问的特权。有关如何分配特权的信息,请参见 IDE 帮助中的说明 "Enabling DTrace for Profiling C/C++/Fortran Applications"(为分析 C/C++/Fortran 应用程序启用 DTrace)。
下图显示使用缺省运行监视器工具的 IDE。
用于执行更详细分析的其他工具对系统和应用程序性能的影响较大,因此不会自动运行这些工具。高级工具与自动分析工具相链接,只需单击按钮便可轻松启动。
IDE 具有 DLight 中没有的另外两个工具:"Data Races and Deadlocks Detection"(数据争用和死锁检测)工具和 "Memory Access Error"(内存访问错误)工具。
"Data Races and Deadlocks Detection"(数据争用和死锁检测)工具使用的底层技术与线程分析器相同,稍后将在本文档中介绍。该工具将分析添加到线程程序中,然后在程序运行时分析程序,以检测线程中实际和潜在的数据争用和死锁。要启动该工具,请单击 "Profile Project"(分析项目)按钮,选择 "Data Races and/or Deadlocks"(数据争用和/或死锁),指定用于数据收集的选项,然后单击 "Start"(启动)。
下图显示在检测到数据争用之后的 "Data Races and Deadlocks Detection"(数据争用和死锁检测)工具。
如果在 "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"(内存访问错误)工具。
有关如何使用分析工具的信息,请参见 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"(在项目中查找内存访问错误)。