我想知道如何分析pthread互斥,以查看我的代码中是否有任何锁定争用点。(谁喜欢有争议的代码,对吧?:)正如我提到的here,我知道如何对代码进行更一般的分析。但我想知道是否有任何可用的工具或选项来分析互斥锁,这些工具或选项可以提供有关互斥锁争用的度量/统计信息,以查看我是否有任何问题区域。
下面是一些背景和背景:
最近,我使用Cavium Octeon CPU参与了一个嵌入式C++项目。Octeon SDK使用自旋锁实现互斥锁风格的同步。浏览Octeon文档时,我遇到了一种分析自旋锁的方法,以便能够查看在等待锁可用时每个自旋锁必须旋转多少次。为了使用它,我必须做一个条件编译,然后它会在每次自旋锁旋转时增加一个计数器,然后我可以查询旋转等待值。因此,我所做的是封装自旋锁,并为系统中使用的所有自旋锁添加了转储自旋锁旋转等待值的功能。实际的值并不意味着什么,但有一些与其他值相比确实很高,我专注于减少对这些值的争用。
我知道这对于自旋锁来说可能很简单,因为它只是一个计数器,但通过阅读相关的pthread手册页和头文件,我没有发现任何类似的东西,pthread mutex有什么可用的吗?
我真的希望避免做一些麻烦的事情,比如在每个锁之前和之后花费时间。
PS:互斥的复数是什么?互斥,互斥?Mutexes对我来说从来都不合适。
发布于 2012-06-01 23:29:23
valgrind工具drd允许您指定在报告错误之前等待锁的时间限制。
这个site提到了drd,也提到了他们自己的工具,叫做mutrace,看起来就是你想要的那种工具。它告诉你:
锁定互斥锁的持续时间的统计信息
例如:
mutrace: 10 most contended mutexes:
Mutex # Locked Changed Cont. tot.Time[ms] avg.Time[ms] max.Time[ms] Type
35 368268 407 275 120,822 0,000 0,894 normal
5 234645 100 21 86,855 0,000 0,494 normal
26 177324 47 4 98,610 0,001 0,150 normal
19 55758 53 2 23,931 0,000 0,092 normal
53 106 73 1 0,769 0,007 0,160 normal
25 15156 70 1 6,633 0,000 0,019 normal
4 973 10 1 4,376 0,004 0,174 normal
75 68 62 0 0,038 0,001 0,004 normal
9 1663 52 0 1,068 0,001 0,412 normal
3 136553 41 0 61,408 0,000 0,281 normal
... ... ... ... ... ... ... ...
mutrace: Total runtime 9678,142 ms.发布于 2012-06-01 23:21:13
你没有提到你的操作系统。如果是linux,我已经用过相当多的LTT来进行这种分析。它在两种模式下都很有用:
多年来,我一直在使用和看到“mutex”作为mutex的复数,没有任何抱怨。;>
发布于 2012-08-14 15:15:22
我在探索相同的用例时发现了'mutrace'。不过,我还没有使用它。它听起来不错,因为它不会像valgrind那样影响运行时。
https://stackoverflow.com/questions/10852637
复制相似问题