0

我的公司刚刚推出了一个软件 API,它产生了一个监视线程(启用时)。这个监控线程非常有用,但是我们想在 Linux 中将它锁定到核心 0。但是,我不能以正常方式 IE 使用任务集

# taskset -c 2,3 12345

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

所以我的问题是你如何从外部找到这个监控线程的 PID,以便我可以对其进行任务设置?

4

1 回答 1

0

看看来自 libnuma 的 numactl。看起来您可以使用它来设置核心亲和性政策,并让它在该政策已经生效的情况下为您启动您的程序。

我没有详细阅读手册页,但我怀疑启动的程序可以自由地通过进行相关的系统调用来覆盖该策略,如果它是首先编写的。但我想,除非程序自己没有做出这样的决定,否则你可以将整个过程限制在你喜欢的任何核心上。

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

然而,我同意 Basile Starynkevitch 的观点——你必须有一些非常特殊的情况,然后再搞乱核心亲和力是值得的。以我的经验,只有当程序有很多真正影响内存系统的线程并且你还解决了内存关联问题(这是你可以用 libnuma 做的其他事情)时,你才会有所收获。Intel 和 AMD 的硬件确实非常好,你必须非常努力地改进 Linux 调度程序的决策。

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

于 2013-04-30T05:59:46.743 回答