我们只想在前6个CPU上运行我们的应用程序(进程)。我们有一台RHEL机器。
我们有物理戴尔机器,共有12个核心(来自lscpu)
是否可以将进程指定为仅使用前6个核心?
或者其他掩盖最后6个核心的方法,所以我们实际上只能使用前6个核心,或者分解最后6个核心,
注:这样做的真正原因是因为我们是每个核心支付许可证,如果我们可以使用总核心的一半,那么我们只能支付一半的价格。
发布于 2021-02-23 14:45:29
它的术语是CPU亲缘关系。您可以使用taskset命令为各个进程设置它。
仅在前6个核(核心#0-#5)上运行<command>:
taskset -c 0-5 <command> [arguments for command]如果进程已经在运行,则可以通过PID设置其关联:
taskset -c 0-5 -p <PID of an existing process>如果您想要一个将适用于特定进程及其所有子进程的限制,那么您将需要cgroup,正如Stephen在注释中提到的那样。如果所讨论的进程是作为systemd服务运行的,那么您只需将CPUAffinity=0-5添加到适当的.service文件的[Service]部分(或创建一个覆盖文件)。
但是,如果您需要限制用于许可目的的核心数量,则需要了解哪些方法被所涉软件供应商所接受。它们可能需要一种不太容易撤消的方法,或者可能需要一种机制,例如每天报告该软件每天使用多少核心(最多)。
发布于 2021-02-23 13:55:41
是的,在RedHat系统中,通常一个人使用numactl
虽然它不能保证一个进程绑定到特定的CPU (因为它将允许绑定到另一个CPU,如果所需的CPU不可用,它将配置作业启动以尽最大努力绑定并(如果流程休眠)重新绑定到所需的CPU。
请注意,在本例中,CPU的意思是“可以运行程序的东西”,而不是物理项。这意味着一个真正的核心是一个CPU,它的超级线程是另一个CPU,通常一个物理包中有很多CPU。要获得这些CPU的列表:
cat /proc/cpuinfonumactl --hardware显示硬件布局。每个节点都是一个“内存边界”,这意味着它是一个独立的RAM位,可以比其他CPU更快地从某些CPU访问。原因通常是因为它可以被一组CPU直接访问,而其他CPU必须通过这些边界发出请求才能访问该内存。这一点很重要,因为您还可以指示numactl只使用特定的内存边界。如果要指定特定的CPU,那么最好指定CPU本地的内存边界。numactl --physcpubind=0-7 <command>将启动您通常在核心0到7上运行的<command>。numactl --physcpubind=0,7 <command>将在核心0或7上启动<command>。当然,这两者都可能“核心失败”,即当操作系统决定核心将不可用,并启动程序在一个非指定的核心,而不是推迟启动。numactl选项--localalloc将尝试使用内核本地的内存,而--membind=...则允许更显式的内存位置绑定。
numastat以统计形式显示numactl启动进程的numa_hits和numa_misses。要查看是否有任何特定进程命中或错过,您需要在进程终止之前从/proc文件系统中读取详细信息。
发布于 2021-02-24 16:41:42
如果你试图避免授权成本,限制软件在哪个CPU上运行不会影响软件的核心检测。您可以请求该软件仅在某些核心上运行,但是该软件将检测所有核心,并根据许可/允许的配置检查该编号。
为了使这个工作以您想要的方式进行,我建议安装一个HyperVisor,将两个操作系统放在同一个硬件平台上。有些HyperVisors (如XEN )可以对硬件进行强分区,而另一些则不能。与其他虚拟机管理程序解决方案相比,可以对硬件进行强分区(硬件配置为独占支持单个VM),您可能会获得更大的成功。
这附带了一些要求。CPU必须粗略地分布在两个或多个包(实际CPU芯片)中,才能对CPU进行强分区,而机器的其余部分将无法访问为该应用程序保留的部分。这并不是100%理想的,因为这些限制,但它比必须购买一台新机器,如果你可以接受这些限制。
祝好运。在您尝试应用程序之前,通常不可能100%地知道这种解决方案是否适合您的应用程序。
https://unix.stackexchange.com/questions/635983
复制相似问题