首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GNU会使运行顺序,即使我增加了--作业--而且--最大负载甚至不接近?

为什么GNU会使运行顺序,即使我增加了--作业--而且--最大负载甚至不接近?
EN

Stack Overflow用户
提问于 2020-08-19 13:15:17
回答 2查看 145关注 0票数 0

这是在GNU 3.82,RHEL 7上运行的。即使我在--jobs中通过了,Make似乎也是按顺序运行的。

我正在做大约700 K的琐碎工作--将大型gzip文件连接到其他gzip文件上。如果只有一个文件要连接,那么我将创建一个符号链接。以下是命令:

代码语言:javascript
复制
# Pattern to rebuild gzip file - concatenate if needed, otherwise just link
$(THISDIR)/%.tgz:
    mkdir -p $$(dirname $@) && \
    if [ $$(echo '$^' | wc -w) -gt 1 ]; then cat $^ > $@; else ln -s $^ $@; fi

为了避免另一次shell调用,我已经被&&隔开了,没有什么区别。

在700000个就业岗位中,约有60万人只是在创造象征性的联系。对于其余部分,要连接的文件的平均数量为4个。

为什么这么慢?我得到了5-8 TPS。更重要的是,即使我指定了(在有64个CPUS的计算机上):

代码语言:javascript
复制
make --jobs --max-load=48

我在top上看到的进程很少。因此,看来Make根本不运行并行作业。在GNU Make上,并行性是否有一个最小的作业长度来有效工作?

top现在的平均负载是

代码语言:javascript
复制
top - 22:50:32 up 3 days, 13:13, 32 users,  load average: 7.96, 7.44, 5.73

以下是一些可能有帮助的进一步细节:

  1. Make本身运行在接近100%的CPU上。
  2. 除了目标和依赖于同一条规则之外,其他任何文件之间不存在依赖关系。换句话说,在$^.
  3. Files和$@中都没有出现的文件正在创建并从NFS挂载中读取
  4. --我已经生成了700 K的依赖项,作为规则读取到带有include的Makefile中。这个过程本身需要25分钟左右。
EN

回答 2

Stack Overflow用户

发布于 2020-08-27 04:35:02

可以提高性能,特别是在使用(gnu) make函数替换shell命令重新生成大量文件时。这将减少完成任务所需的“叉”和“exec”的数量:

代码语言:javascript
复制
%.tgz:
        mkdir -p $(<D) && \
        $(if $(findstring $(words $^),1),ln -s $^ $@, cat $^ > $@)

对于mkdir命令,使用$(<D)将消除对dirname的调用

对于cat/ln命令,使用$(findstring ...)words将替换echo ... | wc管道,$if(...)将替换shell if语句。

总的来说,每个目标只有两个命令(mkdir,cat/ln),而不是5个命令(mkdir,dirname,echo,wc,cat/ln)。性能约为2倍。

票数 2
EN

Stack Overflow用户

发布于 2020-08-20 23:53:54

Make花了很大一部分准备时间,试图将每个目标与C文件之类的所有内置规则相匹配。添加

代码语言:javascript
复制
.SUFFIXES:
MAKEFLAGS += --no-builtin-rules

产生了巨大的变化。在阅读完所有的模式之后,它仍然要花上几分钟时间,但它的好处现在已经超过了成本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63487828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档