2009-12-26 44 views
5

我读http://lse.sourceforge.net/locking/dcache/dcache_lock.html,其中每个功能自旋锁的时间进行测量:如何测量锁争用?

SPINLOCKS   HOLD   WAIT 
    UTIL CON MEAN( MAX) MEAN( MAX)(% CPU)  TOTAL NOWAIT SPIN RJECT NAME 
    5.3% 16.5% 0.6us(2787us) 5.0us(3094us)(0.89%) 15069563 83.5% 16.5% 0% dcache_lock 
0.01% 10.9% 0.2us(7.5us) 5.3us(116us)(0.00%) 119448 89.1% 10.9% 0% d_alloc+0x128 
0.04% 14.2% 0.3us( 42us) 6.3us(925us)(0.02%) 233290 85.8% 14.2% 0% d_delete+0x10 
0.00% 3.5% 0.2us(3.1us) 5.6us( 41us)(0.00%)  5050 96.5% 3.5% 0% d_delete+0x94 

我想知道这些统计数据是从哪里来的。我尝试了oprofile,但似乎oprofile无法测量锁定持续时间和特定锁定的等待时间。而valgrind的drd太慢了应用程序的运行速度,这会导致结果不准确,并且消耗太多时间。 mutrace看起来不错,但正如名称所指出的那样,恐怕它只能追查互斥体排除。

那么有没有其他工具,或者如何使用我上面提到的工具来获得锁争用统计?

感谢您的回复。

回答

2

一种方法是让它运行,暂停它,并采取所有线程的random stackshot。然后再做几次。然后,以锁定代码终止的堆栈样本的比例大致为您所处的时间百分比。它还会告诉你在哪个位置执行锁定。如果你准确的话,请多抽取一些样本。这适用于任何语言或操作系统。