fix typos
This commit is contained in:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user