fix typos
This commit is contained in:
@@ -1,28 +1,28 @@
|
|||||||
# Немного про распределенную компиляцию
|
# Немного про распределенную компиляцию
|
||||||
|
|
||||||
> В телеграмме про распределенные и параллельные вычисления
|
> В телеграмме про распределенные и параллельные вычисления
|
||||||
> В конце про версии `gcc`
|
|
||||||
> В конце ссылка на репозиторий
|
|
||||||
> В итоге про tcp и ssh
|
|
||||||
|
|
||||||
## Мотивация / Введение
|
## Мотивация / Введение
|
||||||
|
|
||||||
Про `gentoo` и распределенные системы.
|
Про `gentoo` и распределенные системы.
|
||||||
|
|
||||||
Мне, как любителю Linux всегда было интересно установить Gentoo
|
Мне, как любителю Linux всегда было интересно изучить Gentoo
|
||||||
Linux. На это есть множество причин, сейчас не о них.
|
Linux. На это есть множество причин, сейчас не о них.
|
||||||
Суть в том, этап установки системы на виртуальную машину пройден и
|
Суть в том, этап установки системы на виртуальную машину пройден и
|
||||||
есть желание попробовать установить на маломощный нетбук.
|
есть желание попробовать установить на второстепенный маломощный нетбук.
|
||||||
Возникает проблема: Gentoo Linux -- это т.н. "source-based" дистрибутив,
|
Возникает проблема: Gentoo Linux -- это т.н. "source-based" дистрибутив,
|
||||||
т.е. она распространяется в виде исходного кода. В свою очередь, компиляция
|
т.е. она распространяется в виде исходного кода. В свою очередь, компиляция
|
||||||
системы на нетбуке занимает чуть больше суток (возможно, это можно поправить
|
системы на нетбуке занимает чуть больше суток (возможно, это можно поправить
|
||||||
более тщательной конфигурацией перед сборкой, но, на мой взгляд, это
|
более тщательной конфигурацией перед сборкой, но, на мой взгляд, это
|
||||||
слишком "хардкорный" путь).
|
слишком "хардкорный" путь для знакомства с системой). Конечно, компиляция
|
||||||
|
ядра, строго говоря, необязательна, так как можно поставить предварительно
|
||||||
|
скомпилированную версию. Но так неинтересно.
|
||||||
|
|
||||||
Таким образом, возникает вопрос -- можно ли ускорить компиляцию? Тут
|
Таким образом, возникает вопрос -- можно ли ускорить компиляцию
|
||||||
на помощь приходит `distcc`, своего рода фронтенд для компиляторов C/C++.
|
на слабых ПК? Тут на помощь приходит `distcc`,
|
||||||
|
своего рода фронтенд для компиляторов C/C++.
|
||||||
|
|
||||||
Здесь мы хотим посмотреть на возможность компиляции ядра Linux (минимальной
|
Сегодня мы хотим посмотреть на возможность компиляции ядра Linux (минимальной
|
||||||
конфигурации `tinyconfig`) на двух виртуальных машинах с разными
|
конфигурации `tinyconfig`) на двух виртуальных машинах с разными
|
||||||
характеристиками. Но для этого нужно рассказать про утилиту `vagrant`,
|
характеристиками. Но для этого нужно рассказать про утилиту `vagrant`,
|
||||||
конфигуратор виртуальных машин.
|
конфигуратор виртуальных машин.
|
||||||
@@ -48,18 +48,15 @@ distcc[^2] (от англ. distributed C/C++/ObjC compiler) — инструме
|
|||||||
позволяющий компилировать исходные коды при помощи
|
позволяющий компилировать исходные коды при помощи
|
||||||
компиляторов C/C++/ObjC на удалённых машинах, что ускоряет процесс компиляции.
|
компиляторов C/C++/ObjC на удалённых машинах, что ускоряет процесс компиляции.
|
||||||
|
|
||||||
## Компиляция
|
Важно понимать, что это своего рода фронтенд для компиляторов,
|
||||||
|
сам по себе он не компилирует код.
|
||||||
|
|
||||||
- [x] Демонстрация стенда
|
## Компиляция
|
||||||
- [ ] Компиляция на одной машине (gcc)
|
|
||||||
- [ ] Компиляция на одной машине (distcc)
|
|
||||||
- [ ] Компиляция на нескольких машинах (distcc)
|
|
||||||
- [ ] Таблица сравнения
|
|
||||||
|
|
||||||
### Демонстрация стенда
|
### Демонстрация стенда
|
||||||
|
|
||||||
Для начала построчно рассмотрим Vagrantfile.
|
Для начала построчно рассмотрим Vagrantfile.
|
||||||
Используется язык Ruby.
|
При его написании используется язык Ruby.
|
||||||
|
|
||||||
Описание "шаблона" для виртуальных машин. В данном случае это Debian
|
Описание "шаблона" для виртуальных машин. В данном случае это Debian
|
||||||
12 Bookworm.
|
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. Запускается скрипт установки зависимостей,
|
3. Запускается скрипт установки зависимостей,
|
||||||
4. Копируется
|
4. Копируется
|
||||||
[архив](https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13.tar.gz)
|
[архив](https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13.tar.gz)
|
||||||
с исходным кодом ядра.
|
с исходным кодом ядра (должен лежать в директории с Vagrantfile).
|
||||||
|
|
||||||
Конфигурация второстепенных машин:
|
Конфигурация второстепенных машин:
|
||||||
|
|
||||||
@@ -171,12 +169,12 @@ end
|
|||||||
Стоит обратить внимание, что IP задается автоматически, начиная от
|
Стоит обратить внимание, что IP задается автоматически, начиная от
|
||||||
`10.200.1.3` и далее. Сделано это на случай нескольких ВМ.
|
`10.200.1.3` и далее. Сделано это на случай нескольких ВМ.
|
||||||
|
|
||||||
### Компиляция на одной машине
|
### Компиляция на одной машине (gcc)
|
||||||
|
|
||||||
Для начала запустим стенд командой `vagrant up`. На моем ноутбуке это занимает
|
Для начала запустим стенд командой `vagrant up`. На моем ноутбуке это занимает
|
||||||
примерно __ секунд.
|
примерно 127 секунд.
|
||||||
|
|
||||||
Далее необходимо подключиться к главной машине и распаковать исходники ядра:
|
Далее необходимо подключиться к главной машине и распаковать исходники ядра[^3]:
|
||||||
|
|
||||||
```
|
```
|
||||||
vagrant ssh master
|
vagrant ssh master
|
||||||
@@ -192,7 +190,7 @@ make tinyconfig
|
|||||||
```
|
```
|
||||||
|
|
||||||
> **Важно**: для чистоты эксперимента все замеры делаются после команды `make
|
> **Важно**: для чистоты эксперимента все замеры делаются после команды `make
|
||||||
clean` (см. `make help`).
|
distclean` (см. `make help`).
|
||||||
|
|
||||||
Запускаем компиляцию с замером времени:
|
Запускаем компиляцию с замером времени:
|
||||||
|
|
||||||
@@ -200,7 +198,7 @@ clean` (см. `make help`).
|
|||||||
time -p make CC=gcc
|
time -p make CC=gcc
|
||||||
```
|
```
|
||||||
|
|
||||||
### Одна машина (distcc)
|
### Компиляция на одной машине (distcc)
|
||||||
|
|
||||||
По смыслу, все тоже самое, только нужно указать distcc, на каких хостах
|
По смыслу, все тоже самое, только нужно указать distcc, на каких хостах
|
||||||
можно компилировать:
|
можно компилировать:
|
||||||
@@ -215,7 +213,7 @@ export DISTCC_HOSTS="localhost"
|
|||||||
time -p make CC="distcc gcc"
|
time -p make CC="distcc gcc"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Две машины (distcc)
|
### Компиляция на двух машинах (distcc)
|
||||||
|
|
||||||
Для запуска распределенной компиляции, нужно сначала запустить демон на
|
Для запуска распределенной компиляции, нужно сначала запустить демон на
|
||||||
второй виртуальной машине. Для этого подключаемся к ней и запускаем его:
|
второй виртуальной машине. Для этого подключаемся к ней и запускаем его:
|
||||||
@@ -229,9 +227,9 @@ distccd --daemon --allow-private
|
|||||||
|
|
||||||
Для проверки можно:
|
Для проверки можно:
|
||||||
|
|
||||||
1. На второй машине проверить открытые порты: `ss -ntlp | grep 3632`
|
1. На второй машине проверить открытые порты: `ss -ntlp | grep 3632`,
|
||||||
2. На основной машине постучаться в этот порт: `telnet 10.200.1.3 3632`
|
2. С основной машины постучаться в этот порт: `telnet 10.200.1.3 3632`
|
||||||
(выход на `C-] C-d`)
|
(выход на `C-] C-d`).
|
||||||
|
|
||||||
Теперь нужно добавить хост, чтобы на нем можно было удаленно компилировать.
|
Теперь нужно добавить хост, чтобы на нем можно было удаленно компилировать.
|
||||||
Для этого на основной машине:
|
Для этого на основной машине:
|
||||||
@@ -265,9 +263,26 @@ watch -n 1 distccmon-text
|
|||||||
| 3 | 187 | 174 | 127 |
|
| 3 | 187 | 174 | 127 |
|
||||||
|Среднее | 183 | 170 | 115 |
|
|Среднее | 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