Увеличиваем производительность 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)