【问题标题】:Linux - make sure a core is exclusively saved for critical tasksLinux - 确保一个核心专门用于关键任务
【发布时间】:2015-09-12 12:15:57
【问题描述】:

我有一个在基于 Linux 的机器上启动的进程,该机器正好有两个内核。

假设我的进程是系统中唯一的进程(我将忽略其他进程甚至系统的进程)。

我的流程分为两部分:

  1. 关键性能代码
  2. 低优先级代码

另外让我们假设我的主进程是在 Core 0 上启动的,我想专门为关键性能代码保留 Core 1。

我想把问题分成两部分:

  1. 我如何确保我的进程中的每个线程(包括我已将代码与之链接的可能调用 pthread_create 等的第 3 方库)将始终打开新线程核心 0 ?

  2. 我如何编写一个 测试 来验证 Core 1 除了性能关键路径之外什么都不做?

我熟悉以下 API:

pthread_setaffinity_np

这可以设置特定的线程关联,但我想知道是否有更底层的方法来确保即使是 3rd 方库创建的线程(从进程内部)也将被固定到核心 0。

也许我可以将进程的 默认 关联设置为核心 0 和特定线程 - 将其固定到核心 1?

【问题讨论】:

  • 为什么你想这样做?我想我理解试图控制一个基本上随机的算法的想法。但是您希望获得什么样的实际结果呢?
  • @wallyk - 例如,我不希望关键性能代码遭受缓存垃圾的影响。我希望关键路径核心除了处理我的关键路径代码之外什么都不做。
  • 好吧,提高关键性能代码的优先级,以便它很可能继续在其当前内核上运行。
  • 不是我真正的领域,但我无法抗拒。 “也许我可以将进程的默认亲和性设置为核心 0 和特定线程 - 将其固定到核心 1?”我想这也是我会做的。但这并不能阻止内核在您的“保留”内核上运行其他进程。为此,您需要在引导期间将参数传递给内核。或者您可以更改所有其他进程的亲和力,但这非常不雅,您不同意吗?
  • @jxh 不知道你的意思。我的意思是isolcpus 标志。这样您就可以保证“负责”您保留的内核/CPU。

标签: c++ linux multithreading affinity


【解决方案1】:

其中一个解决方案是安装(如果您还没有)并运行 Cpuset 实用程序。详情可见here

【讨论】:

    【解决方案2】:

    您已经描述了您想要的解决方案:

    也许我可以将进程的默认亲和性设置为核心 0 和特定线程 - 将其固定到核心 1?

    但是,也许问题是您不确定如何实现这一目标。

    Linux 提供sched_setaffinity 设置当前进程的亲和性。

    要让新创建的线程在特定内核上运行,最简单的方法是初始化pthread_attr_t,并使用pthread_attr_setaffinity_np 设置所需的内核亲和性。

    【讨论】:

    • 所以基本上你是说在将进程的亲和性设置为核心 0 之后 - 每个线程,即使是由其他库隐式创建的线程也不允许在其他核心上运行,但是我创建的线程可以明确设置为核心 1 - 对吗?
    • 如何测试它?您对如何编写可以确保没有线程设置为 Core 1 的测试有任何想法吗?
    • 该方法存在两个问题:1. 我想要一个可编程测试,因此它可以在夜间运行以验证 2. ps -elFH 只会对当前状态进行采样,所以理论上我可以“错过”所有时间,因为另一个线程非常快
    • 我没有尝试做你想做的事。但是您也许可以拦截线程创建调用,并检查正在使用的 CPU 掩码。
    猜你喜欢
    • 2021-08-24
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多