c++ - 如何在 linux 中分析 pthread 互斥锁?

标签 c++ c performance pthreads mutex

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

这里有一些背景和背景:

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

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

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

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

最佳答案

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.

关于c++ - 如何在 linux 中分析 pthread 互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852637/

相关文章:

c - 我们如何在 LLVM 中提取指针类型

c++ - 什么是 C 和 C++ 上下文中的激活记录?

linux -/proc/sys/fs/aio-nr 永远不会高于 1024(Linux 上的 AIO)

c++ - 如何写入/通过 V4L2loopback 模块创建的虚拟网络摄像头?

C++:vector 和 random_shuffle 的问题

c++ - boost::read_graphviz - 如何读出属性?

c++ - 是否有用于文件搜索的跨平台/C++ 库? (在硬盘上)

Python/Numpy 代码优化

performance - BProlog 8.1 中的表格性能不均衡

c++ - 单行类声明和实例化