Это очень широкий вопрос!
Во-первых, вот краткое изложение того, как проверить производительность сборки и зависимости при использовании проекта openembedded/yocto. Это отвечает на первую часть вопроса.
Сборка каких пакетов занимает больше времени?
Используйте buildstats с инструментом pybootchartgui для создания диаграммы сборки.
Подробности:
Установите USER_CLASSES += "buildstats"
в файле $BUILDIR/conf/local.conf
. Это приведет к сбросу подробных данных о производительности в $BUILDDIR/tmp/buildstats/<DATE>
. Затем используйте скрипт pybootchartgui.py
(в poky/scripts/pybootchartgui
) для создания диаграммы. Это поможет вам локализовать возможные узкие места в сборке. Конечно, если у вас много рецептов выпечки, ваша таблица будет огромной. Чтобы убрать шум, используйте параметр командной строки -m MINTIME
.
Например:
poky/scripts/pybootchartgui/pybootchartgui.py -m 600 $BUILDDIR/tmp/buildstats/201312310904
будут отображаться только те задачи (do_compile, do_fetch и т. д.), выполнение которых занимает более 10 минут (600 секунд).
Как проверить зависимости пакетов?
Для изучения зависимостей конкретного пакета используйте утилиту depexp. Например, для изучения зависимостей eglibc используйте:
bitbake -g -u depexp eglibc
Это даст лучшее понимание того, от чего зависит каждый рецепт как во время выполнения, так и во время компиляции.
Как проверить, есть ли круговые зависимости и как их решить?
Bitbake автоматически обнаруживает циклические зависимости и выводит сообщение об ошибке, когда такое происходит. Сообщение об ошибке содержит имена пакетов, вызывающих эту циклическую зависимость.
Как проверить, есть ли рецепты, которые не используются, и как их безопасно удалить?
bitbake автоматически вычисляет зависимости и не будет создавать пакеты, которые не нужны вашей цели. Если вы обнаружили в образе нежелательные пакеты и хотите их удалить:
- используйте
bitbake -g -u depexp <TARGET>
, чтобы проверить, как пакет втягивается
- измените необходимые рецепты в вашем слое (например, создав bbappend), чтобы устранить зависимость вручную
Улучшение общей производительности сборки
Наконец, несколько советов о том, как улучшить общую производительность сборки. Это отвечает на вторую часть вопроса.
- Очистите свои зависимости (
bitbake -g -u depexp <TARGET>
— ваш друг). Создание меньшего количества вещей занимает меньше времени.
- Bitbake может автоматически кэшировать выходные данные сборки и использовать их для будущих сборок, этот кеш называется «кэш общего состояния» и управляется переменной
SSTATE_DIR
в файле local.conf
.
- Установите переменные
BB_NUMBER_THREADS
и PARALLEL_MAKE
в local.conf
в соответствии с ресурсами вашей машины. Эти переменные управляют тем, сколько задач выполняется параллельно и сколько процессов make должны выполняться параллельно (опция -j
) соответственно.
- Поместите каталог build на отдельный диск.
- Используйте файловую систему ext4 без журналирования и со следующими параметрами монтирования:
noatime,barrier=0,commit=6000
. ВНИМАНИЕ: это делает ваш жесткий диск ненадежным в случае потери питания. Не храните на этом жестком диске ничего ценного.
- создание образов с пакетами
-dev
и/или -dbg
значительно увеличивает время выполнения задачи do_rootfs. Убедитесь, что вы включили их (см. EXTRA_IMAGE_FEATURES
в local.conf
) только при необходимости.
- openembedded и yocto поддерживают icecream (распределенный компилятор). См. класс icecc и этот сообщение.
- Купите более быструю машину ;)
Рекомендации:
Вики Yocto Build Performance
Инструменты Bitbake с графическим интерфейсом
person
bookmarc
schedule
31.12.2013