我想分析同步操作,例如 Linux 中互斥锁、信号量等的锁定和解锁。
我知道在内心深处它们是使用 futexes 实现的,所以也许对 futexes 的锁定和解锁进行分析就足够了(如果我在这里错了,请纠正我)。所以我的问题是如何分析它,因为 futex 操作通常发生在用户空间中。他们有任何工具可以让我对此进行分析吗?
我基本上对了解锁定 futex 和频率的功能很感兴趣。
我想分析同步操作,例如 Linux 中互斥锁、信号量等的锁定和解锁。
我知道在内心深处它们是使用 futexes 实现的,所以也许对 futexes 的锁定和解锁进行分析就足够了(如果我在这里错了,请纠正我)。所以我的问题是如何分析它,因为 futex 操作通常发生在用户空间中。他们有任何工具可以让我对此进行分析吗?
我基本上对了解锁定 futex 和频率的功能很感兴趣。
你可能会对 valgrind 和它的工具 callgrind 感兴趣。
valgrind --trace-children=yes --tool=callgrind -v ./program
它将在文件中生成详细的调用图,其中包括每个函数中传递的时间量。
然后您可以使用 kcachegrind 查看所有这些,这是一个用于可视化数据的漂亮 UI。
kcachegrind
它将允许您查看所有调用 pthread_mutex_lock() (或其他)的函数,其中包括时间百分比最高的函数,...
callgrind 最相关的部分是您可以轻松找到单线程程序中的瓶颈,因为您只需查看占用 cpu 时间最多的函数即可。
在多线程程序中,一个函数等待某个东西(互斥体)很长时间是正常情况,所以它更难。
您还可以使用 valgrind 的 Helgrind 工具,它可以帮助您在使用互斥锁时发现错误(潜在的死锁或潜在的数据竞争)。
我猜它通过分析同步和数据访问的可序列化一致性来分析您对同步函数的调用以及您读/写的数据,以检测潜在问题(可能发生超过 1000000 次的问题) 。(我重复一遍:我猜)。
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