blame и critical-chain отвечают на разные вопросы: сколько запускался каждый юнит и кого загрузка ждала.
systemd-analyze blame (в Вики) печатает время запуска каждого юнита, от долгих к быстрым. systemd запускает юниты параллельно, поэтому сумма строк blame больше всей загрузки, а самый долгий юнит мог идти рядом с другими и никого не задержать. В blame попадают и юниты, запущенные позже, уже после загрузки. В начале урока самый долгий юнит загрузку как раз задержал: служба ожидания сети стоит и в blame, и в цепочке.
systemd-analyze critical-chain (в Вики) показывает цепочку, по которой загрузка дошла до цели позже всего. Цепочка идёт от цели вниз: под каждым юнитом — тот, кого он ждал последним. Число после @ — когда юнит стал активен, от начала работы служб; число после + — сколько он запускался. Юниты, которые закончили работу и не остались активными, в цепочку не попадают, как и всё, что запустили после загрузки.
Цепочку можно спросить и для одного юнита:
В blame у юнита 2 секунды — это вторая строка списка, но в critical-chain его нет. Почему?
-
Упавший юнит виден в
systemctl --failed; здесь его нет. blame меряет время запуска любого юнита, а в цепочку попадают только те, кого ждали последними. -
blame считает время от начала до конца запуска самого юнита — 2 секунды он и правда запускался. Цепочка показывает другое: кого цель ждала.
systemd запускает юниты параллельно: долгий юнит мог закончить раньше, чем те, кого цель ждала дольше. critical-chain показывает только последних в очереди ожидания, поэтому смотрят оба вывода.
Главное в шаге
-
blame— сколько запускался каждый юнит; юниты стартуют параллельно, и долгий юнит не обязательно задержал загрузку. -
critical-chain— кого загрузка ждала:@— когда юнит стал активен,+— сколько он запускался.