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
疑问
- 这些随机错误是否由内存压力导致?
- 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中添加永久配置:
建议从16开始尝试,根据内存使用情况调整,确保构建时BB_NUMBER_THREADS = "16" PARALLEL_MAKE = "-j 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
相关产品推荐
相关产品推荐

