c - 分析 Linux 中的同步操作

标签 c linux multithreading profiling futex

我想分析同步操作,例如 Linux 中互斥量、信号量等的锁定和解锁。

我知道在内心深处,它们是使用 futexes 实现的,所以也许足以分析 futexes 的锁定和解锁(如果我在这里错了,请纠正我)。所以我的问题是如何分析它,因为 futex 操作通常发生在用户空间中。他们有什么工具可以让我对此进行分析吗?

我主要想知道锁定 futexes 的函数和频率。

最佳答案

您可能会对 valgrind 及其工具 callgrind 感兴趣。

valgrind --trace-children=yes --tool=callgrind -v ./program

它将在文件中生成详细的调用图,其中包括每个函数中传递的时间量。

然后您可以使用 kcachegrind 查看所有这些,这是一个很好的可视化数据的 UI。

kcachegrind

它将允许您查看调用 pthread_mutex_lock()(或其他函数)的所有函数,其中,最前面的函数,按时间百分比,......

callgrind 最相关的部分是你可以很容易地找到单线程程序中的瓶颈,因为你只需要查看占用最多 cpu 时间的函数。

在多线程程序中,一个函数等待某个东西(互斥量)很长时间是正常情况,因此比较困难。

您还可以使用 valgrind 的 Helgrind 工具,它有助于发现您使用互斥体时的错误(潜在的死锁或潜在的数据竞争)。

我猜它通过分析 Serializability 来分析您对同步函数的调用以及您读取/写入的数据,以检测潜在问题(可能发生超过 1000000 次的问题 1 次)。同步和数据访问的一致性。 (我重复一遍:我猜)。

valgrind --tool=helgrind --suppressions=$PWD/supp --gen-suppressions=yes --db-attach=yes --track-lockorders=no ./program

以及valgrind的核心特性:检查内存泄漏:

valgrind --leak-check=yes -v --db-attach=yes ./program

关于c - 分析 Linux 中的同步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7613304/

相关文章:

c - 为什么堆栈粉碎仅在我的矩阵程序中与列索引一起发生?

python - Linux nohup 命令无法正常工作

multithreading - Synchronize应该在哪些线程中使用?

c# - 在主线程中设置线程本地值并在另一个线程中获取

java - ScheduledExecutorService 固定费率的计划未按预期准确运行

c - pow() 是否适用于 C 中的 int 数据类型?

c - Unix 中的 fork 函数

C++ 应用程序构建时间/日期保存

c - 打印带空格的函数入口和导出

linux - 如何制作 Linux 调度程序甘特图?