2012-02-23 106 views
2

在Linux上,对于使用pthread的C/C++程序,是否有办法查看线程是如何安排在进程的生命周期中的?我想看看每个线程在哪个CPU上运行。我想看看线程什么时候被抢占(以及为什么)。如何在Linux中跟踪pthread调度?

我们建立了一个测试环境,两台相同的机器运行相同的流程。有第三台机器产生两台机器监听的(“通过多播发送的)”时钟“事件。机器的进程在每个时钟都做一些事情,然后将结果发送给第三台机器。这个想法是第三台机器消除了时钟同步问题(在两台相同的机器之间)。我们的期望是,回来的结果应该完全(或几乎完全)同时。一般他们是。问题是,我们发现偶尔会出现尖峰,其中一个结果显着延迟(所有结果的标准偏差为10倍)。

我们正在寻找微秒级别的优化。在这个舞台上,缓存未命中和线程唤醒时间成为一个问题。众所周知,所有进程中的线程总数都大于CPU内核的数量。

我怀疑这些尖峰被抢占线程,线程CPU迁移(因此缓存未命中)偶尔的“完美风暴”造成的。在各种流程中,实际上只有两三个“重要”线程在做时间敏感的工作。其余的是辅助/支持线程,优先级较低。总的来说,重要/时间敏感线程的数量实际上等于(或少于)核心数量。

我怀疑解决方法是仔细分配重要线程到自己的核心,并将所有支持线程转储到自己的核心。但是这需要相当数量的开发工作,我想确认我的怀疑,然后再走这条路。

回答

1

strace - 跟踪进程行为的简单工具,但似乎无法检查核心ID。需要修补内核,但更令人印象深刻的是,您可以准确知道每个内核正在做什么,如上下文切换/中断处理。

更新:由于马修Desnoyers提到,lttng可以自2.6.36作为Linux内核模块,修补现在不需要内核。

+2

LTTng自2011年发布LTTng 2.0以来并不需要内核修补。它是一组挂钩到Linux内核跟踪点的内核模块。它支持Linux内核> = 2.6.36。 – 2016-09-16 17:32:21

+0

@MathieuDesnoyers很高兴看到lttng的作者回复了这个。 – 2016-09-17 16:50:51

+0

关于您的评论更新的小小澄清:LTTng-modules项目不是Linux内核树的一部分。它构建为一组内核模块(或者可以选择内置到内核映像中)。它可以在没有内核修补的情况下与香草内核> = 2.6.36一起使用,但它本身不是“在”内核源代码树中。 – 2016-10-06 20:19:24

0

在Linux中,你可以使用这个命令

pidstat -t -p <processid> 
    => will print the cpu info in which the process is running 

在我们的应用中使用以下命令来分配CPU的过程中获得了线程的CPU信息/线程

taskset -c 1,3,11,12,13 <Binary> 

第一我们发现负载最少的CPU,然后分配的核心二进制(这应该是至少载)到CPU 剩下的进程将被分配给其他CPU的

+0

您也可以使用“taskset -p ”完成第一个示例。但是,使用taskset,您可以将进程分配给特定内核,但其他进程仍可以在这些内核上运行,除非该计算机的每个用户都仔细检查CPU分配情况。如果你的用户很少/进程很少,这并不算太坏,但是如果你有很多用户/进程,这就成了一个管理问题。您也可以考虑CPU屏蔽(“cset”),您可以在其中真正设置CPU内核互斥(包括内核)。 – Matt 2012-02-24 15:44:45