为什么 bazel 限制运行 24 个操作,即使已设置构建选项"--jobs=240"?



我已经为distcc配置了一个工具链,参数通过包装器脚本转发到distcc。

distcc_wrapper_gcc.sh:

#!/bin/bash
set -euo pipefail
ccache distcc g++ "$@"

我想在之前启动240个类似"make-j240"的并行任务。构建命令是:

bazel build --action_env=HOME --action_env=DISTCC_HOSTS="***" --config=joint_compilation --jobs=240 target

但结果是:238 actions, 24 running

如果我将--jobs设置为低于24,则运行的操作数将等于24,否则无论参数中的值如何,都会有多达24个进程在运行。

如果只有24个操作在运行,那么编译确实需要很长时间。跑步动作有硬性限制吗?(这台计算机有12个cpu,每个内核2个线程)

有没有办法打破或忽略这个限制?


下面是配置内容。

.bazelrc

# Create a new CROSSTOOL file for our toolchain.
build:joint_compilation --crosstool_top=//toolchain:distcc
# Use --cpu as a differentiator.
build:joint_compilation --cpu=joint_compilation
# Specify a "sane" C++ toolchain for the host platform.
build:joint_compilation --host_crosstool_top=@bazel_tools//tools/cpp:toolchain

工具链/BILD

package(default_visibility = ['//visibility:public'])
cc_toolchain_suite(
name = "distcc",
toolchains = {
"joint_compilation": ":joint_compilation_toolchain",
"distcc|joint_compilation": ":joint_compilation_toolchain",
},
)
filegroup(name = "empty")
filegroup(
name = "all",
srcs = [
"distcc_wrapper_gcc.sh",
],
)
cc_toolchain(
name = "joint_compilation_toolchain",
toolchain_identifier = "joint_compilation-toolchain",
all_files = ":all",
compiler_files = ":all",
cpu = "distcc",
dwp_files = ":empty",
dynamic_runtime_libs = [":empty"],
linker_files = ":all",
objcopy_files = ":empty",
static_runtime_libs = [":empty"],
strip_files = ":empty",
supports_param_files = 0,
)

工具链/CROSSTOOL

major_version: "1"
minor_version: "0"
default_target_cpu: "joint_compilation"
toolchain {
toolchain_identifier: "joint_compilation-toolchain"
host_system_name: "i686-unknown-linux-gnu"
target_system_name: "joint_compilation-unknown-distcc"
target_cpu: "joint_compilation"
target_libc: "unknown"
compiler: "distcc"
abi_version: "unknown"
abi_libc_version: "unknown"
tool_path {
name: "gcc"
path: "distcc_wrapper_gcc.sh"
}
tool_path {
name: "g++"
path: "distcc_wrapper_gcc.sh"
}
tool_path {
name: "ld"
path: "/usr/bin/ld"
}
tool_path {
name: "ar"
path: "/usr/bin/ar"
}
tool_path {
name: "cpp"
path: "distcc_wrapper_gcc.sh"
}
tool_path {
name: "gcov"
path: "/usr/bin/gcov"
}
tool_path {
name: "nm"
path: "/usr/bin/nm"
}
tool_path {
name: "objdump"
path: "/usr/bin/objdump"
}
tool_path {
name: "strip"
path: "/usr/bin/strip"
}

cxx_builtin_include_directory: "/usr/lib/gcc/"
cxx_builtin_include_directory: "/usr/local/include"
cxx_builtin_include_directory: "/usr/include"
}

除非distcc和bazel之间有一些我不知道的集成,否则bazel认为它在本地机器上执行所有操作,因此受到本地机器资源的限制。有一个本地资源arg可以调整,但我强烈建议按预期使用bazel。远程构建时,这意味着使用具有REAPI功能的构建场。

至少存在两个:

  • https://github.com/bazelbuild/bazel-buildfarm

    • 官方impl,由优步启动,被许多人使用
    • 体系结构中的两个组件:服务器(调度程序)和工作程序
    • 缓存可以存储在worker上,也可以存储在基于grpc的缓存中到目前为止,后者似乎没有什么用处
  • java编写
  • https://github.com/EdSchouten/bazel-buildbarn

    • go编写
    • 有些不同的体系结构(前端/调度程序/工作程序)
    • 更灵活的缓存
  • 我已经尝试过前者,即将尝试后者——部分原因是缓存,部分原因是语言:我发现go比java更容易读(写)。

    最新更新