跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris Studio 12.3:性能分析器 Oracle Solaris Studio 12.3 Information Library (简体中文) |
本节描述了数据收集的限制,这些限制是由硬件、操作系统、程序的运行方式或收集器本身造成的。
对同时收集不同类型的数据来说,没有任何限制:您可以在收集某种数据类型的同时收集除计数数据以外的任何其他数据类型。
该收集器最多可支持 16,000 个用户线程。其他线程中的数据将被放弃,并生成收集器错误。要支持更多线程,请将 SP_COLLECTOR_NUMTHREADS 环境变量设置为更大的数字。
缺省情况下,该收集器收集深度最多为 256 帧的堆栈。要支持较深的堆栈,请将 SP_COLLECTOR_STACKBUFSZ 环境变量设置为更大的数字。
用于分析的分析间隔最小值和时钟精度取决于特定的操作环境。最大值设置为 1 秒。分析间隔值将向下舍入到最接近的时钟精度的整数倍。可以通过键入不带其他参数的 collect -h 命令来查找最小值和最大值以及时钟精度。
在 Linux 系统上,多线程应用程序的时钟分析所报告的线程数据可能不准确。内核并不总是按指定的间隔将分析信号传送到每个线程;有时,信号传送到了错误的线程。如果可用,使用周期计数器进行的硬件计数器分析将提供更准确的线程数据。
基于时钟的分析记录当 SIGPROF 信号传递到目标时的数据。这将导致在处理该信号和展开调用堆栈时产生扩大。调用堆栈越深,信号越频繁,扩大越显著。在一定程度上,基于时钟的分析表现出一些失真,这是由程序中那些执行最深堆栈部分的显著扩大而导致的。
请尽可能不要将缺省值设置为一个精确的毫秒数,而是将其设置为稍大于或稍小于某个精确数(例如,10.007 毫秒或 0.997 毫秒),以免与系统时钟关联,从而避免数据失真。在 SPARC 平台上,可以按照同样的方式来设置定制值(在 Linux 平台上不能设置定制值)。
只有在已预装入收集器库 libcollector.so 的情况下,才可以从已在运行的程序中收集任何种类的跟踪数据。有关更多信息,请参见从正在运行的程序中收集跟踪数据。
跟踪数据使运行与被跟踪事件的数量成比例地扩大。如果完成了基于时钟的分析,则跟踪事件所引起的扩大将导致时钟数据失真。
硬件计数器溢出分析存在多种限制:
只能在具有硬件计数器且支持溢出分析的处理器上收集硬件计数器溢出数据。在其他系统中,硬件计数器溢出分析功能处于禁用状态。UltraSPARC III 处理器系列之前的 UltraSPARC 处理器不支持硬件计数器溢出分析。
在 cpustat(1) 命令运行过程中无法在运行 Oracle Solaris 的系统上收集硬件计数器溢出数据,原因是 cpustat 控制了这些计数器,不允许用户进程使用它们。如果 cpustat 是在数据收集过程中启动的,则硬件计数器溢出分析将终止,而且会在实验中记录一条错误。
如果正在执行硬件计数器溢出分析,则无法使用自己代码中的硬件计数器。如果调用不是来自收集器,则收集器将插入 libcpc 库函数并返回一个返回值 -1。您应当对程序进行适当编码,使其在无法访问硬件计数器时能够正常工作。如果没有进行编码来对此加以处理,或者如果超级用户调用了同样使用计数器的系统范围的工具,或者如果该系统不支持计数器,程序将在硬件计数器分析过程中失败。
如果您试图通过向进程附加 dbx 来在使用硬件计数器库的正在运行的程序上收集硬件计数器数据,则实验可能会被破坏。
注 - 要查看所有可用计数器的列表,请运行不带其他参数的 collect -h 命令。
硬件计数器溢出分析记录当 SIGEMT 信号(在 Solaris 平台上)或 SIGIO 信号(在 Linux 平台上)传递到目标时的数据。这将导致在处理该信号和展开调用堆栈时产生扩大。与基于时钟的分析不同的是,对于某些硬件计数器,程序的不同部分可能会比其他部分更快速地生成事件并显示在该部分代码中的扩大。程序中快速生成这类事件的任何部分都可能会显著失真。类似地,某些事件可能会在一个线程中与其他线程不成比例地生成。
如果要在收集器所跟踪的所有后续进程中收集数据,就必须使用带有下列选项之一的 collect 命令:
-F all 选项导致收集器跟踪所有子孙进程(包括那些因调用 system、popen、posix_spawn(3p)、posix_spawnp(3p) 和 sh 而产生的进程)。
-F '=regexp' 选项允许在其名称或沿袭与指定的正则表达式相匹配的所有后续进程上收集数据。
有关 -F 选项的更多信息,请参见实验控制选项。
在执行程序期间收集 OpenMP 数据开销可能很大。可以通过设置 SP_COLLECTOR_NO_OMP 环境变量来压低开销。如果这样做,程序执行时间将显著缩短,但是将看不到自从属线程向上传播到调用方并最终传播到 main() 的数据,而在未设置该变量时通常情况下将能看到这些数据。
在此发行版中,OpenMP 3.0 的新收集器在缺省情况下是启用的。它可以分析使用显式任务的程序。只有在修补版本的 libmtsk.so 可用时,才可以使用该新收集器分析使用早期的编译器生成的程序。如果尚未安装此修补版本,可以通过设置 SP_COLLECTOR_OLDOMP 环境变量来将数据收集切换至使用旧收集器。
OpenMP 分析功能仅对使用 Oracle Solaris Studio 编译器编译的应用程序可用,因为它取决于 Oracle Solaris Studio 编译器运行时。对于使用 GNU 编译器编译的应用程序,仅显示机器级别的调用堆栈。
应当使用版本不低于 JDK 6 Update 18 的 Java 2 Software Development Kit (JDK)。收集器先在 JDK_HOME 环境变量或 JAVA_PATH 环境变量中设置的路径中查找 JDK。如果未设置这些变量,它将在 PATH 中查找 JDK。如果 PATH 中没有 JDK,它将在 /usr/java/bin/java 中查找 java 可执行文件。收集器会验证它找到的 java 可执行文件版本是否为 ELF 可执行文件,如果不是,则列显一条错误消息,指出所使用的环境变量或路径,以及已尝试使用的全路径名。
要获取热点编译代码的源代码行映射的更多详细信息,应该使用不低于 JDK 6, Update 20 的 JDK 版本或 JDK 7, build b85 早期访问版本。
必须使用 collect 命令来收集数据。无法使用 dbx collector 子命令。
如果应用程序所创建的后续进程运行 JVM 软件,则不能对这些应用程序进行分析。
某些应用程序不是纯 Java,而是 C 或 C++ 应用程序,它们调用 dlopen() 以装入 libjvm.so,然后通过调用 JVM 软件来启动 JVM 软件。要分析此类应用程序,请设置 SP_COLLECTOR_USE_JAVA_OPTIONS 环境变量,并将 -j on 选项添加到 collect 命令行。对于这种情况,请不要设置 LD_LIBRARY_PATH 环境变量。
Java 分析功能使用的 Java 虚拟机工具接口 (Java Virtual Machine Tool Interface, JVMTI) 可能会导致运行的失真和扩大。
对于基于时钟的分析和硬件计数器溢出分析,数据收集进程会对 JVM 软件进行各种调用,并使用信号处理程序处理分析事件。这些例程的开销和将实验写入磁盘的代价将扩大 Java 程序的运行时。这种扩大通常小于 10%。