像在单核机器上一样运行进程来查找错误

像在单核机器上一样运行进程来查找错误

我的 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

相关内容