fix typos

This commit is contained in:
Basyrov Rustam
2025-01-24 14:04:11 +03:00
parent c0d7ce44c7
commit 72133bd71f

View File

@@ -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).