我们有一个多线程应用程序,它具有跨多个管道阶段的大量数据包处理。该应用程序在Linux下使用C语言。
整个应用程序运行良好,没有内存泄漏或线程安全问题。然而,为了分析应用程序,我们如何分析和分析线程呢?
我们特别感兴趣的是:
有什么最好的技术和工具可用于相同的?
发布于 2012-04-28 20:13:17
看看英特尔VTune放大器XE (以前的…)英特尔线程配置文件),看看它是否会满足您的需要。这个和其他Intel开发工具都是可用的免费非商业用途。
在视频时间线在英特尔VTune放大器XE中的应用中,演示了多线程应用程序的时间线。演示者使用图形显示来显示锁活动,以及如何深入到导致序列化的特定锁的源行。在9:20,演示者提到“使用框架API,您可以在代码中以编程方式标记某些事件或阶段,这些标记将出现在时间线上。”
发布于 2012-02-29 20:07:34
几年前我研究过类似的系统。我就是这样做的:
第一步:消除单个线程中不必要的时间占用者.为此,我使用了这一技术。这一点很重要,因为整个消息传递系统受到其部件速度的限制。
第二步,这一部分是艰苦的工作,但它是有回报的。对于每个线程,打印一个时间戳日志,显示每条消息发送、接收和操作的时间。然后将日志合并到一个共同的时间线中,并研究它。您正在寻找的是( a)不必要的重传,例如由于超时,b)从接收消息到执行消息之间的额外延迟。例如,如果一个线程的输入队列中有多个消息,其中一些消息可以比其他消息处理得更快,就会发生这种情况。首先处理这些问题是有意义的。
你可能需要在这两者之间交替。
别指望这会很容易。有些程序员太好了,不会被这种肮脏的工作所困扰。但是,你可能会为你能如此快地完成这一切而感到惊喜。
发布于 2012-02-29 15:57:01
1)不知道。linux有一些分析器可用。
2)如果是流水线,那么每个阶段都应该做足够的工作,以确保P队列上的争用最小化。您可以用一些时间来挖掘这个问题--如果一个阶段需要10ms+来处理一个包,那么您可以忘记争用/锁定问题。如果需要100 so,您应该考虑合并几个阶段,以便每个阶段做更多的工作。
3)与(2)相同,除非某些全局数据或其他数据存在单独的同步问题。
4)每秒钟卸载/记录队列计数将是有用的。排在舞台前的队伍最长,领口最窄。
5)不知道--不知道你当前的系统是如何工作的,它运行在什么硬件上等等。有一些“正常”的优化--用对象池消除内存管理器调用,用最重的CPU负载在各个阶段添加额外的线程,诸如此类,但“我们能获得的最佳系统吞吐量是多少?”--太不切实际了。
https://stackoverflow.com/questions/9501960
复制相似问题