Oracle® Developer Studio 12.5:性能分析器教程

退出打印视图

更新时间: 2016 年 6 月
 
 

关于同步跟踪教程

本教程介绍如何在多线程程序上使用性能分析器来检查时钟分析和同步跟踪数据。

使用 "Overview"(概述)页面快速查看突出显示的性能度量并更改数据视图中显示的度量。使用 "Function"(函数)、"Callers-Callees"(调用方-被调用方)和 "Source"(源)视图了解数据。本教程还介绍如何比较两个实验。

本教程可帮助您了解同步跟踪数据并说明如何将其与时钟分析数据相关联。

在记录的实验中看到的数据将与此处显示的数据不同。用于本教程中屏幕抓图的实验是在运行 Oracle Solaris 11.3 的 SPARC T5 系统上记录的。来自运行 Oracle Solaris 或 Linux 的 x86 系统的数据将会有所不同。此外,数据收集本质上是统计性的,随实验的不同而不同,即使运行在同一系统和 OS 上也是如此。

您看到的性能分析器窗口配置可能不会与屏幕抓图完全匹配。通过性能分析器,可以拖动窗口各部分之间的分隔条,折叠各部分以及调整窗口大小。性能分析器记录其配置,并在下次运行时使用相同的配置。在捕获教程所示的屏幕抓图的过程中进行了许多配置更改。

关于 mttest 程序

程序 mttest 是一个简单程序,对伪数据应用各种同步选项。该程序实现多项不同任务,每个任务都使用相同的基本算法:

  • 将多个工作块排队(缺省情况下为 4 个)。

  • 衍生多个线程以处理它们(缺省情况下也是 4 个)。

  • 在每个任务中,使用特定的同步基元控制对工作块的访问。

  • 在同步之后,处理块的工作。

每个任务使用不同的同步方法。mttest 代码按顺序执行每个任务。

关于同步跟踪

通过插入用于同步的各种库函数(例如 mutex_lock()pthread_mutex_lock()sem_wait() 等)来实现同步跟踪。将跟踪 pthread 和 Oracle Solaris 同步调用。

目标程序调用这些函数中的一个函数时,数据收集器将拦截该调用。将捕获当前时间、锁的地址以及一些其他数据,然后插入例程调用实际库例程。实际库例程返回时,数据收集器再次读取时间并计算结束时间与开始时间之间的差值。如果该差值超过用户指定的阈值,将记录该事件。如果时间未超过阈值,则不记录该事件。在以上任一情况下,实际库例程的返回值都将返回到调用方。

通过使用 collect 命令的 -s 选项,可以设置用于确定是否记录事件的阈值。如果使用性能分析器收集实验,可以在 "Profile Application"(分析应用程序)对话框中将阈值指定为 "Synchronization Wait Tracing"(同步等待跟踪)的 "Minimum Delay"(最小延迟)。可以将阈值设置为微秒数或设置为关键字 calibrateon。使用 calibrateon 时,数据收集器将确定其获取无争用互斥锁所花费的时间并将阈值设置为该时间值的五倍。阈值指定为 0all 将导致记录所有事件。

在本教程中,将记录两个实验中的同步等待跟踪,一个实验具有校准的阈值,一个实验具有零阈值。这两个实验还包括时钟分析。