我的 Linux 应用程序中有一个错误,该错误只能在单核 CPU 上重现。为了调试它,我想从命令行启动该进程,这样即使在我的多处理器机器上,它也仅限于 1 个 CPU。
是否可以针对特定进程更改此设置,例如运行它,以便它不在多个处理器上运行(其)多个线程?
答案1
您可以使用任务集从util-linux
。
掩码可以以十六进制指定(带或不带前导“0x”),或使用 --cpu-list 选项指定为 CPU 列表。例如,
0x00000001 is processor #0, 0x00000003 is processors #0 and #1, 0xFFFFFFFF is processors #0 through #31, 32 is processors #1, #4, and #5, --cpu-list 0-2,6 is processors #0, #1, #2, and #6. When taskset returns, it is guaranteed that the given program has been scheduled to a legal CPU.
答案2
正如 @Ipor 的回答中提到的,将程序限制为一个可以使用的 CPU 硬件核心/线程taskset 1 prog [args]
此外,还有一种方法可以明确禁止进程克隆(但不确定使用的应用程序fork
,仅检查clone
系统调用)。
限制程序可以拥有的进程(线程)数量的程序是prlimit --nproc=1 prog [args]
。我尝试使用它,rsync
但得到“fork unavailable...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。