Skip to content

rustbas/disgrant

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

66 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Disgrant

Это репозиторий к публикации в блоге про распределенную компиляцию. Подробный разбор происходящего можно найти по ссылке.

Important

Это обновленная версия, в которой в качестве провизора используется ansible. Чтобы посмотреть, как репозиторий выглядел до этого, можно переключиться на тег blog-path.

Описание

Здесь мы хотим посмотреть на возможность компиляции ядра Linux (минимальной конфигурации tinyconfig) на нескольких виртуальных машинах с разными характеристиками. Но для этого нужно рассказать про утилиту vagrant, конфигуратор виртуальных машин.

Vagrant

Vagrant1 (с англ. — «бродяга») — свободное и открытое программное обеспечение для создания и конфигурирования виртуальной среды разработки. Является обёрткой для программного обеспечения виртуализации, например VirtualBox, и средств управления конфигурациями, таких как Chef, Salt и Puppet

Данная утилита полезна тем, что позволяет, используя шаблоны виртуальных машин, запускать их. Для описания стека требуется один т.н. Vagrantfile. Она может работать совместно с qemu, VirtualBox, VMWare и пр.

О vagrant стоит знать потому, что в какой момент, экспериментируя с виртуальными машинами, надоест каждый раз их устанавливать в условном VMWare.

Ansible

Для установки утилит внутри виртуальных машин используется ansible. Описание требований лежит в файле provisioning/playbook.yaml. Он содержит в себе этапы:

  1. Обновление apt.
  2. Установка необходимых пакетов.
  3. Копирование и распаковка кодовой базы ядра.
  4. Создание конфига для ядра.
  5. Запуск демона distccd.

Distcc

distcc2 (от англ. distributed C/C++/ObjC compiler) — инструмент, позволяющий компилировать исходные коды при помощи компиляторов C/C++/ObjC на удалённых машинах, что ускоряет процесс компиляции.

Важно понимать, что это своего рода фронтенд для компиляторов, сам по себе он не компилирует код.

Запуск

Исходные данные

Для того, чтобы запустить процесс, необходимо:

  1. Скачать box debian.bookworm.libvirt.box с оф. сайта HashiCorp (недоступен в РФ). У меня используется версия с libvirt.
  2. Скачать исходный код ядра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"'

Это запустит бенчмарк, в котором:

  1. Для оценки времени будет выполнено по 5 запусков.
  2. Перед каждым запуском будет выполнена команда make clean (которая удалит все собранные файлы).
  3. Будет сравнено 4 команды – компиляция с использованием от 1 до 4 потоков (параметр jobs в команде).
  4. Результат будет выведен в виде markdown-таблицы в файл ~/result.md. Чтобы сохранить его локально, самый простой способ – вывести на экран и перевести поток вывода в файл: vagrant ssh node-1 -c 'cat result.md' > result.md .

Мониторить компиляцию можно с помощью команды (в соседней вкладке tmux):

watch -n 1 distccmon-text

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

Footnotes

  1. Википедия Vagrant.

  2. Википедия distcc.

  3. Исходный код ядра можно найти здесь.

About

Ansible + Vagrant + Distcc demonstration

Resources

Stars

1 star

Watchers

1 watching

Forks

Packages

 
 
 

Contributors