我正在对Linux上一个烦人的cpp程序进行基准测试。该计划是一个混乱和复杂的地狱!它会自动执行多线程,我想知道是否有任何方法可以通过某种方式调用它,即taskset等,只使用1个线程。
编辑:我尝试过设置" taskset 01 program arg1 ..."但它不起作用。我刚刚看到程序使用100个线程!
答案 0 :(得分:3)
要限制 Linux 进程在一个核心上运行taskset
。以下摘自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>]
答案 1 :(得分:2)
(我假设您接受Linux特定的解决方案)
在Linux上,使用NPTL系统调用创建线程(至少clone(2)个)。记录失败
EAGAIN
已经有太多进程在运行;见fork(2)。
(事实上,内核正在调度可能是线程或[单线程]进程的任务)
您可以将setrlimit(2)与RLIMIT_NPROC
:
RLIMIT_NPROC
最大进程数(或者更准确地说是在Linux上, 线程)可以为真实用户ID创建 呼叫过程。
所以我猜你可以使用它(可能在终端中运行的shell中内置ulimit
bash)来限制成功创建的线程的数量(实际上是“任务”) )。
但我不确定这是个好主意。编写良好的程序将测试pthread_create(3)(内部调用clone(2))的失败。写得不好的程序会崩溃。
也许该程序正在使用某个线程池,并且有一些方法可以限制该池的大小。顺便说一下,你可以只在两个核心上运行几十个线程 - 甚至是一个核心 - (特别是在大多数情况下线程空闲时,例如poll(2) - 或等待I / O)。
PS。出于基准测试目的,您可能应该更多地关注限制核心数量(使用taskset
)而不是限制线程数。
答案 2 :(得分:1)
如果程序试图产生线程,除了程序本身有一些限制线程的命令行选项之外,你无法做任何事情来阻止它。