为什么人们在拥有双核 CPU 时推荐使用 -j3 选项?

18 make gentoo

在 Gentoo Linux 中,可以设置MAKEOPTS变量/etc/portage/make.conf来告诉make在构建包时它应该并行运行多少作业。因为我有一个双核 CPU,我天真地选择了使用这个-j2选项:一个核心一个工作,所以两者都有事可做。“问题”是有很多参考资料告诉拥有双核 CPU 的用户改为设置该-j3选项。他们之中有一些是:

例如,Gentoo 手册说:

一个不错的选择是系统中的 CPU(或 CPU 内核)数加一,但此指南并不总是完美的。

但是“CPU + 1”规则的基本原理是什么?为什么要加班?

make.conf(5) 手册页甚至说:

建议的设置介于 CPUs+1 和 2*CPUs+1 之间。

我还在make信息页面和make手册页解释中阅读了该-j选项的第 5.4 节(并行执行),但似乎没有答案。

Gil*_*il' 13

没有一条总是有效的简单规则。人们可能会推荐一个特定的数字,因为他们在特定的机器上尝试了特定的编译并且这是最好的设置,或者因为他们遵循了一些与现实可能有或可能没有关系的推理。

如果您拥有大量 RAM,那么长时间编译的限制因素将是 CPU 时间。那么每个 CPU 一个任务,加上那些偶尔的 I/O 块的一个挂起任务,是一个很好的设置。这使得它-j3适用于双核 CPU(或者更准确地说,适用于双 CPU 机器——如果每个内核都是超线程的,那就是 4 个 CPU,所以-j5)。

如果您的 RAM 非常少,那么一个限制因素可能是您不能有很多并发作业,否则它们会不断相互交换。例如,如果您无法在内存中轻松容纳两个编译器实例,则make -j2可能已经比make. 由于这取决于您一次可以在 RAM 中容纳多少编译器进程,因此无法推导出一般数字。

在这两者之间,拥有更多工作可能是有益的。如果每个编译器进程都很小,但整个构建涉及大量数据,那么磁盘 I/O 可能是阻塞因素。在这种情况下,您需要同时为每个 CPU 执行多个作业,以便始终有一个作业使用每个 CPU,而其他作业正在等待 I/O。同样,这非常依赖于构建作业和可用 RAM,这里取决于可用于数据缓存的内容(在此之后有太多作业会过多污染缓存)。


poi*_*ige 7

我想这有点启发式——允许make启动CPUs + 1进程是为了确保:

  1. 刚刚完成的工作进程和尚未运行的工作进程之间不会有差距——有点像预填充运行队列。
  2. 通过运行队列预填充不会有太多的竞争进程带来明显的开销。

但是,再一次,这是启发式的,FreeBSD 的手册仍然建议 make -j4使用单个 CPU。


Net*_*tch 5

通常,有理由启动比内核数量更多的作业。对于使用 gcc 的 C 编译,如果 -pipe 没有在 gcc 选项中定义,它会使用临时文件按顺序执行其操作(预处理、首次运行、优化和汇编);-pipe 将此更改为在子进程之间使用管道。(添加 -pipe 是 FreeBSD 的默认设置,但在 Linux 上不是传统的。)因此,如果您有 2 个内核并允许并行执行 2 个作业,它们将在磁盘 I/O 上花费一些时间。添加 1 个工作的建议似乎与此细节有关。但是要获得最终答案,您应该找到谁以及何时添加了此建议并询问他:) 或在 Gentoo devels 的邮件列表中询问。