我如何分析多线程问题?

Posted

技术标签:

【中文标题】我如何分析多线程问题?【英文标题】:How I profile multithreading problems? 【发布时间】:2016-01-30 20:37:17 【问题描述】:

这是我第一次尝试分析多线程程序。

我怀疑问题在于它在等待什么,但我不知道是什么,程序永远不会达到 100% 的 CPU、GPU、RAM 或 I/O 使用率。

直到最近,我只处理单线程的项目,或者线程非常简单的项目(例如:通常一个额外的线程只是为了确保在程序运行时 UI 不会被锁定,或者一旦我做了一个游戏引擎有一个单独的线程来处理 .XM 和 .IT 文件音乐,因此主线程可以做所有事情,而另一个内核中的另一个线程可以负责解码这些文件。

这个程序有多个线程,它们不会并行处理相同的任务,每个线程都有自己完全独立的目的(例如,一个线程专用于处理对操作系统的所有与声音相关的 API 调用)。

我下载了 Microsoft 性能工具,有一个前 Valve 员工的博客解释说他们努力做到这一点,但尽管我什至设法制作了一些配置文件等等,但我并不真正理解我所看到的,这对我来说只是一堆漂亮的图表(除了 CPU 使用图表,我已经通过对单线程应用程序进行基于样本的分析知道),那么,我如何找到程序等待某事的原因?或者我如何找到它在等待什么?我如何找到阻塞其他线程的线程?

【问题讨论】:

关注此等待分析:channel9.msdn.com/Shows/Defrag-Tools/… 您是指Microsoft Performance Tools 附带的Windows Performance Analyzer?我在帖子中谈论的是他们。 是的。您是否尝试过链接/视频中的步骤? @magicandre1981 链接现在指向显示页面 @LogicDaemon 好的,视频的直接链接仍然有效。你在这个页面上找到它:walkingcat.github.io/ch9-index/index.html?p=Shows_Defrag-Tools 【参考方案1】:

我认为是两件事之间的交替:

a) 测量总时间,为此您只需要某种计时器,并且

b) 发现加速,这不是意味着测量,尽管很多人都被告知。

每次您发现加速时,您都会计算结果并再次执行此操作。 这就是交替。 为了找到加速,我和很多人使用的方法是random pausing。 这个想法是,您让程序在调试器下运行并手动中断它几次。 每次,您都会检查每个线程的状态,包括调用堆栈。 很粗糙,效果很好。

这样做的原因是,程序可以运行得更快的唯一方法是,如果它正在执行您可以删除的活动,并且如果这样可以节省一定的时间,那么您至少有可能在每次暂停。 无论是执行 I/O、等待某事还是计算,这都有效。 它会看到分析器不会公开的东西,因为它们会生成summaries from which speedups can easily hide

【讨论】:

【参考方案2】:
    Visual Studio Performance and Diagnostics Hub 中的性能向导具有“资源争用数据”分析机制,允许分析线程之间的并发争用,即程序的整体性能如何受到其他线程上等待的线程的影响。详情请参阅this 博文。 PerfView 是一个非常强大的分析工具,可以分析服务线程和任务对程序整体性能的影响。这是可用的PerfView Tutorial。

【讨论】:

“非常强大”仅表示您非常喜欢它。 PerfView 是一个“CPU 分析器”,这意味着它不会告诉您任何有关等待时间的信息。

以上是关于我如何分析多线程问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用Windbg分析多线程临界区死锁问题分享

使用Windbg分析多线程临界区死锁问题分享

分析多线程 python 应用程序

多线程之死锁定位及故障分析,尽可能避免线上事故(十三)

多线程实践一为何使用多线程&三种线程创建方式利弊分析

多线程实践一为何使用多线程&三种线程创建方式利弊分析