Oracle Solaris Studio 软件提供了一组可以结合使用的高级性能工具和实用程序。收集器、性能分析器、线程分析器和 er_print 实用程序有助于您评估代码的性能、识别潜在性能问题并定位出现这些问题的代码部分。这些工具统称为性能分析器工具。
可以选择使用 Oracle Solaris Studio C、C++ 和 Fortran 编译器,以实现用于提高程序性能的硬件和高级优化技术。同时,性能分析器工具也设计为在 Oracle Sun 硬件上与编译器一起使用,在 Oracle Sun 计算机上运行时可帮助您提高程序的性能。
利用性能分析器工具,可以控制收集的数据、深入检测数据,以及检查程序与硬件的交互。性能分析器工具设计用于在最新 Oracle Sun 硬件上运行的复杂的、计算密集型应用程序,并经过此类测试。
性能分析器工具还能够对 OpenMP 并行应用程序和基于 MPI 的分布式应用程序进行分析,帮助您确定是否在应用程序中有效地使用了这些技术。
要使用性能分析器工具,必须执行以下两步:
在性能分析器中分析目标应用程序,或者使用 collect 命令从目标应用程序收集性能数据。
使用性能分析器图形工具、er_print 命令行实用程序或线程分析器图形工具检查数据,检测多线程应用程序上是否存在数据争用和死锁。
收集器通过使用分析和跟踪函数调用来收集性能数据。这些数据可能包括调用堆栈、微状态计数信息(仅在 Oracle Solaris 平台上)、线程同步延迟数据、硬件计数器溢出数据、消息传递接口 (Message Passing Interface, MPI) 函数调用数据、内存分配数据以及操作系统和进程的摘要信息。收集器可收集 C、C++ 和 Fortran 程序的所有类型的数据,以及用 Java 编程语言编写的应用程序的分析数据。可使用 collect 命令、从性能分析器中的 "Profile Application"(分析应用程序)对话框或使用 dbx 调试器的 collect 子命令来运行收集器。
Oracle Solaris 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 ... (output edited to conserve space) ...
数据存储在 test.1.er 目录中,可使用性能分析器或 er_print 进行查看。
有关对可以下载的样例应用程序使用性能分析器的逐步说明,请参见Oracle Solaris Studio 12.4:性能分析器教程 。
有关如何分析应用程序以及使用收集器的详细信息,请参见性能分析器中的 "Help"(帮助)菜单、Oracle Solaris Studio 12.4:性能分析器 手册以及 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"(函数)视图中的相应的函数。
有关使用性能分析器的信息,请参见Oracle Solaris Studio 12.4:性能分析器 手册、性能分析器集成帮助以及 analyzer(1) 手册页。
有关对可以下载的样例应用程序使用性能分析器的逐步说明,请参见Oracle Solaris Studio 12.4:性能分析器教程 。
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 lines deleted
如果在启动 er_print 时指定实验名称并忽略命令,还可以交互方式使用 er_print。您可以在 (er_print) 提示符下键入命令。
有关 er_print 实用程序的信息,请参见Oracle Solaris Studio 12.4:性能分析器 手册和 er_print(1) 手册页。
线程分析器是性能分析器的一个专门版本,用于检查多线程程序。线程分析器可以检测导致用 POSIX 线程 API、Oracle Solaris 线程 API、OpenMP 指令或混用这几项编写的代码中出现数据争用和死锁的多线程编程错误。
线程分析器用于检测多线程程序中的两个常见线程问题:
数据争用问题,在单个进程中的两个线程同时访问同一个共享内存位置且没有独占锁定同时至少一个访问为写访问时发生。
死锁问题,当两个或多个线程由于相互等待另一线程完成任务而被阻塞时发生。
线程分析器已针对多线程程序分析进行了简化,仅显示性能分析器的 "Races"(争用)、"Deadlocks"(死锁)和 "Dual Source"(双源)数据视图。对于 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.4:线程分析器用户指南 。