我的公司刚刚带来了一个软件API,它可以派生一个监控线程(在启用时)。这个监控线程非常有用,但是我们想把它锁定在Linux的内核0上。但是,我不能在普通的IE中使用任务集
# taskset -c 2,3 12345因为我不知道监控线程的PID。
所以我的问题是,你如何从外部找到这个监控线程的PID,以便我可以对其进行任务设置?
发布于 2013-04-30 13:59:47
看看libnuma中的numactl。看起来您可以使用它来设置一个核心亲和性策略,并让它在该策略已经生效的情况下启动您的程序。
我没有详细阅读手册页,但我怀疑启动的程序可以通过进行相关的系统调用来覆盖该策略,如果它一开始就这样做的话。但我可以想象,除非程序本身没有做出这样的决定,否则你可以将整个过程限制在你喜欢的任何核心上。
所以也许你可以在numactl下运行你的程序,限制到core 0。然后,当第三方库启动其线程时(假设您正在调用某种库初始化例程,该例程本身会产生监视器线程),您可以进行自己的系统调用,以放松从numactl继承的核心亲和性策略。
然而,我同意Basile Starynkevitch的观点--在处理核心亲和力之前,你必须有一些非常特殊的情况。根据我的经验,只有当程序中有许多线程正在冲击内存系统,并且还解决了内存亲和性问题(这是您可以使用libnuma做的其他事情)时,您才能获得一些东西。Intel和AMD的硬件真的非常好,您必须非常努力地改进Linux调度器的决策。
您可能还想考虑PREEMPT_RT内核补丁,它可以与Redhat MRG或CERNs Scientific一起预先打包。它很好地使Linux中的调度在最大和平均上下文切换时间方面更加一致。我之所以建议这样做,是因为尽管你没有这样说,但我感觉你真正想要的是让其他线程被更可靠、更一致地调度。PREEMPT_RT在这方面做得很好。
https://stackoverflow.com/questions/16271706
复制相似问题