MAKE -j多任务并行机制在服务器环境下失效问题排查
Make并行编译性能异常:多核服务器CPU利用率极低
使用make -j编译约1700个文件时,出现以下异常表现:
- 8核PC:编译耗时13分钟,CPU负载达100%
- 56核服务器:编译耗时7分钟,CPU负载仅10%
该现象在MINGW64、PowerShell、CMD三种环境下测试结果一致。
Make目标依赖关系
all → all_build → $(BUILD_DIR)/$(TARGET_BASENAME).elf → $(BUILD_DIR)/ld.args → $(OBJECTS) → $(BUILD_DIR)/%.o → ...
其中**$(BUILD_DIR)/%.o**对应约1700个目标文件,占据了编译过程的绝大部分耗时。
Makefile核心片段
####################################### # build the application ####################################### all: all-build @( \ tTime=$$(($$(date +%s) - $(START_TIME))); \ if [ $$tTime -lt 60 ]; then \ echo "Build Finished (took $$(($$tTime))s)"; \ else \ echo "Build Finished (took $$(($$tTime / 60))m:$$(($$tTime % 60))s)"; \ fi \ ) @echo ' ' all-build: $(MAKE) -j -f $(THIS_MAKEFILE) --no-print-directory $(BUILD_DIR)/$(TARGET) $(BUILD_DIR)/$(TARGET_BASENAME).elf: $(BUILD_DIR)/ld.args @mkdir -p $(@D) @echo '[LD]: $@' $(CC) "@$(BUILD_DIR)/ld.args" -o $@ @echo 'Finished building target: $@' @echo ' ' ifneq (, $(DST_DIR)) ifneq (, $(DST_JSON)) $(MAKE) -j -f $(THIS_MAKEFILE) --no-print-directory post-build-elf endif endif @echo '[SZ]: $@' $(SZ) --format=berkeley $@ @echo ' ' $(BUILD_DIR)/%.o: $(CURDIR)/%.c $(BUILD_DIR)/cc.args @mkdir -p $(@D) @echo '[CC]: $<' $(CC) "@$(BUILD_DIR)/cc.args" -MD -o "$@" "$<" @echo 'Finished building: $<' @echo ' ' $(BUILD_DIR)/%.o: $(CURDIR)/%.s $(BUILD_DIR)/as.args @mkdir -p $(@D) @echo '[AS]: $<' $(CC) "@$(BUILD_DIR)/as.args" -o "$@" "$<" @echo 'Finished building: $<' @echo ' ' $(BUILD_DIR)/ld.args: $(THIS_MAKEFILE) $(LD_SRCS) $(addprefix $(BUILD_DIR)/, $(OBJECTS)) $(USER_LIBS) | $(BUILD_DIR) $(file > $(BUILD_DIR)/ld.args,$(subst $(SPACE),$(NEWLINE),$(addprefix -T , $(LD_SRCS)))) ifneq ($(CC_BIN), ccarm) $(file >> $(BUILD_DIR)/ld.args,$(subst $(SPACE),$(NEWLINE),-Wl,-Map,"$(BUILD_DIR)/$(TARGET_BASENAME).map")) endif $(file >> $(BUILD_DIR)/ld.args,$(subst $(SPACE),$(NEWLINE),$(LD_ARGS))) $(file >> $(BUILD_DIR)/ld.args,$(subst $(SPACE),$(NEWLINE),$(addprefix $(BUILD_DIR)/, $(OBJECTS)) $(USER_LIBS))) $(file >> $(BUILD_DIR)/ld.args,$(subst $(SPACE),$(NEWLINE),$(LIBS))) @echo 'Finished building: $@' @echo ' ' $(BUILD_DIR): @mkdir -p $@ post-build-elf: ifneq ($(CC_BIN), ccarm) $(dir $(CURDIR)/$(THIS_MAKEFILE))/PostBuild.bat \ $(DST_DIR) $(DST_JSON) $(BUILD_DIR)/ $(TARGET_BASENAME) $(CC_PATH) $(PREFIX) $(user_postbuild) $(arg_postbuild) else $(dir $(CURDIR)/$(THIS_MAKEFILE))/PostBuild.bat \ $(DST_DIR) $(DST_JSON) $(BUILD_DIR)/ $(TARGET_BASENAME) $(CC_PATH_s32k3xx_gcc) $(PREFIX) $(user_postbuild) $(arg_postbuild) endif @echo ' '
CPU负载情况
8核PC

56核服务器

内容的提问来源于stack exchange,提问作者yyd
相关产品推荐
相关产品推荐

