diff --git a/docs/linux/distrant.md b/docs/linux/distrant.md index 75a9aa0..9f50c7b 100644 --- a/docs/linux/distrant.md +++ b/docs/linux/distrant.md @@ -1,28 +1,28 @@ # Немного про распределенную компиляцию > В телеграмме про распределенные и параллельные вычисления -> В конце про версии `gcc` -> В конце ссылка на репозиторий -> В итоге про tcp и ssh ## Мотивация / Введение Про `gentoo` и распределенные системы. -Мне, как любителю Linux всегда было интересно установить Gentoo +Мне, как любителю Linux всегда было интересно изучить Gentoo Linux. На это есть множество причин, сейчас не о них. Суть в том, этап установки системы на виртуальную машину пройден и -есть желание попробовать установить на маломощный нетбук. +есть желание попробовать установить на второстепенный маломощный нетбук. Возникает проблема: Gentoo Linux -- это т.н. "source-based" дистрибутив, т.е. она распространяется в виде исходного кода. В свою очередь, компиляция системы на нетбуке занимает чуть больше суток (возможно, это можно поправить более тщательной конфигурацией перед сборкой, но, на мой взгляд, это -слишком "хардкорный" путь). +слишком "хардкорный" путь для знакомства с системой). Конечно, компиляция +ядра, строго говоря, необязательна, так как можно поставить предварительно +скомпилированную версию. Но так неинтересно. -Таким образом, возникает вопрос -- можно ли ускорить компиляцию? Тут -на помощь приходит `distcc`, своего рода фронтенд для компиляторов C/C++. +Таким образом, возникает вопрос -- можно ли ускорить компиляцию +на слабых ПК? Тут на помощь приходит `distcc`, +своего рода фронтенд для компиляторов C/C++. -Здесь мы хотим посмотреть на возможность компиляции ядра Linux (минимальной +Сегодня мы хотим посмотреть на возможность компиляции ядра Linux (минимальной конфигурации `tinyconfig`) на двух виртуальных машинах с разными характеристиками. Но для этого нужно рассказать про утилиту `vagrant`, конфигуратор виртуальных машин. @@ -48,18 +48,15 @@ distcc[^2] (от англ. distributed C/C++/ObjC compiler) — инструме позволяющий компилировать исходные коды при помощи компиляторов C/C++/ObjC на удалённых машинах, что ускоряет процесс компиляции. -## Компиляция +Важно понимать, что это своего рода фронтенд для компиляторов, +сам по себе он не компилирует код. -- [x] Демонстрация стенда -- [ ] Компиляция на одной машине (gcc) -- [ ] Компиляция на одной машине (distcc) -- [ ] Компиляция на нескольких машинах (distcc) -- [ ] Таблица сравнения +## Компиляция ### Демонстрация стенда Для начала построчно рассмотрим Vagrantfile. -Используется язык Ruby. +При его написании используется язык Ruby. Описание "шаблона" для виртуальных машин. В данном случае это Debian 12 Bookworm. @@ -81,12 +78,12 @@ master_node = { ``` Характеристики: -- IP: 10.200.1.2 -- RAM: 1Gb -- 1 поток -Это почти похоже на характеристики моего нетбука, но они занижены -в целях демонстрации. +- IP: 10.200.1.2, +- RAM: 1Gb, +- 1 поток. + +Они похожи на характеристики моего нетбука, но занижены в целях демонстрации. Описание второстепенной виртуальной машины: @@ -98,8 +95,9 @@ slaves = [ ``` Характеристики: -- RAM: 4Gb -- 4 потока + +- RAM: 4Gb, +- 4 потока. Скрипт для автоматической установки зависимостей: @@ -141,7 +139,7 @@ Vagrant.configure("2") do |config| 3. Запускается скрипт установки зависимостей, 4. Копируется [архив](https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13.tar.gz) - с исходным кодом ядра. + с исходным кодом ядра (должен лежать в директории с Vagrantfile). Конфигурация второстепенных машин: @@ -171,12 +169,12 @@ end Стоит обратить внимание, что IP задается автоматически, начиная от `10.200.1.3` и далее. Сделано это на случай нескольких ВМ. -### Компиляция на одной машине +### Компиляция на одной машине (gcc) Для начала запустим стенд командой `vagrant up`. На моем ноутбуке это занимает -примерно __ секунд. +примерно 127 секунд. -Далее необходимо подключиться к главной машине и распаковать исходники ядра: +Далее необходимо подключиться к главной машине и распаковать исходники ядра[^3]: ``` vagrant ssh master @@ -192,7 +190,7 @@ make tinyconfig ``` > **Важно**: для чистоты эксперимента все замеры делаются после команды `make -clean` (см. `make help`). + distclean` (см. `make help`). Запускаем компиляцию с замером времени: @@ -200,7 +198,7 @@ clean` (см. `make help`). time -p make CC=gcc ``` -### Одна машина (distcc) +### Компиляция на одной машине (distcc) По смыслу, все тоже самое, только нужно указать distcc, на каких хостах можно компилировать: @@ -215,7 +213,7 @@ export DISTCC_HOSTS="localhost" time -p make CC="distcc gcc" ``` -### Две машины (distcc) +### Компиляция на двух машинах (distcc) Для запуска распределенной компиляции, нужно сначала запустить демон на второй виртуальной машине. Для этого подключаемся к ней и запускаем его: @@ -229,9 +227,9 @@ distccd --daemon --allow-private Для проверки можно: -1. На второй машине проверить открытые порты: `ss -ntlp | grep 3632` -2. На основной машине постучаться в этот порт: `telnet 10.200.1.3 3632` - (выход на `C-] C-d`) +1. На второй машине проверить открытые порты: `ss -ntlp | grep 3632`, +2. С основной машины постучаться в этот порт: `telnet 10.200.1.3 3632` + (выход на `C-] C-d`). Теперь нужно добавить хост, чтобы на нем можно было удаленно компилировать. Для этого на основной машине: @@ -265,9 +263,26 @@ watch -n 1 distccmon-text | 3 | 187 | 174 | 127 | |Среднее | 183 | 170 | 115 | -[^1]: Википедия [Vagrant](https://ru.wikipedia.org/wiki/Vagrant). -[^2]: Википедия [distcc](https://ru.wikipedia.org/wiki/Distcc). - ## Итог -37% +Можно увидеть, что такая параллелизация дает прирост 37%. +Сложно сказать, можно ли разогнать сильнее, так как многое зависит от +правил компиляции (например, их нельзя распараллелить больше чем на 5 потоков). + +Очевидно, что распределенная компиляция при прочих равных будет проигрывать +параллельной, так как общение между потоками по определению быстрее. +Но для слабых машин это отлично подходит. К сожалению, у данного метода есть +существенные ограничения: + +1. Версии gcc и distcc должны совпадать (хотя, пишут, что достаточно + совпадения только мажорных версий). +2. В некоторых случаях нет возможности общения по TCP и требуется подключение по + SSH. Например, когда есть ограничения безопасности или при сложной организации + сети. Определенно, такое подключение будет медленнее. + +Все материалы стенда можно найти в +[репозитории](https://github.com/rustbas/disgrant/) на Github. + +[^1]: Википедия [Vagrant](https://ru.wikipedia.org/wiki/Vagrant). +[^2]: Википедия [distcc](https://ru.wikipedia.org/wiki/Distcc). +[^3]: Исходный код ядра можно найти [здесь](https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13.tar.gz).