如何在 Linux 中将进程限制为一个 CPU 内核?

Grz*_*cki 80 linux cpu process limit

如何将进程限制为一个 CPU 内核?

类似于ulimitcpulimit会很好的东西。(只是为了确保:我不想限制使用百分比或执行时间。我想强制应用程序(包括所有子进程、进程(线程))使用一个 cpu 核心(或“n”个 cpu 核心))。

Gil*_*il' 89

在 Linux 下,执行sched_setaffinity系统调用。进程的亲和性是它可以运行的处理器集。有一个标准的外壳包装器:taskset. 例如,要将进程固定到 CPU #0(您需要选择特定的 CPU):

taskset -c 0 mycommand --option  # start a command with the given affinity
taskset -c -pa 0 1234            # set the affinity of a running process
Run Code Online (Sandbox Code Playgroud)

Perl ( Sys::CpuAffinity) 和 Python ( affinity)都有第三方模块来设置进程的亲和性。这些都适用于 Linux 和 Windows(Windows 可能需要其他带有 的第三方模块Sys::CpuAffinity);Sys::CpuAffinity也适用于其他几个 unix 变体。

如果要设置进程从出生时开始的亲缘关系,请在调用execve. 这是一个简单的包装器,它强制一个进程在 CPU 0 上执行。

#!/usr/bin/env perl
use POSIX;
use Sys::CPUAffinity;
Sys::CpuAffinity::setAffinity(getpid(), [0]);
exec $ARGV[0] @ARGV
Run Code Online (Sandbox Code Playgroud)

  • @NagabhushanSN 如果进程是单线程的,它确实可以工作。但对于多线程进程,您确实需要“-a”来影响所有线程,因此最好将其包含在我的答案中。我已经这样做了,谢谢。 (3认同)

Nil*_*ils 6

您也可以在命令行上构建 cpu-sets。man cpuset 稍后您可以为这些分配(运行)进程。