如何分配进程在部分CPU上工作?

如何分配进程在部分CPU上工作?

我们希望仅在前 6 个 CPU。我们有一台 RHEL 机器。

我们有物理 DELL 机器,共有 12 核(来自lscpu

是否可以指定进程仅使用前 6 个核心?

或者其他屏蔽最后​​ 6 个核心的方法,因此我们实际上只能使用前 6 个核心,或停用最后 6 个核心,

笔记: 真正的原因是因为我们是按核心付费的,如果我们可以使用全部核心的一半,那么我们只需支付一半的价格。

答案1

这个术语是CPU亲和力。您可以使用该taskset命令为各个进程进行设置。

<command>仅在前 6 个核心(核心 #0-#5)上运行:

taskset -c 0-5 <command> [arguments for command]

如果进程已经在运行,您可以通过 PID 设置其关联性:

taskset -c 0-5 -p <PID of an existing process>

如果您想要适用于特定流程的限制及其所有子进程,那么您将需要斯蒂芬·基特(Stephen Kitt)在评论中提到的 cgroups。如果相关进程作为systemd服务运行,那么您只需添加CPUAffinity=0-5[Service]相应.service文件的部分(或创建覆盖文件)。

但如果你需要限制使用的核心数量出于许可目的,您需要找出相关软件供应商接受哪些方法。他们可能需要一种不太容易撤消的方法,或者他们可能需要一种机制,例如每日报告该软件每天使用了多少个核心(最大)。

答案2

是的,在 RedHat 系统上,通常一个人使用numactl

虽然它不能保证进程绑定到特定的 CPU(因为如果所需的 CPU 不可用,它将允许绑定到另一个 CPU,但它将配置作业启动以尽最大努力绑定并(如果进程休眠)重新绑定到所需的 CPU。

请注意,在这种情况下,CPU 的意思是“可以运行程序的东西”,而不是物理项目。这意味着(对于本次对话)真正的核心是一个 CPU,它的超线程是另一个,并且物理封装中通常有许多 CPU。要获取这些 CPU 的列表:

cat /proc/cpuinfo
  • numactl --hardware显示硬件布局。每个节点都是一个“内存边界”,这意味着它是 RAM 的一个隔离位,某些 CPU 的访问速度比其他 CPU 的访问速度更快。原因通常是因为它可以由一组 CPU 直接访问,而其他 CPU 必须跨越这些边界发出请求才能访问该 RAM 位。这很重要,因为您还可以直接numactl仅使用某些内存边界。如果您指定特定的 CPU,最好指定 CPU 本地的内存边界。

  • numactl --physcpubind=0-7 <command>将启动您通常<command>在核心 0 到 7 上运行的任何内容。

  • numactl --physcpubind=0,7 <command><command>将在核心 0 或 7 上启动。

当然,这两种情况都可能“核心丢失”,即操作系统确定核心不可用并在非指定核心上启动程序而不是延迟启动。该numactl选项--localalloc将尝试使用核心本地内存,同时--membind=...允许更明确的内存位置绑定。

numastat以统计形式显示已启动进程的numa_hits和。要查看是否有任何特定进程命中或错过,您需要在进程终止之前从文件系统读取详细信息。numa_missesnumactl/proc

答案3

如果您想避免许可成本,限制软件运行的 CPU 可能不会影响软件的核心检测。您可以请求该软件仅在某些核心上运行,但该软件将检测所有核心并根据许可证/允许的配置检查该数量。

为了使其按照您想要的方式工作,我建议安装 HyperVisor,将两个操作系统放置在同一硬件平台上。一些 HyperVisor(例如 XEN)可以对硬件进行强分区,而另一些则不能。与其他管理程序解决方案相比,使用可以对硬件进行强分区(硬件配置为独占支持单个虚拟机)的解决方案可能会取得更大的成功。

这有一些要求。 CPU 必须大致分布在两个或多个封装(实际的 CPU 芯片)中,以便 CPU 的强分区才能工作,并且机器的其余部分将无法访问为此应用程序保留的部分。由于这些限制,这并不是 100% 理想,但如果您可以忍受这些限制,这比购买新机器要好。

祝你好运。在您尝试之前,通常不可能 100% 知道这种解决方案是否适用于您的应用程序。

相关内容