如何检测哪个互斥锁为操作系统提供了最大的时间?

Posted

技术标签:

【中文标题】如何检测哪个互斥锁为操作系统提供了最大的时间?【英文标题】:How to detect which mutex gives largest amount of time to the OS? 【发布时间】:2009-08-06 12:53:56 【问题描述】:

如何测量互斥体提供给操作系统的时间量?主要目标是检测一个互斥锁,它阻塞线程最长时间。

PS:我试过 oprofile。它报告 30% 的时间花在 vmlinux/.poll_idle 中。这是出乎意料的,因为该应用程序旨在占用其核心的 100%。因此,我怀疑,在等待某个互斥锁时,时间会返回给操作系统,而 oprofile 会将其报告为空闲时间。

【问题讨论】:

你能说得更具体点吗?我了解您的目标是优化某些系统,并正在寻找互斥锁以获得一些收益。互斥体给出的时间是什么意思?您是否对某些操作系统上下文中您自己的应用程序的互斥体开销感兴趣,或者对操作系统的性能和可扩展性感兴趣。哪个操作系统?因为有些操作系统自带好工具。 如何使用 pthread_mutex_trylock() 在不阻塞的情况下循环轮询互斥锁? 【参考方案1】:

个人资料。

每当问题是“什么真正花费了[最多|最少]时间?”,答案总是“要找出的资料。”。

【讨论】:

您能为这项任务推荐一个合适的分析器吗?我认为这也是 OP 真正要求的。例如,Oprofile 和 callgrind 可能对测量这类东西没有帮助。如果我错了,请纠正。 intel 和 amd 分析器可能会更好,但我从未尝试过。所以这也是我对这个问题感到好奇的原因。 取决于操作系统和编译器。【参考方案2】:

按照建议 - 配置文件,但在您要测量什么之前决定 - 已用时间(线程被阻塞的时间)或用户/内核时间(执行同步所花费的时间)。在不同的情况下,您可能想要测量一个或另一个,或两者兼而有之。

【讨论】:

【参考方案3】:

您可以在 Linux 上使用 OProfile 来分析您的程序。然后过滤掉您的结果以查看每个互斥体或执行锁定的更高级别函数在 pthread_mutex_lock() 中花费的时间。由于程序将在锁定函数调用内部阻塞,直到获取互斥体,分析在该函数中花费的时间应该可以让您了解哪些互斥体是最昂贵的。

【讨论】:

【参考方案4】:
start = GetTime();
Mutex.Lock();
stop = GetTime();

elapsedTime = stop - start;

elaspedTime 是获取互斥锁所花费的时间。如果它大于某个小的值,那是因为另一个线程具有互斥锁。这不会显示操作系统拥有互斥锁多长时间,只会显示另一个线程拥有它。

【讨论】:

以上是关于如何检测哪个互斥锁为操作系统提供了最大的时间?的主要内容,如果未能解决你的问题,请参考以下文章

Python的多线程锁跟队列

如何创建线程?如何保证线程安全?

互斥锁

MFC中Radio Button互斥操作

信号量 互斥量 读写锁 条件变量

线程高级操作