UPDATE: systemd норм, я лох; btrfs диски долго монтируются, но про это отдельно. Тема закрыта.
systemd-хейтеров прошу пройти мимо, не засирать тему.
Решил я ускорить загрузку системы. Для начала посмотрел что её тормозит:
# systemd-analyze critical-chain
graphical.target @18.585s <<<=== LOOK AT THIS <<<===
└─multi-user.target @18.585s
└─apcupsd.service @18.576s +7ms
└─network-online.target @18.575s
└─NetworkManager-wait-online.service @11.740s +6.833s
└─NetworkManager.service @11.694s +44ms
└─network-pre.target @11.693s
└─firewalld.service @10.930s +762ms
└─polkit.service @11.225s +152ms
└─basic.target @10.926s
└─dbus-broker.service @10.991s +139ms
└─dbus.socket @10.922s
└─sysinit.target @10.916s
└─systemd-update-utmp.service @10.906s +9ms
└─auditd.service @10.861s +41ms
└─systemd-tmpfiles-setup.service @10.786s +72ms
└─local-fs.target @10.782s
└─mnt-.transmission.mount @2.362s +8.418s <<<=== LOOK AT THIS <<<===
└─local-fs-pre.target @2.360s
└─systemd-tmpfiles-setup-dev.service @874ms +32ms
└─kmod-static-nodes.service @829ms +11ms
└─systemd-journald.socket
└─system.slice
└─-.slice
Менюшка логина появляется на 19-той секунде, не слишком быстро. Почти 7 секунд NetworkManager
ждал когда интернет появится, но сейчас не об этом. В данный момент меня интересует
mnt-.transmission.mount
, который съел 8 секунд. Вот этот юнит:
# systemctl cat mnt-.transmission.mount
[Unit]
Description = Transmission storage disk
Before = transmission-daemon.service
[Mount]
Type = btrfs
What = /dev/disk/by-uuid/84ebf9fc-dbd0-4a29-a38f-109e71957dee
Where = /mnt/.transmission
[Install]
RequiredBy = transmission-daemon.service
Монтирование двухтерабайтного диска и вправду занимает 8 секунд:
# time systemctl start mnt-.transmission.mount
real 0m8.389s
user 0m0.008s
sys 0m0.005s
Ладно, пробую сделать ленивое монтирование, авось поможет. Добавляю .automount
:
# systemctl cat mnt-.transmission.automount
[Unit]
Description = Transmission storage disk
Before = transmission-daemon.service
[Automount]
Where = /mnt/.transmission
[Install]
RequiredBy = transmission-daemon.service
Далее:
# systemctl disable mnt-.transmission.mount
# systemctl enable mnt-.transmission.automount
# reboot
Результат:
# systemd-analyze critical-chain
graphical.target @14.081s
└─multi-user.target @14.081s
└─transmission-daemon.service @3.493s +10.586s <<<=== LOOK AT THIS <<<===
└─mnt-.transmission.mount @3.681s +8.283s
└─mnt-.transmission.automount @2.300s
└─local-fs-pre.target @2.299s
└─systemd-tmpfiles-setup-dev.service @879ms +34ms
└─kmod-static-nodes.service @833ms +13ms
└─systemd-journald.socket
└─system.slice
└─-.slice
На 4 секуднды быстрее, но всё равно как-то не быстро. Пробую убрать из mnt-.transmission.mount
строчку
Before = transmission-daemon.service
Не помогает, всё те же 14 секунд, 10 из которых сожрал transmission-daemon.service
. Не он
сам, конечно, это всё то же монтирование /mnt/.transmission
, только теперь неявное.
Но вот вопрос: почему multi-user.target
ждёт готовности transmission-daemon.service
?
multi-user.target
про transmission
ничего не знает, но transmission-daemon.service
в
курсе про multi-user.target
:
# systemctl cat transmission-daemon.service
[Unit]
Description=Transmission BitTorrent Daemon
After=network.target
[Service]
User=transmission
Type=notify
ExecStart=/usr/bin/transmission-daemon -f --log-error
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target <<<=== LOOK AT THIS <<<===
WantedBy
указывает что при старте multi-user
надо запустить transmission-daemon
, но,
вроде бы, не говорит что надо ждать его готовности… Однако:
# man systemd.target
...
Target units will automatically complement all configured dependencies of
type Wants= or Requires= with dependencies of type After=...
Вот в чём засада: multi-user.target
ждёт готовности всех сервисов, которые к нему навязавлись
через WantedBy=multi-user.target
.
Однако:
...unless DefaultDependencies=no is set in the specified units.
Ok, пробую добавить DefaultDependencies=no
в transmission-daemon.service
:
# systemctl cat transmission-daemon.service
[Unit]
Description=Transmission BitTorrent Daemon
DefaultDependencies=no <<<=== LOOK AT THIS <<<===
After=network.target
[Service]
User=transmission
Type=notify
ExecStart=/usr/bin/transmission-daemon -f --log-error
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
Результат:
# systemd-analyze critical-chain
graphical.target @10.684s <<<=== LOOK AT THIS <<<===
└─multi-user.target @10.684s
└─apcupsd.service @10.676s +6ms
└─network-online.target @10.674s
└─NetworkManager-wait-online.service @3.681s +6.992s
└─NetworkManager.service @3.635s +43ms
└─network-pre.target @3.633s
└─firewalld.service @2.834s +798ms
└─polkit.service @3.177s +144ms
└─basic.target @2.823s
└─dbus-broker.service @2.921s +158ms
└─dbus.socket @2.806s
└─sysinit.target @2.785s
└─systemd-update-utmp.service @2.776s +8ms
└─auditd.service @2.728s +41ms
└─systemd-tmpfiles-setup.service @2.655s +67ms
└─local-fs.target @2.645s
└─run-user-1001.mount @13.492s
└─local-fs-pre.target @2.445s
└─systemd-tmpfiles-setup-dev.service @910ms +44ms
└─kmod-static-nodes.service @858ms +20ms
└─systemd-journald.socket
└─-.mount
└─systemd-journald.socket
└─...
Опять вылез NetworkManager-wait-online.service
, но transmission-daemon.service
пропал!
Бинго!?
Вопросы:
-
8 секунд на монтирование двухтерабайтного диска — это нормально? Это btrfs такой быстрый или диск медленный?
-
Чисто теоретически: Зачем
.target
ждёт готовности всех сервисов, которые к нему навязались черезWantedBy
? -
Есть ли способы запустить сервис, но не дожидаться его готовности без использования
DefaultDependencies=no
? Хз что там ещё было в этих зависимостях по умолчанию, мне кажется, чтоDefaultDependencies=no
— слишком грубо.