Oracle Solaris Studio 12.2:性能分析器

数据收集的限制

本节描述了数据收集的限制,这些限制是由硬件、操作系统、程序的运行方式或收集器本身造成的。

对同时收集不同类型的数据来说,没有任何限制:您可以在收集某种数据类型的同时收集除计数数据以外的任何其他数据类型。

该收集器最多可支持 16,000 个用户线程。其他线程中的数据将被放弃,并生成收集器错误。要支持更多线程,请将 SP_COLLECTOR_NUMTHREADS 环境变量设置为更大的数字。

缺省情况下,该收集器收集深度最多为 256 帧的堆栈。要支持较深的堆栈,请将 SP_COLLECTOR_STACKBUFSZ 环境变量设置为更大的数字。

基于时钟的分析的限制

用于分析的分析间隔最小值和时钟精度取决于特定的操作环境。最大值设置为 1 秒。分析间隔值将向下舍入到最接近的时钟精度的整数倍。可以通过键入不带参数的 collect 命令来查找最小值和最大值以及时钟精度。

时钟分析中的运行时失真和扩大

基于时钟的分析记录当 SIGPROF 信号传递到目标时的数据。这将导致在处理该信号和展开调用栈时产生扩大。调用栈越深,信号越频繁,扩大越显著。在一定程度上,基于时钟的分析表现出一些失真,这是由程序中那些执行最深栈部分的显著扩大而导致的。

请尽可能不要将缺省值设置为一个精确的毫秒数,而是将其设置为稍大于或稍小于某个精确数(例如,10.007 毫秒或 0.997 毫秒),以免与系统时钟关联,从而避免数据失真。在 SPARC 平台上,可以按照同样的方式来设置定制值(在 Linux 平台上不能设置定制值)。

收集跟踪数据的限制

只有在已预装入收集器库 libcollector.so 的情况下,才可以从已在运行的程序中收集任何种类的跟踪数据。有关更多信息,请参见从正在运行的程序中收集跟踪数据

跟踪过程中的运行时失真和扩大

跟踪数据使运行与被跟踪事件的数量成比例地扩大。如果完成了基于时钟的分析,则跟踪事件所引起的扩大将导致时钟数据失真。

硬件计数器溢出分析的限制

硬件计数器溢出分析存在多种限制:

硬件计数器溢出分析中的运行时失真和扩大

硬件计数器溢出分析记录当 SIGEMT 信号(在 Solaris 平台上)或 SIGIO 信号(在 Linux 平台上)传递到目标时的数据。这将导致在处理该信号和展开调用栈时产生扩大。与基于时钟的分析不同的是,对于某些硬件计数器,程序的不同部分可能会比其他部分更快速地生成事件并显示在该部分代码中的扩大。程序中快速生成这类事件的任何部分都可能会显著失真。类似地,某些事件可能会在一个线程中与其他线程不成比例地生成。

对子孙进程进行数据收集的限制

可以在某些限制下对子孙进程进行数据收集。

如果要在收集器所跟踪的所有子孙进程中收集数据,使用 collect 命令时必须带有下列选项之一:

有关 -F 选项的更多信息,请参见实验控制选项

OpenMP 分析的限制

在执行程序期间收集 OpenMP 数据开销可能很大。可以通过设置 SP_COLLECTOR_NO_OMP 环境变量来压低开销。如果这样做,程序执行时间将显著缩短,但是将看不到自从属线程向上传播到调用方并最终传播到 main() 的数据,而在未设置该变量时通常情况下将能看到这些数据。

在此发行版中缺省情况下启用 OpenMP 3.0 的新收集器。它可以分析使用显式任务的程序。只有在修补版本的 libmtsk.so 可用时,才可以使用该新收集器分析使用早期的编译器生成的程序。如果尚未安装此修补版本,可以通过设置 SP_COLLECTOR_OLDOMP 环境变量来将数据收集切换至使用旧收集器。

OpenMP 分析功能仅对使用 Oracle Solaris Studio 编译器编译的应用程序可用,因为它取决于 Oracle Solaris Studio 编译器运行时。对于使用 GNU 编译器编译的应用程序,仅显示机器级别的调用栈。

Java 分析的限制

可以在下列限制下在 Java 程序中收集数据:

用 Java 编程语言所编写的应用程序的运行时性能失真和扩大

Java 分析功能使用的 Java 虚拟机工具接口 (Java Virtual Machine Tool Interface, JVMTI) 可能会导致运行的失真和扩大。

对于基于时钟的分析和硬件计数器溢出分析,数据收集进程会对 JVM 软件进行各种调用,并使用信号处理程序处理分析事件。这些例程的开销和将实验写入磁盘的代价将扩大 Java 程序的运行时。这种扩大通常小于 10%。