воскресенье, 18 октября 2020 г.

Ускорение сборки в pbuilder на Raspberry PI 4

Дошли руки починить сборку Midnight Commander для ARM. Раньше я использовал qemu-user-static и qemu-system-arm для сборки пакетов для архитектур armel, armhf и arm64, но это было медленно и часто заканчивалось ошибками или зависанием сборки. Начиная с Raspberry PI 3 появилась поддержка ARM64 и теперь можно собирать пакеты не прибегая к помощи эмулятора.

После снижения цен на Raspberry PI 4 с 2GB до 35$ я заказал себе такую на Seeedstudio и вдобавок корпус с активным охлаждением. Но если гонять pbuilder на SD карте это будет медленно и карта довольно быстро придет в негодность. Чтобы этого избежать я выношу весь /var/cache/pbuilder на NFS, который раздает домашний сервер. Такой подход хорошо работает с базовыми образами, кешем APT и результатами сборки, но слишком медленный для /var/cache/pbuilder/build/. В этой директории pbuilder хранит распакованные chroot'ы и эти файлы не важны. Чтобы ускорить сборку можно смонтировать tmpfs и сборка будет упираться в процессор, а не в I/O.

Для tmpfs я выделил 1GB и этого хватило чтобы собрать базовые образы для всех актуальных систем кроме Debian Sid armel/armhf - по какой-то причине базовый образ получается в три раза больше Debian Sid arm64.

$ ls -lh /var/cache/pbuilder/*.tgz
-rw-r--r-- 1 root root 123M Oct 17 20:33 /var/cache/pbuilder/debian-buster-arm64-base.tgz
-rw-r--r-- 1 root root 112M Oct 17 20:13 /var/cache/pbuilder/debian-buster-armel-base.tgz
-rw-r--r-- 1 root root 111M Oct 17 20:23 /var/cache/pbuilder/debian-buster-armhf-base.tgz
-rw-r--r-- 1 root root 103M Oct 17 19:32 /var/cache/pbuilder/debian-jessie-arm64-base.tgz
-rw-r--r-- 1 root root 103M Oct 17 19:13 /var/cache/pbuilder/debian-jessie-armel-base.tgz
-rw-r--r-- 1 root root 102M Oct 17 19:23 /var/cache/pbuilder/debian-jessie-armhf-base.tgz
-rw-r--r-- 1 root root 136M Oct 17 20:52 /var/cache/pbuilder/debian-sid-arm64-base.tgz
-rw-r--r-- 1 root root 335M Oct 18 07:11 /var/cache/pbuilder/debian-sid-armel-base.tgz
-rw-r--r-- 1 root root 330M Oct 18 08:18 /var/cache/pbuilder/debian-sid-armhf-base.tgz
-rw-r--r-- 1 root root 102M Oct 17 20:02 /var/cache/pbuilder/debian-stretch-arm64-base.tgz
-rw-r--r-- 1 root root 102M Oct 17 19:43 /var/cache/pbuilder/debian-stretch-armel-base.tgz
-rw-r--r-- 1 root root  98M Oct 17 19:52 /var/cache/pbuilder/debian-stretch-armhf-base.tgz
-rw-r--r-- 1 root root  91M Oct 17 21:44 /var/cache/pbuilder/ubuntu-bionic-arm64-base.tgz
-rw-r--r-- 1 root root  84M Oct 17 21:36 /var/cache/pbuilder/ubuntu-bionic-armhf-base.tgz
-rw-r--r-- 1 root root  99M Oct 17 22:02 /var/cache/pbuilder/ubuntu-focal-arm64-base.tgz
-rw-r--r-- 1 root root  90M Oct 17 21:53 /var/cache/pbuilder/ubuntu-focal-armhf-base.tgz
-rw-r--r-- 1 root root  74M Oct 17 21:09 /var/cache/pbuilder/ubuntu-trusty-arm64-base.tgz
-rw-r--r-- 1 root root  74M Oct 17 21:01 /var/cache/pbuilder/ubuntu-trusty-armhf-base.tgz
-rw-r--r-- 1 root root  92M Oct 17 21:27 /var/cache/pbuilder/ubuntu-xenial-arm64-base.tgz
-rw-r--r-- 1 root root  89M Oct 17 21:17 /var/cache/pbuilder/ubuntu-xenial-armhf-base.tgz

После распаковки базовый образ Debian Sid armel занимает 926MB на диске. Выделять больше места под tmpfs не решит всех проблем, т.к. еще нужно достаточно места для установки сборочных зависимостей.

Решить ситуацию поможет bcache у которого backing device будет файл, который лежит на NFS, а cache device будет рамдиск.

Скрипт, который реализует подобное поведение, выглядит так

Чтобы монтирование происходило автоматически при загрузке системы нужно обернуть этот скрипт в systemd сервис

Вот несколько замеров времени распаковки базового образа Debian Sid armel на sd карту, NFS, tmpfs и bcache:

SD карта

real	1m13.394s
user	0m38.117s
sys	0m16.404s

NFS (tmpfs)

real	0m52.931s
user	0m25.294s
sys	0m15.170s

tmpfs

real	0m17.747s
user	0m16.278s
sys	0m5.089s

bcache

real	0m40.882s
user	0m35.255s
sys	0m16.321s

Комментариев нет:

Отправить комментарий