优化 systemd 服务花费的时间太长
Optimizing a systemd service taking too long
我的系统中有这个 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
中内置的机制,但不幸的是,这不是我的决定。不过,我想至少优化启动时间。我可以做什么?
"problem" 是 systemd-networkd
,它将停止启动,直到网络配置完成 -- 这是您要替换的内容,而不是 systemd-resolved
。
网络自动配置无法变得更快,因为在正确实施时,DHCP 需要检查地址是否已被使用,这涉及发送一堆 ARP 数据包并等待超时。
由于您在 "network is configured" 和 "multi-user boot is complete" 目标之间插入了您的服务,因此您引入了之前存在 none 的依赖关系。
网络配置通常是异步的,因为在启动时未配置网络时失败的任何服务在稍后网络出现故障时也会失败。
我的系统中有这个 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
中内置的机制,但不幸的是,这不是我的决定。不过,我想至少优化启动时间。我可以做什么?
"problem" 是 systemd-networkd
,它将停止启动,直到网络配置完成 -- 这是您要替换的内容,而不是 systemd-resolved
。
网络自动配置无法变得更快,因为在正确实施时,DHCP 需要检查地址是否已被使用,这涉及发送一堆 ARP 数据包并等待超时。
由于您在 "network is configured" 和 "multi-user boot is complete" 目标之间插入了您的服务,因此您引入了之前存在 none 的依赖关系。
网络配置通常是异步的,因为在启动时未配置网络时失败的任何服务在稍后网络出现故障时也会失败。