You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,仍有多个测试并行运行。请问:

  1. 为什么Bazel会忽略我的CPU需求标签?按6核需求,8核机器应该只能同时运行1个这类测试。
  2. 输出中的[Sched]行是什么含义?
    使用的Bazel版本为7.2.0。
解答

一、CPU标签被忽略的原因

Bazel的cpu:N标签默认只是资源请求的提示,不会被严格强制执行,核心问题出在调度逻辑和参数配置上:

  • 你设置的--local_resources=cpu=HOST_CPUS只是告诉Bazel本地总CPU资源为8核,但默认调度器不会根据测试的cpu:标签来计算可并行的任务数,而是基于--jobs参数(这里等于CPU核心数)和自身的轻量调度逻辑来并行执行。
  • 要让cpu:标签生效,必须启用严格资源调度,添加参数:
    --experimental_enable_resource_scheduling
    
    启用后,Bazel会根据测试的cpu:标签请求和本地总CPU资源来计算并行数。比如8核机器上每个测试请求6核,此时最多只能同时运行1个测试,第二个测试会因资源不足进入等待队列。
  • 补充:cpu:标签的数值是相对权重,但启用严格调度后,这个权重会映射到你设置的--local_resources中的CPU总量,能达到按核心数限制并行的效果。

二、[Sched]行的含义

带[Sched]标记的测试任务已经被调度器排入等待队列,但还没有分配到足够的资源(比如CPU、沙箱),暂时无法开始执行。这类任务会在当前运行的测试释放资源后,由调度器依次安排启动。

内容的提问来源于stack exchange,提问作者Calebmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:40:11