prstat 使用常见 – 过度锁定经常可以看到,多处理器系统上应用程序的扩展性很差。根本原因之一可能在于,应用程序中的锁定设计很差,导致在同步时的等待时间过长。prstat 列 LCK 报告等待用户锁定花费的时间。
我们看一个示例,一个示例程序实现了关键段的锁定机制,使用的是读/写锁定。该程序有 4 个线程需要访问共享的关键 zone 以进行读取,还有一个线程以写模式访问关键段。为了说明问题所在,有意减慢了写入器的速度,以便它会占用关键段一段时间(对于读取器这是有效的障碍)。
首先启动程序,比如写入器在关键段中花费了 0 毫秒(理想情况)。
# cc_lck 0 &
writer will sleep 0 useces
[1] 2626
#
cc_lck 0 – 在理想情况下运行
现在观察每个线程的微观状态。使用 prstat -mL -p 2626 2。
cc_lck 0 – prstat 输出
可以看到,所有 5 个线程几乎争夺到了相等的计算机资源。因为不管是读取器还是写入器都没有占用关键段很长的时间,没有记录等待时间。
现在重新执行整个测试,写入器将等待 10 毫秒。
# cc_lck 10 &
writer will sleep 10 useces
[1] 2656
#
现在再次观察微观状态。使用 prstat -mL -p 2656 2。
cc_lck 10 – prstat 输出
这次情况似乎不太一样了。有 4 个线程在等待关键段的锁定期间花费的时间占总时间的 84%。另一方面,写入器 (LWP #1) 有 (82%) 的时间在休眠。
在本例的应用程序中,如果查看源代码会发现存在明显的锁定问题,prstat Microstate Accounting 功能将帮助找出较大程序的锁定弱点.