【问题标题】:How to profile pthread mutex in linux?如何在 linux 中分析 pthread 互斥锁?
【发布时间】:2012-06-06 20:00:57
【问题描述】:

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

这里有一些背景和背景:

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

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

我真的很想避免做一些不合时宜的事情,比如在每次锁定之前和之后花时间。

PS:mutex 的复数形式是什么?互斥体,互斥体,互斥体,互斥体???互斥体对我来说从来都不是正确的。

【问题讨论】:

  • 我至少可以向你保证,互斥体的复数形式是互斥体。
  • 我开玩笑地希望使用互斥体,作为对互斥的半开玩笑的参考(以及对我家中一个常见的发音错误的单词的玩笑)。但正如 Mark B 所说,我听说互斥锁是最常见的形式。
  • 如果是mutox而不是mutex,你可以说mutoxen。
  • @AdamRosenfield,不错,这是与互斥锁的关系:)

标签: c++ c performance pthreads mutex


【解决方案1】:

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.

【讨论】:

    【解决方案2】:

    你没有提到你的操作系统。如果是 linux,我已经使用了很多 LTT 来进行这种分析。它可以在两种模式下使用:

    1. 性能分析——例如对您的系统进行 N 秒的标准使用分析,然后分析数据

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

    多年来,我一直在使用并看到“互斥体”作为互斥体的复数形式,没有任何抱怨。 ;>

    【讨论】:

    • 好点,我更新了问题标题,提到了linux,谢谢。
    • 我喜欢这个工具,今天正在评估它和 valgrind drd 工具,希望很快有结果。即使我不使用 LTT 进行互斥量分析,它看起来也是一个非常有用的工具,我将来会使用,谢谢!
    【解决方案3】:

    我在探索相同的用例时发现了'mutrace'。 我还没有使用它。听起来不错 不会像在 valgrind 中那样影响运行时。

    【讨论】:

      【解决方案4】:

      您可能还想尝试一下英特尔 VTune。它也会报告每个带有调用堆栈的同步原语的等待时间和等待计数。查看此文档,看看这是否是您要查找的内容http://software.intel.com/sites/products/documentation/hpc/amplifierxe/en-us/2011Update/lin/start/analyzing_locks_linux.pdf

      【讨论】:

      • 安东,看起来很有趣,谢谢。我想这仅适用于英特尔编译器,对吧?执行时间显示真的很酷!
      • 不,它是一个单独的产品,你不需要英特尔编译器。可以使用您选择的编译器编译二进制文件,分析引擎检测生成的二进制文件以定位线程和同步 API,然后运行二进制文件以跟踪这些 API 调用。英特尔为所有这些产品提供了相当慷慨的评估许可 - 完整功能至少可使用 30 天(可能是 60 天,不确定),您肯定有足够的时间来分析您的应用程序。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 2013-06-06
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多