使用Bazel在Ubuntu 20.04构建Drake源码运行示例时出现gcc编译报错
错误根因
gcc: fatal error: Killed signal terminated program cc1plus是系统内存不足触发OOM(内存溢出)杀手进程,主动终止了资源占用过高的编译进程导致的。Drake的pybind11绑定模块编译单进程峰值内存占用可达8~12GB,默认并行编译时总内存需求超过32GB,小内存设备默认参数编译必然触发OOM。
解决方法
限制Bazel并行编译任务数
根据设备物理内存大小调整--jobs参数,8G内存建议设置--jobs=1,16G内存建议设置--jobs=2,32G及以上可以不用调整。修改后的编译命令如下:bazel run --jobs=2 //tutorials:mathematical_program若调整后依然触发OOM,可继续降低
--jobs的数值。新增swap交换分区扩容虚拟内存
物理内存不足时可以新增16G及以上容量的swap文件作为虚拟内存兜底,操作命令如下:# 创建16G大小的swap文件 sudo fallocate -l 16G /swapfile # 配置swap文件权限 sudo chmod 600 /swapfile # 格式化为swap格式 sudo mkswap /swapfile # 启用swap文件 sudo swapon /swapfile若需要开机自动挂载swap,可将
/swapfile none swap sw 0 0写入/etc/fstab文件。可选:关闭Python绑定编译(无pydrake使用需求时用)
若不需要使用pydrake功能,可以加参数跳过Python绑定编译,大幅降低内存占用和编译耗时:bazel run --define=WITH_PYTHON_BINDINGS=OFF //tutorials:mathematical_program
内容的提问来源于stack exchange,提问作者Dmitriy Ogureckiy
相关产品推荐
相关产品推荐

