我的本地计算机有多个 CPU,每个 CPU 都有多个核心,并且每个 CPU 都可以支持多个线程。我有一个多线程进程,我想强制仅在单个线程上运行。我知道numactrl
可以做到这一点。
我如何使用numactl
它来强制进程仅在单个线程上运行?或者,是否有更简单的内置实用程序可以做到这一点?
答案1
numactl --physcpubind=+1 /path/to/your/executable
这应该在分配给您的芯片组(索引 1)的第二个核心/CPU 上运行您的进程。有关更多详细信息,请参阅手册页的示例部分: http://linux.die.net/man/8/numactl
编辑:我应该指出,这意味着程序将最多同时运行一个线程,但这并不意味着整个过程将仅由一个线程组成。如果程序被编写为产生一个新线程,它会这样做,但它将在与其余进程相同的核心/CPU 上执行。区别很小,但仍然可能很重要。
答案2
要将程序限制到一个 CPU 硬件核心/线程,也可以使用taskset 1 prog [args]
附言
限制程序可以拥有的进程数(线程)的程序是prlimit --nproc=1 prog [args]
。我尝试使用它rsync
并得到“fork 不可用... IPC 错误”,最后 -rsync
被写入不能作为一个线程工作。
strace prlimit --nproc=1 rsync
运行strace
已显示如下面的 SO 链接中所述,clone
调用的返回值是-1 EAGAIN (resource temporary unavailable).
PS 想法取自https://stackoverflow.com/questions/38637451/is-there-a-way-force-a-program-to-use-only-1-thread。