21

我正在一个项目中工作,该项目有许多 bitbake 食谱并且需要很多时间 - 在某些情况下长达 13 小时。我是 bitbake 的新手,我正在寻求一些方法:

  • 检查哪些软件包需要更多构建
  • 检查非常长的依赖项(我已经使用了 bitbake -g)
  • 检查是否有任何循环依赖以及如何解决它们
  • 检查是否有未使用的食谱以及如何安全删除它们

或使用任何工具更好地管理和理解食谱的任何建议。

或任何用于加速构建过程的方法/方式。

欢迎提出建议和确切的技术。

编辑日期 07/08/2013:

找到了这个用于跟踪依赖项的有用工具

https://github.com/scottellis/oe-deptools

描述:

./oey.py -h

Usage: ./oey.py [options] [package]

Displays OE build dependencies for a given package or recipe.
Uses the pn-depends.dot file for its raw data.
Generate a pn-depends.dot file by running bitbake -g <recipe>.

Options:
-h      Show this help message and exit
-v      Show error messages such as recursive dependencies
-r      Show reverse dependencies, i.e. packages dependent on package
-f      Flat output instead of default tree output
-d <depth>      Maximum depth to follow dependencies, default and max is 10
-s      Show child package dependencies that are already listed
        as direct parent dependencies.

Provide a package name from the generated pn-depends.dot file.
Run the program without a package name to get a list of
available package names.
4

2 回答 2

25

这是一个非常广泛的问题!

首先,这里总结一下在使用 openembedded/yocto 项目时如何检查构建性能和依赖关系。这回答了问题的第一部分。

哪些软件包需要更多时间来构建?

使用带有 pybootchartgui 工具的buildstats生成构建图表。

细节:

USER_CLASSES += "buildstats"在你的$BUILDIR/conf/local.conf 文件中设置。这会将详细的性能数据转储到 $BUILDDIR/tmp/buildstats/<DATE>. 接下来使用pybootchartgui.py脚本 (in poky/scripts/pybootchartgui) 生成图表。这将帮助您定位构建中可能存在的瓶颈。当然,如果你有很多食谱要烘焙,你的图表会很大。要消除一些噪音,请使用-m MINTIME命令行选项。

例如:

poky/scripts/pybootchartgui/pybootchartgui.py -m 600 $BUILDDIR/tmp/buildstats/201312310904

只会显示运行时间超过 10 分钟(600 秒)的任务(do_compile、do_fetch 等)。

如何检查包依赖关系?

要探索特定包的依赖关系,请使用 depexp 实用程序。例如,要探索 eglibc 的依赖关系,请使用:

bitbake -g -u depexp eglibc

这将更好地理解每个配方在运行和编译时所依赖的内容。

如何检查是否存在任何循环依赖以及如何解决它们?

bitbake 会自动检测循环依赖关系并在发生这种情况时打印错误消息。错误消息包含导致此循环依赖的包的名称。

如何检查是否有未使用的食谱以及如何安全地删除它们?

bitbake 会自动计算依赖关系,并且不会构建目标不需要的包。如果您在映像中发现一些不需要的软件包并且希望删除它们:

  1. 用于bitbake -g -u depexp <TARGET>检查包裹是如何被拉入的
  2. 修改层中所需的配方(例如通过创建 bbappend)以手动消除依赖关系

提高整体构建性能

最后,关于如何提高整体构建性能的一些提示。这回答了问题的第二部分。

  • 清理你的依赖(bitbake -g -u depexp <TARGET>是你的朋友)。建造更少的东西需要更少的时间。
  • bitbake 可以自动缓存构建输出并将其用于将来的构建,此缓存称为“共享状态缓存”,SSTATE_DIR并由local.conf.
  • 设置您的BB_NUMBER_THREADSPARALLEL_MAKE变量local.conf以匹配您机器的资源。这些变量分别控制有多少任务并行运行以及“make”应该并行运行多少进程(-j 选项)。
  • 将“构建”目录放在它自己的磁盘上。
  • 使用不带日志的 ext4 文件系统并使用以下挂载选项: noatime,barrier=0,commit=6000. 警告:这会使您的硬盘在断电的情况下不可靠。不要在此硬盘上存储任何有价值的东西。
  • -dev使用和/或包构建图像-dbg会大大增加 do_rootfs 任务时间。确保仅在需要时启用它们(参见 EXTRA_IMAGE_FEATURES您的local.conf) 。
  • openembedded 和 yocto 都支持icecream(分布式编译)。请参阅 icecc 课程和这篇文章
  • 买一台更快的机器;)

参考:

Yocto 构建性能 Wiki

Bitbake GUI 工具

于 2013-12-31T16:46:15.353 回答
4

几年前我尝试过分布式编译方式,但是服务器环境配置对于 CI 代理工作来说不是那么灵活,而且构建也不适合多人。

我尝试使用buildstats分析构建时间,发现构建时间几乎是通过编译我根本没有修改的 3-rd 方开源组件来花费的

所以最简单有效的方法就是使用“sstate-cache”来避免未修改的组件再次构建。

我在工作中使用的方式是用空间换时间

  1. 编译整个bitbake项目,你可以在“build/sstate-cache”下找到很多.tgz文件

  2. 将所有这些文件添加并提交到 git 以跟踪文件修改

  3. 再次编译整个项目而不清理它

  4. cd到你的“build/sstate-cache”,git状态,找到被修改的文件,删除它们并提交到git

  5. 然后在“sstate-cache”下清理没有.tgzs的项目,空间换时间完成

“未修改”文件列表可以根据您自己的项目进行修改。

对我来说,构建时间从 1 小时缩短到 10 分钟以内

希望这会有所帮助

于 2015-08-07T03:45:44.623 回答