bazel - 为什么即使设置了构建选项“--jobs=240”,bazel 也会限制运行 24 个操作?
问题描述
我已经为 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 个动作,编译确实需要很长时间。跑步动作有硬性限制吗?(这台计算机每个核心有 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
工具链/构建
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 的 buildfarm。
至少存在两个:
https://github.com/bazelbuild/bazel-buildfarm
- 由 Uber 发起的官方 impl,被许多人使用
- 架构中的两个组件:服务器(调度程序)和工作人员
- 缓存可以存储在worker上,也可以存储在基于grpc的缓存中
- 到目前为止,后者似乎没有什么用处
- 写在
java
https://github.com/EdSchouten/bazel-buildbarn
- 写在
go
- 有些不同的架构(前端/调度程序/工作人员)
- 更灵活的缓存
- 写在
我已经尝试了前者,并且即将尝试后者 - 部分是由于缓存,部分是由于语言:我发现 go 比 java 更容易阅读(和编写)。
推荐阅读
- xml - 如果未对 .xsd 文件进行任何更改,如何禁用 .cxx .hxx 文件的生成
- c++ - 在 C++ 中使用派生类类型作为基方法的参数
- arrays - 从C中的函数返回具有多个可变长度数组的结构
- java - 在 PostgreSQL 数据库中插入带有 jOOQ 的 SQL 枚举
- rust - 如何从 Chrono::DateTime 中获取年月日组件?
- python - Docker 容器中的 Selenium 找不到 chromedriver
- php - Google Drive API - 使用 PHP Curl 可恢复上传无响应
- woocommerce - Wocomerce 自定义支付网关
- docker - 从 github 构建 grafana 的生产自定义 docker 镜像
- api - YouTube 数据 API 未实时返回