Оптимизация системного сервиса занимает слишком много времени - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть udhcpc служба в моей системе:

[Unit]
Description=uDHCP Client Service
After=network.target
Conflicts=systemd-resolved.service

[Service]
Type=forking
ExecStart=/sbin/udhcpc -p /var/run/udhcpc.brg0.pid -i brg0 -R -b
ExecStop=/bin/sh -c 'test -f /var/run/udhcpc.brg0.pid && kill $(cat /var/run/udhcpc.brg0.pid)'

[Install]
WantedBy=multi-user.target

Работает хорошо, за исключением того, что systemd-analyze показывает, что она прибавляет около 7 секунд ко времени загрузки:

          7.388s udhcpc.service
          4.946s dev-mmcblk1p2.device
          1.303s uim-sysfs.service
           959ms dev-mmcblk1p4.device
           752ms dev-mmcblk1p3.device
           739ms dev-mmcblk1p1.device
           718ms systemd-hwdb-update.service
           .
           .

А вот вывод systemd-analyze critical-chain:

multi-user.target @15.164s
[[0;1;31mudhcpc.service @7.773s +7.388s[[0m
  network.target @7.551s
    [[0;1;31msystemd-networkd.service @6.724s +668ms[[0m
      [[0;1;31msystemd-udevd.service @1.854s +87ms[[0m
        [[0;1;31msystemd-tmpfiles-setup-dev.service @1.662s +70ms[[0m
          [[0;1;31msystemd-sysusers.service @1.353s +229ms[[0m
            [[0;1;31msystemd-remount-fs.service @1.044s +238ms[[0m
              systemd-journald.socket @911ms
                -.slice @281ms

Полагаю, правильный способ исправить это - избегать использования udhcpc и придерживаться механизма, встроенного в systemd, но, к сожалению, это не мой звонок. Хотелось бы хотя бы оптимизировать время загрузки. Что я могу сделать?

1 Ответ

1 голос
/ 18 февраля 2020

«Проблема» - systemd-networkd, которая останавливает загрузку до тех пор, пока не будет настроена сеть - и это то, что вы хотите заменить, а не systemd-resolved.

Автоконфигурирование сети не может быть выполнено быстрее потому что, при правильной реализации, DHCP должен проверить, что адрес еще не используется, что включает в себя отправку пакета пакетов ARP и ожидание тайм-аута.

Поскольку вы вставляете службу между "сеть настроенные цели "и" многопользовательская загрузка завершена ", вы вводите зависимость там, где ее раньше не было.

Конфигурация сети обычно асинхронная, потому что любая служба, которая выходит из строя, когда сеть не настроена при запуске, также будет давать сбой когда сеть выходит из строя позже.

...