Improving performance (Русский)/Boot process (Русский)
Улучшение производительности загрузки системы уменьшает время ожидания загрузки, а также служит способом изучения взаимодействия определённых системных файлов и скриптов друг с другом. В этой статье сделана попытка собрать воедино методы ускорения загрузки системы Arch Linux.
Анализ процесса загрузки
С помощью systemd-analyze
В состав systemd входит инструмент systemd-analyze
, который можно использовать для просмотра информации о времени загрузки, в том числе svg-график с отображением юнитов, ожидающих запуска своих зависимостей. Вы можете увидеть, какие юниты вызывают замедление процесса загрузки, и попытаться оптимизировать их запуск.
Чтобы узнать, сколько времени было потрачено в пространстве ядра и пространстве пользователя при загрузке, просто используйте:
$ systemd-analyze
Просмотр списка запущенных юнитов, отсортированного по времени, которое потребовалось каждому из них для запуска:
$ systemd-analyze blame
В некоторых местах загрузка не может продолжаться, пока не произойдёт успешное выполнение какого-то юнита. Чтобы узнать, какие юниты оказываются в этих критических местах цепочки загрузки, выполните команду:
$ systemd-analyze critical-chain
Также можно создать создать SVG-файл, который демонстрирует процесс загрузки в графическом виде, подобно Bootchart:
$ systemd-analyze plot > plot.svg
Смотрите systemd-analyze(1) для более подробной информации.
С помощью bootchart2
Также можно использовать Bootchart2 для визуализации процесса загрузки.
Использование хука systemd
По умолчанию в конфигурации mkinitcpio для сборки initramfs используются хуки base
и udev
. Для более быстрой загрузки их можно заменить на systemd
.
Смотрите mkinitcpio (Русский)#Доступные хуки для более подробной информации. Также смотрите fsck (Русский)#Проверка при загрузке в случае замены хука fsck
.
Компиляция собственного ядра
Компиляция своего ядра может сократить время загрузки и использование памяти, хотя со стандартизацией 64-битной архитектуры и модульной природой ядра Linux улучшение может оказаться не таким значительным. Смотрите Ядро#Компиляция для более подробной информации.
Initramfs
Самый простой способ уменьшить размер initramfs — добавить хук autodetect
в настройках mkinitcpio. Более сложные методы уменьшения размера описаны в статье Minimal initramfs.
В зависимости от вашего оборудования (процессора и скорости хранилища), использование lz4 вместо используемого по умолчанию алгоритма сжатия zstd может оказаться быстрее, поскольку более высокая скорость декомпрессии при загрузке обычно компенсирует немного больший размер initramfs, который приходится считывать с диска. Смотрите раздел mkinitcpio (Русский)#COMPRESSION.
Выбор оптимального способа запуска служб
Одной из центральных особенностей systemd является активация через D-Bus и сокеты. Это предпочтительно в большинстве случаев, поскольку позволяет службам запускаться только при первом обращении к ним, что, как правило, хорошо (например, включение службы cups.service
во время загрузки обычно не особо полезно для настольных систем, вместо него лучше включить cups.socket
, который будет запускать службу, только когда потребуется что-то распечатать).
Однако если вы точно знаете, что какая-то служба (например, upower) всегда будет запускаться во время загрузки, то общее время загрузки можно уменьшить, запустив её как можно раньше. Для этого можно включить службу, например upower.service
(если файл службы настроен для этого, что в большинстве случаев так и есть).
Это заставит systemd запустить UPower как можно раньше, не вызывая гонок с активацией сокета или D-Bus.
Последовательная раскрутка дисков
Некоторые диски поддерживают последовательную раскрутку (staggered spin-up): ОС проверяет интерфейсы ATA последовательно, что позволяет раскручивать диски по одному и таким образом снижать пиковое энергопотребление. Это замедляет скорость загрузки, а на большинстве домашних компьютеров вообще не даёт никаких преимуществ, поскольку диски уже раскручиваются сразу после включения питания. Чтобы проверить, используется ли SSS:
# dmesg | grep SSS
Если не используется, то эта команда ничего не выведет.
Для отключения добавьте параметр ядра libahci.ignore_sss=1
.
Монтирование файловых систем
Благодаря хуку fsck
в mkinitcpio можно избежать дорогостоящего перемонтирования корневого раздела, изменив ro
на rw
в параметрах ядра: опции монтирования можно задать через rootflags=rw,другие_опции
. Запись должна быть удалена из файла /etc/fstab
, иначе служба systemd-remount-fs.service
будет продолжать попытки применения этих настроек. В качестве альтернативы можно попытаться замаскировать этот юнит.
Если в качестве корневой файловой системы используется Btrfs, то нет необходимости в выполнении fsck при каждой загрузке, как в других файловых системах. В этом случае можно удалить хук fsck
. Вы также можете замаскировать службу systemd-fsck-root.service
или запретить ей выполнять проверку корневой файловой системы с помощью параметра ядра fsck.mode=skip
. Без fsck
systemd всё равно будет выполнять проверку всех соответствующих файловых систем через systemd-fsck@.service
.
Из /etc/fstab
можно удалить записи для тех точек монтирования, которые systemd монтирует сам с использованием своих юнитов (список таких юнитов можно посмотреть с помощью команды pacman -Ql systemd | grep '\.mount$'
). Например, нередко пользователи по старой привычке добавляют запись для монтирования /tmp
, как делали во времена sysvinit, но сегодня в этом нет необходимости, так как systemd-юнит tmp.mount
уже позаботился об этом. Следовательно, такую запись можно смело удалить.
Другие файловые системы, такие как /home
или системный раздел EFI, могут быть смонтированы с помощью отредактированных mount-юнитов. Добавление noauto,x-systemd.automount
к опциям монтирования будет буферизировать весь доступ к этому разделу, а также будет выполнять проверку и монтировать его в момент первого обращения, таким образом уменьшая количество файловых систем, которые нужно проверять/монтировать в процессе загрузки.
- Это изменит тип файловой системы
/home
наautofs
, который locate по умолчанию игнорирует. В зависимости от системы, ускорение от отложенного монтирования/home
может составлять около секунды-двух, так что, возможно, это не стоит того. - Если система установлена в подтом btrfs (то есть корневой каталог
/
сам по себе является подтомом), а/home
находится на отдельной файловой системе, вы можете захотеть предотвратить создание подтома/home
. Замаскируйте tmpfiles-настройкуhome.conf
:ln -s /dev/null /etc/tmpfiles.d/home.conf
.
Уменьшение вывода во время загрузки
На некоторых системах, особенно с SSD, узким местом процесса загрузки может оказаться медленный TTY, поэтому меньший объём выводимого в консоль текста означает более быструю загрузку. Смотрите статью Тихая загрузка для более подробной информации.
Изменение загрузчика
Изменение загрузчика (например, на более простой, такой как systemd-boot), может сэкономить несколько секунд.
Если есть возможность использовать EFISTUB, это сэкономит ещё больше времени.
Ждущий режим
Лучший способ сократить время включения системы — не выключать её вообще. Попробуйте вместо выключения использовать ждущий режим.