Bazel为何忽略sh_test的CPU需求标签?并行测试及[Sched]行疑问
问题描述
我通过Bazel的sh_test()定义了大量大型集成测试,配置如下:
sh_test( name = "example_integration_test", tags = ["cpu:6"], size = "large", flaky = True, )
向Bazel传递的资源参数:
--jobs=HOST_CPUS --local_resources=cpu=HOST_CPUS --local_resources=memory=HOST_RAM
在8核CPU的CI机器上,Bazel多数时候会同时运行4个测试任务,输出示例(测试名称已替换):
(21:21:56) [2,681 / 2,705] 16 / 40 tests; 8 actions, 4 running; last test: //:example_1_integration_test Testing //:example_2_integration_test; 519s linux-sandbox, remote-cache Testing //:example_3_integration_test; 357s linux-sandbox, remote-cache Testing //:example_4_integration_test; 82s linux-sandbox, remote-cache Testing //:example_5_integration_test; 0s linux-sandbox, remote-cache [Sched] Testing //:example_6_integration_test; 228s [Sched] Testing //:example_7_integration_test; 205s [Sched] Testing //:example_8_integration_test; 183s [Sched] Testing //:example_9_integration_test; 159s
我尝试把CPU标签改成cpu:40,仍有多个测试并行运行。请问:
- 为什么Bazel会忽略我的CPU需求标签?按6核需求,8核机器应该只能同时运行1个这类测试。
- 输出中的
[Sched]行是什么含义?
使用的Bazel版本为7.2.0。
解答
一、CPU标签被忽略的原因
Bazel的cpu:N标签默认只是资源请求的提示,不会被严格强制执行,核心问题出在调度逻辑和参数配置上:
- 你设置的
--local_resources=cpu=HOST_CPUS只是告诉Bazel本地总CPU资源为8核,但默认调度器不会根据测试的cpu:标签来计算可并行的任务数,而是基于--jobs参数(这里等于CPU核心数)和自身的轻量调度逻辑来并行执行。 - 要让
cpu:标签生效,必须启用严格资源调度,添加参数:
启用后,Bazel会根据测试的--experimental_enable_resource_schedulingcpu:标签请求和本地总CPU资源来计算并行数。比如8核机器上每个测试请求6核,此时最多只能同时运行1个测试,第二个测试会因资源不足进入等待队列。 - 补充:
cpu:标签的数值是相对权重,但启用严格调度后,这个权重会映射到你设置的--local_resources中的CPU总量,能达到按核心数限制并行的效果。
二、[Sched]行的含义
带[Sched]标记的测试任务已经被调度器排入等待队列,但还没有分配到足够的资源(比如CPU、沙箱),暂时无法开始执行。这类任务会在当前运行的测试释放资源后,由调度器依次安排启动。
内容的提问来源于stack exchange,提问作者Calebmer
相关产品推荐
相关产品推荐

