分析和分析多线程应用程序

时间:2012-02-29 15:33:01

标签: linux multithreading profiling

我们正在拥有一个多线程应用程序,它在多个管道阶段都有大量数据包处理。该应用程序在Linux下的C语言中。

整个应用程序运行正常,没有内存泄漏或线程安全问题。但是,为了分析应用程序,我们如何分析和分析线程?

特别是我们感兴趣的是:

  1. 每个线程完成的资源使用
  2. 线程争用锁定的频率和时间
  3. 同步导致的间接费用
  4. 系统中的任何瓶颈
  5. 我们可以获得的最佳系统吞吐量
  6. 同样可用的最佳技术和工具是什么?

4 个答案:

答案 0 :(得分:3)

查看Intel VTune Amplifier XE(以前称为......英特尔线程档案器),了解它是否符合您的需求。 这个和其他英特尔Linux开发工具可用free for non-commercial use

在视频Using the Timeline in Intel VTune Amplifier XE中,演示了多线程应用程序的时间轴。演示者使用图形显示来显示锁定活动以及如何深入查看导致序列化的特定锁定的源代码行。在9:20,演示者使用框架API提及“,您可以通过编程方式标记代码中的某些事件或阶段。这些标记将显示在时间轴上。”

答案 1 :(得分:1)

几年前,我在类似的系统上工作过。我是这样做的:

步骤1.摆脱各个线程中不必要的时间。为此,我使用了this technique。这很重要,因为整个邮件系统受其部件速度的限制。

第2步。这部分是艰苦的工作,但它是值得的。对于每个线程,打印带有时间戳的日志,显示每条消息的发送,接收和操作时间。然后将日志合并到一个公共时间轴并进行研究。您正在寻找的是a)不必要的重传,例如由于超时,b)在接收消息的时间和对其采取行动之间的额外延迟。例如,如果一个线程在其输入队列中有多个消息,其中一些消息可以比其他消息更快地处理,则可能发生这种情况。首先处理它们是有意义的。

您可能需要在这两者之间交替。

不要指望这很容易。有些程序员太精细了,不能为这种肮脏的工作烦恼。但是,你可能会惊喜地发现整个过程的速度有多快。

答案 2 :(得分:0)

1)不知道。有一些可用于linux的分析器。

2)如果您正在流水线操作,每个阶段都应该做足够的工作以确保P-C队列上的争用最小化。您可以通过一些时间挖掘出来 - 如果一个阶段需要10ms +来处理数据包,您可以忘记争用/锁定问题。如果它需要100uS,你应该考虑合并几个阶段,以便每个阶段做更多的工作。

3)与(2)相同,除非某些全局数据或其他任何内容存在单独的同步问题。

4)每秒倾倒/记录队列计数会很有用。最长的队列将在具有最窄颈部的舞台之前。

5)不知道 - 不知道你当前的系统是如何工作的,它运行的是什么硬件等等。有一些'正常'的优化 - 消除了带对象池的内存管理器调用,为最重的阶段增加了额外的线程CPU负载,类似的东西,但“我们可以获得的最佳系统吞吐量” - 太空虚了。

答案 3 :(得分:0)

您是否可以灵活地在Darwin(OSX)下开发并在Linux上部署?性能分析工具非常好且易于使用(Shark and Thread Viewer对您的目的很有用)。

当然,有许多Linux性能工具。 gprof,Valgrind(使用Cachegrind,Callgrind,Massif)和Vtune将满足您的需求。

据我所知,没有工具可以直接回答你的问题。但是,可以通过交叉引用来自仪器和基于采样的解决方案的数据点和指标来找到答案。