【问题标题】:Assign CPU cores programmatically from C/C++ in CentOS 7 and GCC 5.2在 CentOS 7 和 GCC 5.2 中以编程方式从 C/C++ 分配 CPU 内核
【发布时间】:2019-06-15 02:38:17
【问题描述】:

我想以编程方式隔离我的进程,使其在不同于其他一切(包括操作系统)的核心上运行,以减少上下文切换。我发现了这个类似的问题:

Whole one core dedicated to single process

2011 年接受的答案:

https://stackoverflow.com/a/13585364/997112

提及:

另一种方法是使用更优雅的cpusets 动态的,但目前存在一些弱点(没有 例如计时器的迁移)这让我推荐旧的, 粗略但有效的 isolcpus 参数。

请注意,Linux 社区目前正在开展工作以 解决所有这些问题以及更多问题,以提供更好的隔离。

有更新吗?是否可以从 Linux C API 函数模拟 isolcpus?

我的 C++ 环境是 CentOS 7 和 GCC 5.2

【问题讨论】:

  • 这是特定于实现的东西。 C++ 标准对此没有任何规定。因此,至少,您需要指定您使用的是哪个 C++ 实现。
  • @SamVarshavchik 不确定您所说的哪个 C++ 实现是什么意思?我假设会有 Linux C API 调用。您是指哪个版本的 Linux?
  • @user997112 Sam 的评论是关于 C++ 语言如何没有提及这一点,因此没有适用于所有 C++ 开发人员的通用可移植答案。 C++ 实现是语言的特定实现、一组工具(编译器、链接器、标准库实现等)和允许开发人员将 C++ 代码转换为可执行形式的环境。您需要指定您正在使用什么实现以获得合理的答案(例如,Linux 发行版上的 gcc 版本 x.y)。在这种情况下,您使用的平台非常重要。
  • 我刚刚将我的 C++ 环境信息添加到问题中。您还有什么需要了解的吗?
  • 好吧,那么您就有了答案:使用 usolcpus 引导选项,并将保留的 CPU 用于您自己的线程。正如手册页所解释的,在“注意”部分中,没有其他选择:要么使用 isolcpus,要么手动隔离系统上的每个进程。

标签: c++ c linux performance


【解决方案1】:

您想要达到的目标称为CPU 亲和力。这通常是在系统管理员阶段而不是在编程阶段完成的任务,在企业环境中,程序将交付二进制文件,系统管理员组可能会或可能不会决定为某些二进制文件赋予一定的亲和力。

这通常通过taskset 命令完成,参见Realtime Reference Guide: Affinity

此命令将在核心 4 上独占运行 my-c-app

taskset -c 4 /bin/my-c-app

如果您想在 C 程序的代码中执行此操作,无论我提到什么,请参阅 Section 6.2. Using the sched_getaffinity() system call to set processor affinitythis answer 到线程 How to use sched_getaffinity and sched_setaffinity in Linux from C?

一个非常简短的例子:

cpu_set_t my_set;        /* Define your cpu_set bit mask. */
CPU_ZERO(&my_set);       /* Initialize it all to 0, i.e. no CPUs selected. */
CPU_SET(7, &my_set);     /* set the bit that represents core 7. */
sched_setaffinity(0, sizeof(cpu_set_t), &my_set); /* Set affinity of tihs process to */
                                                  /* the defined mask, i.e. only 7. */

【讨论】:

  • 您好,问题更多是关于防止其他进程在我保留的核心上运行。
  • @user997112 除了遍历所有现有进程并使用 sched_setaffinity() 将它们的亲和力更改为除您要运行的核心之外的任何内容之外,没有任何好的选择。 (这仅适用于用户空间进程,没有办法阻止内核使用内核)
【解决方案2】:

使用 linux API sched_setaffinity() 在 SMP 系统上设置调用进程的处理器亲和性将部分满足您的要求。

为了不允许任何其他进程在保留的 CPU 上被调度,您需要通过使用无锁和无睡眠实现以编程方式实现它。这完全阻止了任何其他进程/线程在保留的 CPU 上进行上下文切换。

【讨论】:

    猜你喜欢
    • 2017-12-08
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多