2012-02-29 90 views
5

我们正在开发一个多线程应用程序,它在多个流水线阶段中进行繁重的数据包处理。该应用程序是在Linux下的C语言。分析和剖析多线程应用程序

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

尤其这里是我们感兴趣的是:

  1. 每个线程
  2. 与线程是具有争获取锁由于开销
  3. 金额的频率和时间进行资源使用同步
  4. 系统中的任何瓶颈
  5. 什么是我们可以得到的最佳系统吞吐量

相同的最佳技术和工具有哪些?

+2

您是否尝试过任何商业工具?例如:http://software.intel.com/en-us/articles/intel-parallel-studio-xe/ – Jayan 2012-02-29 16:16:27

回答

0

1)不知道。有一些可用于Linux的分析器。 2)如果你正在流水线化,每个阶段都应该做足够的工作来确保P-C队列上的争用是最小的。您可以在一些时间点上进行挖掘 - 如果某个阶段需要10ms +来处理数据包,则可以忽略争用/锁定问题。如果需要100uS,你应该考虑合并几个阶段,这样每个阶段都可以做更多的工作。

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

4)每秒钟转储/记录队列计数将很有用。最长的队列将在最窄的阶段之前。 5)不知道 - 不知道你当前的系统是如何工作的,它运行的是什么硬件等等。有一些'正常的'优化 - 消除了带有对象池的内存管理器调用,使用最重的CPU负载,类似的事情,但'什么是我们可以得到的最好的系统吞吐量' - 太空灵了。

1

几年前,我在类似的系统上工作过。以下是我的做法:

第1步。摆脱单个线程中不必要的占用者。为此,我使用了this technique。这很重要,因为整个消息传递系统受其部件速度的限制。

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

您可能需要在这两者之间切换。

不要指望这很容易。有些程序员太麻烦了,不会受这种肮脏的工作困扰。但是,您可以惊喜地发现,您可以以多快的速度完成整个任务。

0

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

当然还有很多Linux性能工具。 gprof,Valgrind(与Cachegrind,Callgrind,Massif)和Vtune将做你所需要的。

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

2

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

在视频Using the Timeline in Intel VTune Amplifier XE中演示了多线程应用程序的时间线。演示者使用图形显示来显示活动以及如何挖掘引起序列化的特定锁的源代码行。在9:20,主持人提到“与框架API,你可以编程标记某些事件或阶段在你的代码,这些标记将出现在时间轴上。”