It-e.RU
Цифровой двигатель вашего бизнеса.

Увеличиваем производительность MOCK

Увеличиваем производительность MOCK

Увеличиваем производительность MOCK


Работая над одним из проектов, понадобилось собирать большое количество rpm-пакетов в CI (jenkins) для разных архитектур. Выбрали для этой цели MOCK, который позволял без особых затрат решить данную задачу. И всё бы хорошо, если бы не постоянное жуткое ожидание результатов: на практике оказалось, что MOCK достаточно медленно работает, поэтому заставим его работать быстрее.
Итак, в моем распоряжении инстанс QCOW2 с 8 ядрами и 8Гб памяти. Среднее время сборки пакета под 4 разных архитектуры занимало порядка 5 минут.
Первое, что приходит в голову - это конечно же использование tmpfs. К счастью, для MOCK есть плагин и не придётся делать собственную реализацию. Подключим:
 
config_opts['plugin_conf']['tmpfs_enable'] = True 
config_opts['plugin_conf']['tmpfs_opts'] = {}
config_opts['plugin_conf']['tmpfs_opts']['required_ram_mb'] = 1024
config_opts['plugin_conf']['tmpfs_opts']['max_fs_size'] = '5g'
config_opts['plugin_conf']['tmpfs_opts']['mode'] = '0755'
config_opts['plugin_conf']['tmpfs_opts']['keep_mounted'] = False

Вторым шагом было решено сделать локальные репозитарии и использовать их (очень полезно при работе с нестабильным доступом в сеть). Вставьте что-то вроде этого в крон:
 
* 1 * * * rsync -avkSHpP --delete --delete-after --exclude=archive/debuginfo --exclude=archive/obsolete --exclude=SRPMS rsync://rsync.scientificlinux.org/scientific/6x/ /var/repo/6x
* 2 * * * reposync -l --repoid=dockerrepo7 --download-metadata --norepopath --download_path=/var/repo/docker/6; createrepo /var/repo/docker/6
Включим кеш в yum.conf:
 
keepcache = 1
и внесем их в необходимые конфиги MOCK. Например кусочек из файла /etc/mock/sl7x-x86_64.cfg :
 
[build]
name=build
baseurl=file:///var/repo/7x/x86_64/os
Третьим шагом перестали использовать fsync:
config_opts['nosync'] = True
Для этого установим nosync-библиотеку:
yum install nosync
Четверным шагом подключим кеширование рут-разделов, чтобы они каждый раз не собирались:
config_opts['plugin_conf']['lvm_root_enable'] = True
config_opts['plugin_conf']['root_cache_enable'] = True
config_opts['plugin_conf']['yum_cache_enable'] = True
config_opts['plugin_conf']['root_cache_opts'] = {}  
config_opts['plugin_conf']['root_cache_opts']['age_check'] = True
config_opts['plugin_conf']['root_cache_opts']['max_age_days'] = 15
На этом история закончилась, тк среднее время сборки уменьшилось до 18-20(!) секунд, но можно ещё поиграться с плагином ccache_enable и паралельной распаковкой на такой манер:
config_opts['chroot_setup_cmd'] = 'install @buildsys-build /usr/bin/pigz /usr/bin/lbzip2'
config_opts['macros']['%__gzip'] = '/usr/bin/pigz'
config_opts['macros']['%__bzip2'] = '/usr/bin/lbzip2'
Кроме того, очень хорошо использовать mockchain для сборки целых групп rpm-пакетов. Нам это уже в текущей реализации было не нужно, но использовать mockchain можно примерно следующим образом:
    for pkg in ~/pkgs/*.src.rpm; do
       mockchain mylibrarysrc -l /tmp/myrepo $pkg
       rsync -avH /tmp/repo/results/ reposrv:/var/repo/
    done
Соотвественно mylibrarysrc - это название репы к yum.repo.d. Или так:
    mockchain mylibrarysrc -a http://jenkins -l /tmp/repo -c *.src.rpm
Ещё возможный вариант:
mockchain mylibrarysrc -l /tmp/repo --recurse *.src.rpm
Экономьте своё и машинное время :)

Пожалуйста, уважайте труд автора, при копировании материалов сохраняйте ссылку на источник!

Комментарии (0)







Разрешённые теги: <b><i><br>Добавить новый комментарий: