如何使用gnu Make确定--load-average的良好值?

Zit*_*rax 13 gcc load gnu-make command-line-arguments

在Make this flag中存在:

-l [load], - load-average [= load]指定如果有其他作业正在运行且负载平均值至少为load(浮点数),则不应启动新作业(命令).如果没有参数,则删除先前的加载限制.

您是否有一个很好的策略来确定负载限制的值?我的机器似乎差别很大.

Pet*_*aut 6

我建议不要使用该-l选项。

原则上,-l似乎优于-j. -j说,开始这么多工作。 -l说,确保这么多作业正在运行。通常,这些几乎是同一件事,但是当您有 I/O 绑定作业是其他奇怪的事情时,那么-l应该会更好。

也就是说,平均负载的概念有点可疑。它必然是系统上发生的事情的样本。因此,如果您运行make -j -l N(对于某些N)并且您有一个编写良好的 makefile,那么即使在进行系统负载的第一个样本之前,make 也会立即启动大量作业并耗尽文件描述符或内存。此外,平均负载的计算因操作系统而异,有些晦涩的操作系统根本没有。

在实践中,您会很好地使用,-j并且不会那么头痛。要从构建中获得更多性能,请调整您的 makefile,使用编译器选项,并使用 ccache 或类似工具。

(我怀疑该-l选项的最初原因源于多处理器很少见且 I/O 非常慢的时代。)

  • 你最近真的尝试过吗?从 GNU make 3.81(2006 年发布)开始,GNU make 实现了一种算法,可以根据 make 在最后一秒内调用的作业数量来调整其系统平均负载的想法。这当然不是理想的,因为这只是一个猜测,但它应该可以防止 100 个作业在 make 开始时立即被调用。 (3认同)
  • 不幸的是,根据我的经验,您还需要 -l。问题在于,您通常会有多个复杂的 make 系统,它们不一定相互了解,因此共享作业计数的机制并不总是有用。(尝试包括 openssl、dbus、curl 和其他十几个 Android 和 iOS 库的构建;您将开始构建并不真正属于您自己的构建系统的构建。) (3认同)

Max*_*kin 5

可接受的负载取决于CPU核心的数量.如果有一个核心,则超过1的负载平均值会超载.如果有四个核心,则超过四个的负载平均值是过载.

人们通常只使用-j开关指定核心数.

请参阅此处的一些经验数据:https://stackoverflow.com/a/17749621/412080

  • 实验上虽然我注意到在一台机器上同时使用-j时,我在4核机器上使用-j8获得了最快的编译. (2认同)
  • 我有类似的经历.可能是因为存在一些I/O绑定的编译阶段,因此当一个编译器进程阻塞I/O时,另一个可以使用该时间进行编译. (2认同)