我正在linux上针对一段恼人的cpp程序进行基准测试。这个程序非常混乱和复杂!它自动执行多线程,我想知道是否有任何方法通过调用某些东西(例如taskset等)来强制它仅使用一个线程。
编辑:我已经尝试设置“taskset 01 program arg1 ...”,但它不起作用。我刚刚看到程序使用了100个线程!
我正在linux上针对一段恼人的cpp程序进行基准测试。这个程序非常混乱和复杂!它自动执行多线程,我想知道是否有任何方法通过调用某些东西(例如taskset等)来强制它仅使用一个线程。
编辑:我已经尝试设置“taskset 01 program arg1 ...”,但它不起作用。我刚刚看到程序使用了100个线程!
(我认为您接受针对Linux的解决方案)
在Linux上,使用clone(2)系统调用来创建线程(至少是NPTL线程)。它有可能会失败,错误信息如下:
EAGAIN
进程数已达到系统上限; 请参考fork(2)。
(实际上,内核正在调度任务,这些任务可能是线程或[单线程]进程)
您可以使用setrlimit(2)中的RLIMIT_NPROC
选项:
RLIMIT_NPROC
在调用进程的真实用户ID下可创建的进程数(或更精确地说,在Linux下是可创建的线程数)。
因此,我猜您可以使用它来限制成功创建的线程(实际上是“任务”)数量。也许您可以将其与终端中运行的shell的ulimit
内置命令一起使用。
但是我不确定这是否是一个好主意。一个良好编写的程序会针对pthread_create(3)(内部调用clone(2))的错误进行测试。而糟糕编写的程序则可能会崩溃。
也许该程序正在使用一些线程池,并且存在一种限制该池大小的方法。顺便说一下,您可以在仅有两个核心 - 或甚至一个单独的核心 - 上运行数十个线程(尤其是当大多数时间这些线程处于空闲状态时,例如poll(2)等待I/O)。
PS. 为了进行基准测试,您可能更应该关心通过taskset
限制核心数量,而不是限制线程数量。
prlimit --nproc=1 prog [args]
。我尝试使用它与 rsync
,但出现了“fork unavailable... error in IPC”的错误提示,最终结果是 rsync
不支持单线程工作。 - Martian2020taskset
。以下内容摘自https://serverfault.com/a/32331。taskset <affinity mask> -p <process>
即
taskset 1 -p 12345
将进程12345设置为仅使用处理器/核心1
位掩码可以是列表(即1、3、4,以使用4+核心系统的核心1、3和4)或十六进制位掩码(0x0000000D表示1、3、4,0x00000001表示仅核心1)
taskset
通常包含在名为shedutils
的软件包中。
编辑:几乎忘了...如果您想为新命令设置亲和性而不是更改现有进程的亲和性,请使用:
taskset <mask> <program> [<arg1>]...[<argN>]
taskset 1 file