plockstat 提供器提供了可用于观察用户级同步元语(包括锁定争用次数和暂挂次数)行为的探测器。plockstat(1M) 命令是使用 plockstat 提供器收集用户级锁定事件数据的 DTrace 使用者。
这些探测器对应于用户级同步元语的争用,并在强制线程等待资源可用时触发。为了避免出现争用情况,通常会对 Solaris 进行优化,以便不发生延迟的争用;应使用这些探测器来了解出现争用位置的情况。由于设计的争用相对较少,因此启用争用事件探测器通常不会产生严重的探测影响;启用这些探测器时可以不必关注实际的性能影响。
这些探测器对应于获取、释放或处理用户级同步元语。同样,这些探测器可用于回答有关处理用户级同步元语的方法的任意问题。由于应用程序获取和释放同步元语通常很频繁,因此启用暂挂事件探测器将比启用争用事件探测器产生更大的探测影响。虽然启用暂挂事件探测器产生的探测影响可能会很大,但并非不可接受;仍然可以在生产环境应用程序中放心地启用这些探测器。
这些探测器对应于在获取或释放用户级同步元语时遇到的任何类型的异常行为。当线程在用户级同步元语上阻塞时,可以使用这些事件检测遇到的错误。错误事件会非常少见,因此启用这些探测器不会产生严重的探测影响。
互斥强制临界段相互排斥。当线程尝试使用 mutex_lock(3C) 或 pthread_mutex_lock(3C) 获取另一个线程暂挂的互斥时,它将确定拥有线程是否正在其他 CPU 中运行。如果是这样,获取线程将旋转一段时间,以等待互斥可用。如果属主未在另一个 CPU 上运行,获取线程将阻塞。
表 31–1 中列出了与互斥有关的四个 plockstat 探测器。对于每一个探测器,arg0 包含指向代表互斥的 mutex_t 或 pthread_mutex_t 结构(这些结构的类型相同)的指针。
表 31–1 互斥探测器
mutex-acquire |
获取互斥之后将立即触发的暂挂事件探测器。arg1 包含布尔值,用于指示获取操作对于递归互斥是否是递归的。arg2 表示获取线程在此互斥上旋转的重复次数。仅当在获取此互斥时触发 mutex-spin 探测器,arg2 才将为非零值。 |
mutex-block |
线程在暂挂互斥上阻塞之前将触发的争用事件探测器。单次锁定获取可能会同时触发 mutex-block 和 mutex-spin。 |
mutex-spin |
线程开始在暂挂互斥上旋转之前将触发的争用事件探测器。单次锁定获取可能会同时触发 mutex-block 和 mutex-spin。 |
mutex-release |
释放互斥之后将立即触发的暂挂事件探测器。arg1 包含布尔值,用于指示事件是否对应于递归互斥上的递归释放。 |
mutex-error |
互斥操作中遇到错误时将触发的错误事件探测器。arg1 是遇到的错误的 errno 值。 |
读取器/写入器锁定允许临界段中一次有多个读取器或一个写入器,但不允许二者同时存在。这些锁定通常用于搜索操作比修改操作更频繁或线程在临界段中花费大量时间的结构。用户使用 Solaris rwlock(3C) 或 POSIX pthread_rwlock_init(3C) 接口与读取器/写入器锁定交互。
表 31–2 中介绍了与读取器/写入器锁定有关的探测器。对于每一个探测器,arg0 包含指向代表自适应锁定的 rwlock_t 或 pthread_rwlock_t 结构(这些结构的类型相同)的指针。arg1 包含布尔值,用于指示操作是否作为写入器。
表 31–2 读取器/写入器锁定探测器
rw-acquire |
获取读取器/写入器锁定之后将立即触发的暂挂事件探测器。 |
rw-block |
尝试获取锁定时,在线程阻塞之前将触发的争用事件探测器。如果启用该探测器,rw-acquire 探测器或 rw-error 探测器将在 rw-block 之后触发。 |
rw-release |
释放读取器/写入器锁定之后将立即触发的暂挂事件探测器。 |
rw-error |
读取器/写入器锁定操作期间遇到错误时将触发的错误事件探测器。arg1 是遇到的错误的 errno 值。 |
plockstat 提供器使用 DTrace 的稳定性机制描述其稳定性,如下表所示。有关稳定性机制的更多信息,请参见第 39 章。
元素 |
名称稳定性 |
数据稳定性 |
相关性类 |
---|---|---|---|
提供器 |
发展中 |
发展中 |
ISA |
模块 |
专用 |
专用 |
未知 |
功能 |
专用 |
专用 |
未知 |
名称 |
发展中 |
发展中 |
ISA |
参数 |
发展中 |
发展中 |
ISA |