Сборка пакетов из AUR для многих пользователей Arch Linux превращается в перекур: запустил makepkg
, налил кофе, проверил прогресс... и снова налил кофе. Для разработчиков, регулярно обновляющих зависимости или собирающих кастомные версии ПО, такие паузы становятся критичными. Разберем методики, которые помогут превратить часовую компиляцию в 10-минутный спринт без апгрейда железа.
Анатомия тормозов: откуда берутся задержки
Прежде чем оптимизировать сборку, стоит понять узкие места процесса. При стандартной настройке makepkg
:
- Не использует кэш объектных файлов между сборками ("холодный старт" каждый раз)
- Ограничивает параллелизацию (
-j$(nproc)
часто неактивно) - Не учитывает архитектурные особенности CPU
- Работает с субоптимальными флагами компилятора
Эксперимент с пакетом linux-zen
(ядро 6.8.9):
$ time makepkg -sri
Реальное время: 47 минут 12 секунд
Turbo-режим для makepkg
Шаг 1: Параллелизация на стероидах
Отредактируем /etc/makepkg.conf
:
MAKEFLAGS="-j$(($(nproc) * 2))" # Удвоить потоки (оптимально для ZEN3/ZEN4)
Почему не nproc
? Современные CPU с SMT (Hyper-Threading) эффективно обрабатывают больше потоков, чем физических ядер. Эмпирическое правило: ядра * 1.5-2
.
Но параллелизация требует контроля:
sudo pacman -S cpupower
sudo cpupower frequency-set -g performance
Фиксация частоты CPU на максимальной предотвращает троттлинг при продолжительной нагрузке.
Шаг 2: ccache — ваш новый лучший друг
Установка:
sudo pacman -S ccache
Настройка /etc/makepkg.conf
:
BUILDENV=(... ccache) # Раскомментировать ccache
CCACHE_DIR="/var/cache/ccache" # Для глобального кэша
CCACHE_COMPRESS=1
CCACHE_COMPRESSLEVEL=6
CCACHE_MAXSIZE="20G"
Создаем системный кэш:
sudo mkdir /var/cache/ccache
sudo chown build:build /var/cache/ccache # Для отдельного пользователя сборки
После первой сборки проверяем эффективность:
ccache -s
Cacheable calls: 7321 / 10655 (68.69%)
Hit rate: 84.3 %
Для headless-сборок добавляем в ~/.ccache/ccache.conf
:
sloppiness = clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,time_macros
Шаг 3: Профилирование флагов компилятора
В том же makepkg.conf
находим секцию C/CXX/CPPFLAGS. Пример для AMD Zen 3:
CFLAGS="-O3 -march=znver3 -mtune=znver3 -flto=auto -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection=full"
CXXFLAGS="${CFLAGS}"
LDFLAGS="-Wl,-O3 -Wl,--as-needed -Wl,--hash-style=gnu -Wl,--sort-common"
Перевод флагов на русский:
-march=znver3
: генерация кода точно под архитектуру CPUflto=auto
: межмодульная оптимизация-pipe
: исключает временные файлы, снижая I/O нагрузку-fno-plt
: убирает косвенные переходы через PLT
Важно: Для Intel CPU 12+ Gen используйте -march=alderlake
, для Apple M1 — -march=native
.
Шаг 4: Многопоточный кеширование исходников
Меняем зеркала в /etc/pacman.d/mirrorlist
с помощью reflector
:
sudo reflector --latest 20 --protocol https --sort rate --save /etc/pacman.d/mirrorlist
Устанавливаем параллельный загрузчик:
sudo pacman -S aria2
В /etc/makepkg.conf
:
DLAGENTS=('file::/usr/bin/curl -gqC - -o %o %u'
'ftp::/usr/bin/curl -gqC - -o %o %u'
'http::/usr/bin/aria2c -UWget -s4 -x4 -k1M -o %o %u'
'https::/usr/bin/aria2c -UWget -s4 -x4 -k1M -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
Результаты: цифры не врут
Повторная сборка linux-zen
с оптимизациями:
$ time makepkg -sri
Реальное время: 9 минут 41 секунда (-79.4%)
ccache -s:
Cache directory /var/cache/ccache
Primary config /etc/ccache.conf
Hit rate 96.3 %
Пограничные случаи и нюансы
- Память ↔ потоки баланс: При 32 потоках и 32 ГБ RAM добавьте swap-файл:
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
- Некорректная сборка с LTO: Если пакет падает с
-flto
, временно отключите его:
CFLAGS="${CFLAGS/-flto=auto/}"
- Интерактивный мониторинг: Установите
glances
для отслеживания узких мест:
sudo pacman -S glances
glances --disable-webui
Автоматизация профиля
Создайте конфигурационные сниппеты для разных сценариев в /etc/makepkg.d/
:
production.conf
– максимальная оптимизацияdebug.conf
– с отладочными символамиrisky.conf
– агрессивные флаги типа-Ofast
Активация через MAKEPKG_CONF=production.conf makepkg
.
Оптимизация сборки — это не магия, а инженерная работа с измеримыми параметрами. Комбинируя кэширование, параллелизацию и архитектурно-ориентированные настройки, можно сократить время разработки на 70-85% даже без обновления железа. Но помните: экстремальные флаги требуют тестирования стабильности конечных бинарников.