我正在阅读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似乎很好,但顾名思义,我担心它只能追踪互斥排除。
那么有没有其他工具或如何使用我上面提到的工具来获取锁争用统计信息?
感谢您的回复。
答案 0 :(得分:4)
最后,我找到了本文中使用的性能测量工具,它需要修补内核。
介绍页面可以在http://oss.sgi.com/projects/lockmeter/找到,最新的内核补丁对应于内核版本2.6.16,您可以下载here。
答案 1 :(得分:2)
一种方法就是让它运行,暂停它,并获取所有线程的random stackshot。然后再做几次。然后,以锁定代码终止的堆栈样本的分数是您所追踪的时间的百分比。它还会告诉您执行锁定的位置。如果您在准确度之后,请采取更多样本。这适用于任何语言或操作系统。