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

Yocto Poky构建随机失败,是否因内存压力及OOM杀死所致?

Poky构建随机构建失败问题排查与解决

问题描述

构建最新版Poky时出现多种随机构建失败,报错包含汇编警告/错误,且g++提示cc1plus进程被终止。多次重试后构建成功。排查发现dmesg中有内存压力日志,且存在大量OOM杀死cc1plus进程的记录。

环境信息

  • 运行环境:ESXI服务器上的36核Ubuntu 24 LTS虚拟机
  • 构建时系统内存及swap使用情况:
$ free
               total        used        free      shared  buff/cache   available
Mem:        32903080    13796868    10145592         748     9847580    19106212
Swap:        2097148     1966256      130892

疑问

  1. 这些随机错误是否由内存压力导致?
  2. bitbake是否因线程过多引发OOM杀死进程?该如何解决?比如限制构建线程?

问题分析与解决

1. 随机错误与内存压力的关联

是的,这些随机构建失败完全由内存压力+OOM杀死进程导致。cc1plus是g++的后台编译进程,OOM Killer会在系统内存耗尽时优先杀死占用内存高的进程,而编译进程恰好是内存大户。重试后成功是因为重试时系统内存占用波动,刚好没触发OOM。

从你的free输出看,Swap已接近耗尽(仅剩余130892KB),说明系统已经在大量使用虚拟内存,内存压力极大,这是OOM触发的直接原因。

2. bitbake线程过多的问题与解决方法

bitbake默认会根据CPU核心数设置并行构建线程数(通常为CPU核心数*2),36核的话默认会开启72个并行编译线程,每个编译进程(比如cc1plus)会占用几百MB甚至上GB内存,72个线程同时跑很容易把内存耗尽,触发OOM。

解决方法如下:

  • 限制bitbake并行线程数:
    构建时通过命令行临时指定:
    bitbake -j 16 <recipe-name>
    
    或者在local.conf中添加永久配置:
    BB_NUMBER_THREADS = "16"
    PARALLEL_MAKE = "-j 16"
    
    建议从16开始尝试,根据内存使用情况调整,确保构建时available内存不会降到极低,Swap也不会耗尽。
  • 增大Swap分区:
    当前Swap只有2GB,远不足以支撑大并行度的编译。可以临时增大Swap文件:
    # 创建8GB Swap文件
    sudo fallocate -l 8G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
    要永久生效,把/swapfile none swap sw 0 0添加到/etc/fstab中。
  • 优化编译内存占用:
    关闭调试信息编译能有效降低单个编译进程的内存占用,在local.conf中添加:
    DEBUG_BUILD = "0"
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:54:58