Как измерить и ускорить загрузку Linux
Кратко. В этой статье объяснено, как измерить время загрузки Linux, как интерпретировать результаты и какие практические шаги помогут сократить время старта системы без аппаратных затрат. Вы получите команды для диагностики, чеклисты для разных ролей и план отката на случай проблем.
Введение
Загрузка системы — это набор последовательных и параллельных этапов: прошивка (UEFI/BIOS), загрузчик (GRUB или systemd-boot), ядро и initramfs, затем userspace и сервисы. Для большинства современных дистрибутивов самый заметный вклад в общее время дают именно сервисы userspace. В этой статье показано, как получить точные измерения, найти «узкие места» и безопасно оптимизировать загрузку.
Как проверить время загрузки с помощью systemd-analyze
systemd — менеджер служб по умолчанию в большинстве дистрибутивов. Самый быстрый способ получить базовое представление о загрузке — команда:
systemd-analyzeОна выведет общее время загрузки, отдельно — время ядра и userspace. Пример вывода можно увидеть на скриншоте ниже.
Для подробного разбора по службам используйте:
systemd-analyze blameЭта команда сортирует службы по времени, затраченному на их запуск, — самые «тяжёлые» будут вверху. На скриншоте видно таблицу со списком служб и временем выполнения.
Ещё одна полезная команда — показать критическую цепочку зависимостей и задержки:
systemd-analyze critical-chainДля визуального анализа можно экспортировать SVG-график загрузки:
systemd-analyze plot > boot.svgОткройте boot.svg в браузере, чтобы увидеть временную шкалу и перекрывающиеся этапы.
Что означают ключевые показатели
- Время прошивки (firmware) — от включения до передачи управления загрузчику. Тут мало что можно сделать, кроме обновления прошивки или смены оборудования.
- Время загрузчика (loader) — GRUB или systemd-boot; влияет конфигурация меню, таймауты и выбор устройств.
- Время ядра (kernel) — загрузка ядра и initramfs; возможно уменьшить размер initramfs и убрать ненужные модули.
- Userspace — инициализация служб systemd; именно здесь чаще всего находятся улучшения.
Короткая модель принятия решений: измерил → проанализировал → отключил/перенастроил/маскировал → проверил → откатил при необходимости.
Быстрые команды для расследования
- Просмотреть журнал текущей загрузки (жёсткие ошибки/таймауты):
journalctl -b -o short-precise- Просмотреть сообщения ядра, связанные с загрузкой драйверов:
dmesg --ctime | less- Показать сервисы, которые занимали большую часть времени:
systemd-analyze blame | head -n 30- Проверить таймауты устройств в fstab (монтирование сетевых/внешних дисков):
cat /etc/fstabОбратите внимание на опции вроде noauto, x-systemd.device-timeout= и _netdev для сетевых томов.
Как безопасно отключать и оптимизировать службы
Важно: отключение системных служб без понимания их роли может нарушить работу системы. Прежде чем отключать — проверьте, для чего служба нужна.
- Посмотреть, как служба настроена и какие у неё зависимости:
systemctl status имя_сервиса.service
systemctl list-dependencies --reverse имя_сервиса.service- Отключение службы (она не будет запускаться автоматически):
sudo systemctl disable имя_сервиса.service- Заблокировать службу полностью (mask) — безопасно для служб, которые точно не нужны:
sudo systemctl mask имя_сервиса.service- Вернуть обратно:
sudo systemctl enable имя_сервиса.service
sudo systemctl unmask имя_сервиса.serviceПример: на многих настольных системах почтовый демон exim4 не нужен — его можно отключить, как показано в примере выше.
Тонкие настройки systemd для ускорения загрузки
- Включите параллельный запуск служб (обычно по умолчанию включён в systemd).
- Используйте socket activation для сервисов, которые могут стартовать «лениво».
- Сократите таймауты: настройка DefaultTimeoutStartSec и DefaultTimeoutStopSec в /etc/systemd/system.conf может снизить суммарное время ожидания при проблемных юнитах.
- Применяйте OnDemand-инициализацию: службы, которые должны стартовать по событию, помечайте как socket-activated или path-activated.
Оптимизация initramfs и ядра
- Удалите ненужные модули из initramfs, чтобы уменьшить его размер: в Debian/Ubuntu — обновите конфигурацию initramfs и вызовите update-initramfs; в Arch — mkinitcpio.
- Подумайте о минимизации загрузочного набора драйверов: если система не использует определённое оборудование, исключите соответствующие модули.
Оптимизации файловой системы и монтирования
- Для внешних и сетевых томов используйте опции _netdev и noauto, чтобы они не блокировали загрузку.
- Добавьте x-systemd.requires= или x-systemd.after= для управления порядком монтирования при необходимости.
- Для медленных устройств рассмотрите использование systemd.mount с опциями, заданными для отложенного монтирования.
Программные альтернативы и инструменты профилирования
- bootchart — генерирует графики загрузки для старых систем или систем без systemd.
- systemd-analyze plot — готовая SVG-визуализация.
- bootstat, eBPF-утилиты для низкоуровневого профилирования запуска.
- Для систем без systemd используются инструменты типа rc.d profiler или init.d скрипты и логи /var/log/boot.log.
Примеры и сценарии
- Если systemd-analyze blame показывает, что exim4 занимает 3 s — отключите/маскируйте эту службу, если она не нужна локально.
- Если таймауты при монтировании NFS добавляют 20–30 s — используйте _netdev и отложенное монтирование.
- Если initramfs тянет более 2 s на распаковку — уменьшите его размер, уберите лишние модули.
Когда оптимизация не помогает: контрпримеры
- Виртуальные машины с медленным виртуальным оборудованием иногда ограничены I/O гипервизора — программные оптимизации мало помогут.
- Если узким местом является прошивка (BIOS/UEFI), то без обновления прошивки или смены аппаратуры ускорить старт не удастся.
- Службы с сетевыми зависимостями будут ждать похищенных/недоступных ресурсов — здесь нужен сетевой подход, а не локальная оптимизация.
Риски и меры предосторожности
- Отключение системных служб может лишить систему важных функций (сетевые службы, логирование, монтирование криптотомов).
- Маскирование служб нельзя применять слепо на сервере в продакшн-окружении — тестируйте в staging перед изменениями.
Чеклисты по ролям
Администратор сервера:
- Измерить baseline командой systemd-analyze.
- Проверить журнал (journalctl -b) на ошибки.
- Тестировать каждое изменение на staging.
- Документировать откатные команды.
Пользователь рабочего стола:
- Отключить ненужные демоны (почтовые агенты, агенты бэкапа).
- Использовать легковесное окружение рабочего стола.
- Рассмотреть установку на SSD, если планируется аппаратное улучшение.
DevOps/инженер CI:
- Интегрировать measurement в CI для образов.
- Автоматизировать сбор boot.svg и blames после сборки образа.
План отката и работа в случае проблем
- Сохраните список изменённых юнитов: sudo systemctl list-unit-files | grep disabled > disabled-before.txt
- Если после отключения служб система не загружается, загрузитесь в rescue mode и выполните:
sudo systemctl enable --now имя_критичного_сервиса.service
sudo systemctl unmask имя_критичного_сервиса.service- Восстановите initramfs из резервной копии, если проблема в загрузочном образе.
Критерии приёмки
- Замер до и после: общее время загрузки уменьшилось на X секунд (целевое значение — субъективно).
- Все критичные для работы системы сервисы стартуют корректно.
- Нет новых ошибок в journalctl -b за первые 5 минут после загрузки.
Мини-методология для последовательной оптимизации
- Измерить текущее состояние: systemd-analyze, journalctl, dmesg.
- Найти крупнейших «потребителей времени»: systemd-analyze blame.
- Понять назначение службы и её зависимости.
- Отключить/маскировать/перенастроить её.
- Пересобрать initramfs при необходимости.
- Повторить измерение и документировать изменения.
Небольшая сводка полезных команд
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
systemd-analyze plot > boot.svg
journalctl -b -o short-precise
dmesg --ctime | less
sudo systemctl disable имя_сервиса.service
sudo systemctl mask имя_сервиса.service
sudo systemctl enable имя_сервиса.serviceКраткий глоссарий
- systemd-analyze — инструмент для измерения и визуализации времени загрузки.
- initramfs — минимальное пространство пользователя, используемое ядром для монтирования корня.
- mask — блокировка сервиса, предотвращающая его запуск.
- noauto/_netdev — опции fstab для отложенного или сетевого монтирования.
Заключение
Оптимизация загрузки Linux часто даёт заметный выигрыш без затрат на новое железо. Начните с замеров systemd-analyze, затем искать «тяжёлые» сервисы и устранять их причину: отключение ненужного, перевод на socket-activation, корректировка таймаутов и оптимизация initramfs. Всегда тестируйте изменения и имейте план отката.
Вам не обязательно менять оборудование: грамотная диагностика и последовательные правки служб могут сделать систему быстрее и отзывчивее.
Краткое резюме:
- Измерьте baseline командой systemd-analyze.
- Ищите долгие сервисы через systemd-analyze blame.
- Отключайте и маскируйте только проверенные ненужные службы.
- Оптимизируйте initramfs и параметры монтирования для дополнительного ускорения.