Oracle® Developer Studio 12.5:性能分析器

退出打印视图

更新时间: 2016 年 6 月
 
 

数据收集的限制

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

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

缺省情况下,收集器收集的堆栈深度最多为 256 帧。如果堆栈较深,则可能在 er_print 和性能分析器中看到 <Truncated-stack> 函数。有关更多信息,请参见<Truncated-stack> 函数。要支持较深的堆栈,请将 SP_COLLECTOR_STACKBUFSZ 环境变量设置为更大的数字。

时钟分析的限制

用于分析的分析间隔最小值和时钟精度取决于特定的操作环境。 最大值设置为 1 秒。分析间隔值将向下舍入到最接近的时钟精度的整数倍。要显示最小值和最大值以及时钟精度,请键入不带其他参数的 collect 命令。

不能对使用分析计时器的程序执行时钟分析。收集器拦截对用于设置分析时钟参数的 setitimer(3) 的调用并阻止其他程序对其进行使用。

在 Linux 平台上,只能将时钟数据显示为 CPU 总时间。Linux CPU 时间是用户 CPU 时间和系统 CPU 时间的总和。

在 Linux 系统上,多线程应用程序的时钟分析所报告的线程数据可能不准确。内核并不总是按指定的间隔将分析信号传送到每个线程;有时,信号传送到了错误的线程。如果可用,使用周期计数器进行的硬件计数器分析通常提供更准确的线程数据。

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

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

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

收集跟踪数据的限制

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

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

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

硬件计数器分析的限制

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

  • 只能在具有硬件计数器且支持硬件计数器分析的处理器上收集硬件计数器数据。在其他系统中,硬件计数器分析功能处于禁用状态。具有 Unbreakable Enterprise Kernel 或 Red Hat 兼容内核 6.0 和更新版本的 Oracle Solaris 和 Oracle Linux 不支持硬件计数器。

  • cpustat(1) 命令运行过程中无法在运行 Oracle Solaris 的系统上收集硬件计数器数据,原因是 cpustat 控制了这些计数器,不允许用户进程使用它们。如果 cpustat 是在数据收集过程中启动的,则硬件计数器分析将终止,而且会在实验中记录一条错误。如果 root 使用硬件计数器启动 er_kernel 实验,也是如此。

  • 如果正在执行硬件计数器分析,则无法使用自己代码中的硬件计数器。 如果调用不是来自收集器,则收集器将插入 libcpc 库函数并返回一个返回值 -1。您应当对程序进行适当编码,使其在无法访问硬件计数器时能够正常工作。如果没有进行编码来对此加以处理,或者如果超级用户调用了同样使用计数器的系统范围的工具,或者如果该系统不支持计数器,程序将在硬件计数器分析过程中失败。

  • 如果您试图通过向进程附加 dbx 来在使用硬件计数器库的正在运行的程序上收集硬件计数器数据,则实验可能会被破坏或程序可能会失败。


    注 -  要查看所有可用计数器的列表,请运行不带其他参数的 collect -h 命令。

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

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

子孙进程的数据收集限制

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

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

  • -F on 选项,允许对 fork 及其变体和 exec 及其变体调用以及所有其他子孙进程(包括那些因调用 systempopenposix_spawn(3p)、posix_spawnp(3p) 和 sh 而产生的进程)自动收集数据。

  • -F all-F on 相同。

  • –F '=regexp' 选项,允许对其名称与指定的正则表达式相匹配的所有子孙进程收集数据。

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

OpenMP 分析的限制

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

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

Java 分析的限制

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

  • 应当使用版本不低于 JDK 7 Update 25 (JDK 1.7.0_25) 的 Java2 Software Development Kit (JDK)。收集器先在 JDK_HOME 环境变量或 JAVA_PATH 环境变量中设置的路径中查找 JDK。 如果未设置这些变量,它将在 PATH 中查找 JDK。如果 PATH 中没有 JDK,它将在 /usr/java/bin/java 中查找 java 可执行文件。

    收集器将验证它找到的 java 可执行文件的版本是 ELF 可执行文件。如果不是,则将输出错误消息,指示所使用的环境变量或路径,以及所尝试的全路径名。

  • 必须使用 collect 命令来收集数据。无法使用 dbx collector 子命令。

  • 某些应用程序不是纯 Java,而是 C 或 C++ 应用程序,它们调用 dlopen() 以装入 libjvm.so,然后通过调用 JVM 软件来启动 JVM 软件。要分析此类应用程序,请设置 SP_COLLECTOR_USE_JAVA_OPTIONS 环境变量。对于这种情况,请不要设置 LD_LIBRARY_PATH 环境变量。

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

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

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