Sun Studio 12:性能分析器

同步等待跟踪数据

在多线程程序中,不同线程执行的任务同步会导致应用程序的执行延迟,例如,一个线程要访问已被其他线程锁定的数据时就不得不等待。这些事件称为同步延迟事件,并通过跟踪对 Solaris 或 pthread 线程函数的调用来收集这些事件。收集和记录这些事件的过程称为同步等待跟踪。等待锁定花费的时间称为等待时间。目前,只能在运行 Solaris OS 的系统中进行同步等待跟踪。

只有等待时间超过阈值(单位为微秒)时,才会记录事件。阈值为 0 表示跟踪所有的同步延迟事件,而不管等待时间为何。缺省阈值通过运行校准测试决定,在该测试中对线程库的调用不会出现任何同步延迟。阈值是这些调用的平均时间与某个因子(当前为 6)相乘。该过程可防止对此类事件进行记录:即等待时间仅在于调用本身,而与实际的延迟无关。因此,数据量会大大减少,但同步事件的计数可能会被明显低估。

Java 程序的同步跟踪基于线程尝试获取 Java 监视器时生成的事件。对于这些事件,会同时收集机器调用栈和 Java 调用栈;但对于 JavaTM 虚拟机 (Java Virtual Machine, JVM) 软件中使用的内部锁定,不会收集任何同步跟踪数据。在机器表示法中,线程同步被移交给对 _lwp_mutex_lock 的调用,且不显示任何同步数据,因为没有跟踪这些调用。

同步等待跟踪数据被转换为以下度量:

表 2–2 同步等待跟踪度量

度量 

定义 

同步延迟事件

对等待时间超过指定阈值的同步例程的调用数目。 

同步等待时间

超过指定阈值的等待时间的总和。 

通过该信息,您可以确定函数或装入对象对同步例程进行调用时是会经常被阻塞还是会经历很长时间的等待。高同步等待时间表示线程间的争用。您可以通过重新设计算法,尤其是重新组织锁的结构,以便仅包含需要锁定的每个线程的数据来减少争用。