如何在linux中配置pthread互斥?

时间:2012-06-01 14:56:31

标签: c++ c performance pthreads mutex

我想知道如何配置pthread互斥锁以查看我的代码中是否存在任何锁定争用点。 (谁喜欢有争议的代码,对吧?:)我知道如何对代码进行更一般的分析,就像我提到here一样。但我想知道是否有任何工具或选项可用于配置互斥锁定,这将提供有关互斥锁定争用的指标/统计数据,以查看我是否有任何问题区域。

以下是一些背景和背景:

最近我使用Cavium Octeon CPU开发了一个嵌入式C ++项目。 Octeon SDK使用自旋锁实现互斥式样式同步。通过Octeon文档,我发现了一种分析自旋锁的方法,以便能够看到每个自旋锁在等待锁变为可用时必须旋转多少次。要使用它,我必须进行条件编译,然后每次自旋锁旋转时它会递增一个计数器,然后我可以查询微调器等待值。所以,我所做的是封装自旋锁并添加了为系统中使用的所有自旋锁转储自旋锁微调器等待值的功能。实际值并没有多大意义,但有一些与其他人相比具有非常高的价值,我专注于减少对这些人的争论。

我知道这对于自旋锁来说可能相当容易,因为它只是每次旋转一个计数器,但通过相关的pthread手册页和头文件读取我没有找到类似的东西,是否有可用于pthread互斥锁的东西?

我真的很想避免在每次锁定之前和之后花时间做一些hacky。

PS:互斥体的复数是多少?互斥,muteces,mutexi,muti ???互斥量从来没有对我说话。

5 个答案:

答案 0 :(得分:12)

valgrind工具drd允许您指定在报告错误之前应等待锁定的时间限制。

site提及drd并提及他们自己的工具mutrace,它看起来就像你正在使用的那种工具。它告诉你:

  • 锁定互斥锁的次数
  • 互斥锁拥有线程改变了多少次
  • 争用互斥锁的次数(在发出锁定请求时已锁定)
  • 关于互斥锁被锁定的持续时间的各种统计数据

e.g。

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.

答案 1 :(得分:3)

您没有提及您的操作系统。如果它是linux,我已经使用LTT进行了这种分析。它有两种模式:

  1. 性能分析 - 例如对系统进行N秒标准配置,然后分析数据

  2. 异常分析 - 例如在“飞行记录器”模式下全天候运行(记录活动的最后N秒),并在某些特殊情况下触发飞行记录器的停止。第二天早上来分析数据。

  3. 我一直在使用和看到'互斥体'作为复数的互斥体多年来现在没有抱怨。 ;>

答案 2 :(得分:2)

您可能还希望尝试使用英特尔VTune。它会报告每个同步原语的等待时间和等待计数以及调用堆栈。仔细阅读此文档,看看这是否是您正在寻找的http://software.intel.com/sites/products/documentation/hpc/amplifierxe/en-us/2011Update/lin/start/analyzing_locks_linux.pdf

答案 3 :(得分:2)

我在探索相同的用例时找到了'mutrace'。 我虽然没有使用它。这听起来不错 不像valgrind那样影响运行时。

答案 4 :(得分:0)

已经有6年了,但是作为参考,我想添加另一个用于CPU外时间跟踪的链接,该链接应该显示您的互斥锁争用。 http://www.brendangregg.com/offcpuanalysis.html