【问题标题】:Profiling synchronization operations in LinuxLinux 中的分析同步操作
【发布时间】:2011-11-28 14:57:38
【问题描述】:

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

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

我基本上对了解锁定 futex 和频率的功能感兴趣。

【问题讨论】:

    标签: c linux multithreading profiling futex


    【解决方案1】:

    您可能会对 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
    

    【讨论】:

    • 所以 valgrind 又一次来救我们了 :)!
    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多