在Linux上,对于使用pthread的C/C++程序,是否有办法查看线程是如何安排在进程的生命周期中的?我想看看每个线程在哪个CPU上运行。我想看看线程什么时候被抢占(以及为什么)。如何在Linux中跟踪pthread调度?
我们建立了一个测试环境,两台相同的机器运行相同的流程。有第三台机器产生两台机器监听的(“通过多播发送的)”时钟“事件。机器的进程在每个时钟都做一些事情,然后将结果发送给第三台机器。这个想法是第三台机器消除了时钟同步问题(在两台相同的机器之间)。我们的期望是,回来的结果应该完全(或几乎完全)同时。一般他们是。问题是,我们发现偶尔会出现尖峰,其中一个结果显着延迟(所有结果的标准偏差为10倍)。
我们正在寻找微秒级别的优化。在这个舞台上,缓存未命中和线程唤醒时间成为一个问题。众所周知,所有进程中的线程总数都大于CPU内核的数量。
我怀疑这些尖峰被抢占线程,线程CPU迁移(因此缓存未命中)偶尔的“完美风暴”造成的。在各种流程中,实际上只有两三个“重要”线程在做时间敏感的工作。其余的是辅助/支持线程,优先级较低。总的来说,重要/时间敏感线程的数量实际上等于(或少于)核心数量。
我怀疑解决方法是仔细分配重要线程到自己的核心,并将所有支持线程转储到自己的核心。但是这需要相当数量的开发工作,我想确认我的怀疑,然后再走这条路。
LTTng自2011年发布LTTng 2.0以来并不需要内核修补。它是一组挂钩到Linux内核跟踪点的内核模块。它支持Linux内核> = 2.6.36。 – 2016-09-16 17:32:21
@MathieuDesnoyers很高兴看到lttng的作者回复了这个。 – 2016-09-17 16:50:51
关于您的评论更新的小小澄清:LTTng-modules项目不是Linux内核树的一部分。它构建为一组内核模块(或者可以选择内置到内核映像中)。它可以在没有内核修补的情况下与香草内核> = 2.6.36一起使用,但它本身不是“在”内核源代码树中。 – 2016-10-06 20:19:24