17 限制主机资源使用量
有时需要 加快构建,有时则需要限制 OpenEmbedded Build System 使用的资源,尤其是在多个用户启动高负载 构建的共享基础设施上,或在性能较低的机器上构建时。
本文介绍可用于限制构建系统资源使用量的配置变量。这些变量应在 configuration file 中设置,对整个构建环境生效。各变量的详细说明 还可参阅词汇表。
-
对 BitBake 同时运行的线程数设置硬限制。降低此值可限制 BitBake 线程数,但不能阻止单个任务启动更多编译线程,见 PARALLEL_MAKE。
-
类似 BB_NUMBER_THREADS,但限制的是执行任务之前解析环境所用的 线程数。
-
以
-jN的形式设置,其中N为正整数,控制启动make时使用的 线程数。此变量不仅适用于make,也适用于 meson、 cmake 等类定义的编译命令,即 do_compile 任务。如果某个配方需要与其余构建不同的限制,也可以在 build/conf/local.conf configuration file 中添加:
PARALLEL_MAKE:pn-linux-yocto = "-j4"
上例将
linux-yocto配方中make使用的线程数限制为 4。 -
类似 PARALLEL_MAKE,但控制 do_install 任务使用的线程数。
PARALLEL_MAKEINST 默认与 PARALLEL_MAKE 相同。
备注
本文多数变量用于限制 CPU 负载,但构建时也可能耗尽主机物理内存,触发
内存不足终止机制,突然终止相关进程。这可能使对应任务日志出现看似奇怪
的失败。内存不足终止机制只向内核 dmesg 日志记录信息,因此遇到意外构建
失败时,建议使用 dmesg 命令密切检查。
这种情况下,建议降低 PARALLEL_MAKE 和 BB_NUMBER_THREADS。
BB_PRESSURE_MAX_CPU、BB_PRESSURE_MAX_IO 和 BB_PRESSURE_MAX_MEMORY:
这些变量控制系统压力上限,PSI 定义见 https://docs.kernel.org/accounting/psi.html。它们根据当前系统压力动态 限制 BitBake 线程数。这要求主机支持内核 PSI 功能;否则可使用 下文的 BB_LOADFACTOR_MAX。
取值为 1 到 1000000 之间的正整数:1 表示极低上限,1000000 则几乎不可能 达到。不建议设为 2 等极低值,否则 BitBake 大多数时候会只使用 1 个线程。
按以下步骤确定适合主机的合理值:
在 Bash Shell 中启动以下脚本,估算当前主机压力:
pressure="0" while true; do prev_pressure="$pressure" pressure=$(head -1 /proc/pressure/cpu | cut -d' ' -f5 | cut -d'=' -f2) echo $(( $pressure - $prev_pressure )) sleep 1 done
备注
将
/proc/pressure/cpu改为/proc/pressure/io或/proc/pressure/memory,即可更换监控的压力类型。按 Control + C 可停止脚本。
然后启动高负载构建,例如:
bitbake virtual/kernel -c compile -f
随时可按 Control + C 停止构建。
观察控制台输出的数值,它们反映构建期间压力的变化。可以选择低于最大 输出值的数值作为初始设置。
设置初值后,运行 BitBake 时添加
--verbose和--log-domains标志,可以观察压力何时超过上述变量设定的上限:$ bitbake virtual/kernel -c compile -f --verbose --log-domains BitBake.RunQueue.PSI
同时,可以跟踪输出日志文件中的压力信息:
$ tail -F tmp/log/cooker/<machine>/console-latest.log | grep "Pressure status changed" NOTE: Pressure status changed to CPU: False, IO: None, Mem: None (CPU: 1105.9/2.0, IO: 0.0/2.0, Mem: 0.0/2.0) - using 1/64 bitbake threads ...
注意括号中的数值:
CPU: 1105.9/2.0, IO: 0.0/2.0, Mem: 0.0/2.0,分别 对应 CPU、IO 和内存的当前压力。如果 BitBake 频繁输出这些消息, 很可能是压力上限过低,可以适当调高。-
此变量通过监控主机当前 CPU 负载,限制 BitBake 启动的线程数。 达到 BB_LOADFACTOR_MAX 设定的上限时,BitBake 输出如下:
Load average limiting set to True as load average: 0.7188262939453125 - using 37/64 bitbake threads
此变量用于无法获取压力信息的系统。如果设置了 BB_PRESSURE_MAX_CPU、 BB_PRESSURE_MAX_IO 或 BB_PRESSURE_MAX_MEMORY 中任意一个, 此变量将不生效。