【发布时间】:2015-09-12 12:15:57
【问题描述】:
我有一个在基于 Linux 的机器上启动的进程,该机器正好有两个内核。
假设我的进程是系统中唯一的进程(我将忽略其他进程甚至系统的进程)。
我的流程分为两部分:
- 关键性能代码
- 低优先级代码
另外让我们假设我的主进程是在 Core 0 上启动的,我想专门为关键性能代码保留 Core 1。
我想把问题分成两部分:
我如何确保我的进程中的每个线程(包括我已将代码与之链接的可能调用 pthread_create 等的第 3 方库)将始终打开新线程核心 0 ?
我如何编写一个 测试 来验证 Core 1 除了性能关键路径之外什么都不做?
我熟悉以下 API:
pthread_setaffinity_np
这可以设置特定的线程关联,但我想知道是否有更底层的方法来确保即使是 3rd 方库创建的线程(从进程内部)也将被固定到核心 0。
也许我可以将进程的 默认 关联设置为核心 0 和特定线程 - 将其固定到核心 1?
【问题讨论】:
-
为什么你想这样做?我想我理解试图控制一个基本上随机的算法的想法。但是您希望获得什么样的实际结果呢?
-
@wallyk - 例如,我不希望关键性能代码遭受缓存垃圾的影响。我希望关键路径核心除了处理我的关键路径代码之外什么都不做。
-
好吧,提高关键性能代码的优先级,以便它很可能继续在其当前内核上运行。
-
不是我真正的领域,但我无法抗拒。 “也许我可以将进程的默认亲和性设置为核心 0 和特定线程 - 将其固定到核心 1?”我想这也是我会做的。但这并不能阻止内核在您的“保留”内核上运行其他进程。为此,您需要在引导期间将参数传递给内核。或者您可以更改所有其他进程的亲和力,但这非常不雅,您不同意吗?
-
@jxh 不知道你的意思。我的意思是isolcpus 标志。这样您就可以保证“负责”您保留的内核/CPU。
标签: c++ linux multithreading affinity