为什么人们在使用双核CPU时建议使用-j3选项进行制造?


18

在Gentoo Linux中,可以设置MAKEOPTS变量/etc/portage/make.conf以告知make构建软件包时应并行运行多少个作业。由于我有一个双核CPU,因此我天真地选择使用该-j2选项:每个核一个作业,因此两者都有事情要做。“问题”有很多参考,它们告诉拥有双核CPU的用户设置该-j3选项。他们之中有一些是:

例如,Gentoo手册中说:

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

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

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

建议的设置在CPU + 1和2 * CPU + 1之间。

我还阅读了make信息页的5.4节(并行执行)和make-j选项的手册页说明,但似乎那里没有答案。



Answers:


13

没有一条始终有效的简单规则。人们可能会推荐一个特定的数字,因为他们在特定的计算机上尝试了特定的编译,这是最佳设置,或者因为他们遵循了可能与现实不相关的某种推理。

如果您拥有大量的RAM,那么长时间编译的限制因素就是CPU时间。那么,每个CPU一个任务,再加上那些偶尔的I / O块的待处理任务,是一个不错的设置。这使得它可以-j3用于双核CPU(或更准确地说,对于双CPU机器-如果每个核都是超线程的,则为4个CPU,因此-j5)。

如果您的RAM很少,那么一个限制因素可能是您不能有很多并发作业,否则它们将继续使对方掉出。例如,如果您不能舒适地将两个编译器实例容纳在内存中,则make -j2可能已经比慢make。由于这取决于您一次可以在RAM中容纳多少个编译器进程,因此无法得出一般数字。

在这两者之间,拥有更多工作可能是有益的。如果每个编译器进程很小,但是整个构建过程涉及很多数据,则磁盘I / O可能是阻碍因素。在这种情况下,每个CPU一次需要多个作业,因此每个CPU总是有一个作业,而其他CPU在等待I / O。再次,这非常依赖于构建作业和可用的RAM,此处取决于可用于数据缓存的内容(这是最佳选择,之后有太多的作业会对缓存造成太多污染)。


我不知道如果CPU内核是超线程的,那么它们每个都算作两个。无论如何,看来我的CPU不支持超线程。
Francesco Turco 2012年

我接受了这个答案。无论如何,我选择坚持使用-j2我的系统。这是因为我尝试同时出现gccfirefox同时设置从-j1到的设置-j5(总共有10个emerge命令),似乎虽然-j2绝对比快-j1,但其他三个设置与相同-j2
Francesco Turco 2012年

7

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

  1. 在刚刚完成的工作流程与尚未运行的工作流程之间不会有空隙-有点像预填充运行队列。
  2. 这样就不会有太多竞争性流程,而不会给运行队列预填充带来明显的开销。

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


5

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


2

基本上,这个数字就是作者所说的常识。充其量,这是一个很好的猜测。据我所知,键入时产生的make进程make已经计算在内,这样-j3您就可以等待主进程,而另外两个正在编译。

但是,当我使用Gentoo时,经验法则是<#cpus>*2 + 1

这一切都取决于您的鸡的踪迹,茶叶或魔术8球告诉您需要进行的磁盘I / O和当前linux内核的调度。[从这篇文章的核心开始]从我的个人经历(-j不是Gentoo特定的),#cpus +1和#cpus * 2 +1之间的所有内容都会产生很好的效果[结束这篇文章的核心],并且平均而言,您几乎不会注意到任何差异。如今,处理器和内核非常出色。

但在以下情况下所有这些更改都会发生:a)您实际上使用多个框进行编译(du'h)或b)正在开发自己的代码

更高的 -j属性更有可能显示以前未知的依赖关系。

另外,请注意:不要按内核数来计算,而要按CPU占用的并发流数来计算。(大头!)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.