Это репозиторий к публикации в блоге про распределенную компиляцию. Подробный разбор происходящего можно найти по ссылке.
Important
Это обновленная версия, в которой в качестве провизора используется ansible.
Чтобы посмотреть, как репозиторий выглядел до этого, можно переключиться на
тег blog-path.
Здесь мы хотим посмотреть на возможность компиляции ядра Linux (минимальной
конфигурации tinyconfig) на нескольких виртуальных машинах с разными
характеристиками. Но для этого нужно рассказать про утилиту vagrant,
конфигуратор виртуальных машин.
Vagrant1 (с англ. — «бродяга») — свободное и открытое программное обеспечение для создания и конфигурирования виртуальной среды разработки. Является обёрткой для программного обеспечения виртуализации, например VirtualBox, и средств управления конфигурациями, таких как Chef, Salt и Puppet
Данная утилита полезна тем, что позволяет, используя шаблоны виртуальных машин, запускать их. Для описания стека требуется один т.н. Vagrantfile. Она может работать совместно с qemu, VirtualBox, VMWare и пр.
О vagrant стоит знать потому, что в какой момент, экспериментируя с виртуальными машинами, надоест каждый раз их устанавливать в условном VMWare.
Для установки утилит внутри виртуальных машин используется ansible.
Описание требований лежит в файле provisioning/playbook.yaml. Он
содержит в себе этапы:
- Обновление
apt. - Установка необходимых пакетов.
- Копирование и распаковка кодовой базы ядра.
- Создание конфига для ядра.
- Запуск демона
distccd.
distcc2 (от англ. distributed C/C++/ObjC compiler) — инструмент, позволяющий компилировать исходные коды при помощи компиляторов C/C++/ObjC на удалённых машинах, что ускоряет процесс компиляции.
Важно понимать, что это своего рода фронтенд для компиляторов, сам по себе он не компилирует код.
Для того, чтобы запустить процесс, необходимо:
- Скачать box
debian.bookworm.libvirt.boxс оф. сайта HashiCorp (недоступен в РФ). У меня используется версия сlibvirt. - Скачать исходный код ядра3:
foo@bar:~/disgrant$ wget -P provisioning/ https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13.tar.gz
Для начала запустим стенд командой vagrant up.
Далее необходимо подключиться к первой ноде и проверить
настройки distcc:
foo@bar:~/distgran$ vagrant ssh node-1
vagrant@node-1:~$ cd linux-6.13
vagrant@node-1:~/linux-6.13$ distcc --show-hostsДалее запустим tmux, чтобы было удобнее работать с терминалом внутри
машины:
vagrant@node-1:~/linux-6.13$ tmuxДля создания новой вкладки – Ctrl-B C, для переключения – Ctrl-B N,
где N – номер вкладки.
На первом окне запустим бенчмарк hyperfine:
hyperfine --runs 5 \
--prepare 'make clean' \
--parameter-scan jobs 1 4 \
--export-markdown ~/result.md \
'make -j {jobs} CC="distcc gcc"'Это запустит бенчмарк, в котором:
- Для оценки времени будет выполнено по 5 запусков.
- Перед каждым запуском будет выполнена команда
make clean(которая удалит все собранные файлы). - Будет сравнено 4 команды – компиляция с использованием от 1 до 4 потоков
(параметр
jobsв команде). - Результат будет выведен в виде markdown-таблицы в файл
~/result.md. Чтобы сохранить его локально, самый простой способ – вывести на экран и перевести поток вывода в файл:vagrant ssh node-1 -c 'cat result.md' > result.md.
Мониторить компиляцию можно с помощью команды (в соседней вкладке tmux):
watch -n 1 distccmon-textУ меня получился следующий результат:
| Command | Mean [s] | Min [s] | Max [s] | Relative |
|---|---|---|---|---|
make -j 1 CC="distcc gcc" |
191.077 ± 3.870 | 185.832 | 195.834 | 3.52 ± 0.10 |
make -j 2 CC="distcc gcc" |
98.323 ± 0.393 | 97.971 | 98.921 | 1.81 ± 0.04 |
make -j 3 CC="distcc gcc" |
70.357 ± 0.474 | 69.615 | 70.750 | 1.30 ± 0.03 |
make -j 4 CC="distcc gcc" |
59.751 ± 0.390 | 59.268 | 60.251 | 1.10 ± 0.02 |
make -j 5 CC="distcc gcc" |
55.480 ± 0.092 | 55.371 | 55.583 | 1.02 ± 0.02 |
make -j 6 CC="distcc gcc" |
55.859 ± 0.509 | 55.306 | 56.519 | 1.03 ± 0.02 |
make -j 7 CC="distcc gcc" |
55.979 ± 0.391 | 55.568 | 56.565 | 1.03 ± 0.02 |
make -j 8 CC="distcc gcc" |
55.496 ± 0.198 | 55.181 | 55.686 | 1.02 ± 0.02 |
make -j 9 CC="distcc gcc" |
54.911 ± 0.901 | 53.792 | 55.857 | 1.01 ± 0.03 |
make -j 10 CC="distcc gcc" |
54.287 ± 1.132 | 53.299 | 56.078 | 1.00 |
