linux上的任务集和未知线程

时间:2013-04-29 05:25:03

标签: linux multithreading pthreads

我的公司刚刚带来了一个软件API,它会产生一个监控线程(启用时)。这个监视线程非常有用,但是我们希望将它锁定到Linux中的核心0。但是,我不能以正常的方式使用taskset IE

# taskset -c 2,3 12345

因为我不知道监控线程的PID。我已经询问供应商是否可以将输出的PID的PID输出到日志文件或类似文件中,并且他们说“我们将调查”,这意味着没有。

所以我的问题是如何从外部找到此监控线程的PID,以便我可以设置它?

1 个答案:

答案 0 :(得分:0)

看看来自libnuma的numactl。看起来您可以使用它来设置核心关联策略,并让它为您启动该策略已经生效。

我没有详细阅读该联机帮助页,但我怀疑所启动的程序可以通过在相关系统调用时首先执行此操作来覆盖该策略。但我想,除非程序不为自己做出这样的决定,否则你可以将整个过程限制在你喜欢的任何核心。

所以也许你可以在numactl下运行你的程序,只限于核心0.然后当第三方库启动它的线程时(可能你正在调用某种类型的库初始化例程,它本身会产生监视器线程)你可以让你的自己的系统调用放宽从numactl继承的核心亲和策略。

但是我同意Basile Starynkevitch - 在搞乱核心亲和力之前,你必须要有一些非常特殊的情况才值得。根据我的经验,如果程序有很多线程真正打击内存系统,并且你还解决了内存亲和力问题(这是你可以用libnuma做的其他事情),你只会获得一些东西。英特尔和AMD的硬件非常好,你必须非常努力地改进Linux调度程序的决策。

您可能还想考虑一下PREEMPT_RT内核补丁,您可以使用Redhat MRG或CERNs Scientific Linux预先打包它。它在使Linux中的调度在最大和平均上下文切换时间方面更加一致方面做得很好。我建议它,因为虽然你没有这样说,但我觉得你真正想要的是一些其他线程更安全,更一致地安排。 PREEMPT_RT做得很好。