我如何才能减少启动时间?


11

删除了我不需要的大多数服务后,启动,拍照和关闭仍然需要大约28秒钟。我想进一步降低它,我做了一次systemd-analyze blame,得到了以下几点:

7.476s disableusb.service
1.736s keyboard-setup.service
958ms kbd.service
789ms systemd-fsck-root.service
737ms systemd-setup-dgram-qlen.service
722ms fake-hwclock.service
580ms kmod-static-nodes.service
565ms console-setup.service
534ms dev-mqueue.mount
518ms systemd-udev-trigger.service
498ms networking.service
489ms raspi-config.service
449ms hdparm.service
444ms systemd-journal-flush.service
376ms systemd-tmpfiles-setup.service
375ms dhcpcd.service
345ms systemd-logind.service
332ms ntp.service
317ms systemd-modules-load.service
281ms tmp.mount
272ms triggerhappy.service
269ms sys-kernel-debug.mount
265ms systemd-fsck@dev-mmcblk0p6.service
223ms rsyslog.service
221ms sys-kernel-config.mount
212ms systemd-tmpfiles-setup-dev.service
200ms systemd-remount-fs.service
198ms systemd-sysctl.service
184ms boot.mount
173ms systemd-random-seed.service
168ms rc-local.service
167ms user@1000.service
165ms var-log.mount
141ms udev-finish.service
130ms sys-fs-fuse-connections.mount
111ms systemd-user-sessions.service
94ms systemd-update-utmp.service
94ms alsa-restore.service
93ms systemd-update-utmp-runlevel.service
77ms systemd-udevd.service
55ms takepicture.service

disableusb.service是我的,与名字所暗示的不同,它也可以做其他事情。我怀疑我可以改善那里的时间。

我的系统无序列运行。我只需要通过wifi联网(wifi不会启动,因为我禁用了USB电源,但有时我不会禁用它,以便它可以启动)。

查看此列表,我看到诸如:1.736s keyboard-setup.service和的信息958ms kbd.service。他们花了将近3秒钟。如果我不使用键盘,是否需要它们?如果没有,如何禁用它们?

我还能从这里安全禁用哪些功能?

好吧,这里真的有些奇怪。我禁用了更多服务,但总花费时间仍然很长,只是现在有些服务花了更少的时间才花了更长的时间...

7.468s disableusb.service
1.676s console-setup.service
768ms systemd-logind.service
768ms systemd-fsck-root.service
726ms systemd-setup-dgram-qlen.service
714ms fake-hwclock.service
689ms networking.service
530ms systemd-journal-flush.service
524ms systemd-udev-trigger.service
509ms dev-mqueue.mount
509ms ntp.service
508ms kmod-static-nodes.service
439ms dhcpcd.service
334ms systemd-random-seed.service
331ms hdparm.service
318ms systemd-modules-load.service
281ms systemd-tmpfiles-setup.service
279ms systemd-fsck@dev-mmcblk0p6.service
279ms rsyslog.service
269ms systemd-remount-fs.service
265ms sys-kernel-config.mount
254ms systemd-tmpfiles-setup-dev.service
250ms systemd-sysctl.service
238ms rc-local.service
234ms systemd-udevd.service
232ms sys-kernel-debug.mount
224ms user@1000.service
187ms tmp.mount
176ms sys-fs-fuse-connections.mount
175ms var-log.mount
133ms systemd-update-utmp.service
122ms systemd-update-utmp-runlevel.service
122ms systemd-user-sessions.service
119ms alsa-restore.service
91ms boot.mount
88ms udev-finish.service
76ms takepicture.service

服务文件:(不知道为什么代码语法不起作用)

[Unit]
Description=Disable USB power
Before=networking.service
After=local-fs.target
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/sbin/usb_down

[Install]

这是情节:http : //www.eternal-lands.com/plot.svg

在此处输入图片说明


1
如果您运行systemd-analyze plot并在此处包括该图像,可能会更清楚问题出在哪里(这应该会生成一个很好的SVG图表,显示时序,并且可能会清除所有问题)。
Aurora0001

1
感谢您的建议,我编辑了帖子以添加情节。
Radu

您应该在中粘贴服务文件disableusb.service。顺便说一句,convert plog.svg plog.jpg如果您安装了该imagemagick软件包,则可以很快//
goldilocks

我编辑了问题以添加服务文件。
Radu

问题:您拥有哪种SD卡?较之任何优化,更快的SD卡可以提供更快的启动时间。额定速度至少为60mb / s吗?
Cyber​​nard

Answers:


7
7.476s disableusb.service

这意味着您正在前台运行某些内容,因为它不是持久性的,因此您认为将其作为背景没有任何意义。但是,如果花很长时间来完成它的工作,也许您应该在它启动后立即将其分叉到后台。

这里的问题很简单,就是它可能比不让启动时间更有利于您的启动时间,尽管这两种方式可能都没有任何区别。但是,如果其他条件取决于它的完成(而不是简单地成功完成初始化,这更适用于持久性服务),则应将其保留。

我看到这样的东西:1.736s keyboard-setup.service和958ms kbd.service。他们花了将近3秒钟。

我从来没有研究过它,因为它对我来说无关紧要,但是我相信在Raspbian上处理“键盘设置”的方式有问题。我已经看到它运行了90秒,然后被systemd杀死。

如果我不使用键盘,是否需要它们?如果没有,如何禁用它们?

我想不是,但是如果您突然需要键盘,这可能会给您带来麻烦……或者可能根本没有效果-我怀疑部分原因是它实际上没有完成任何操作,因为“键盘”设置”是静态配置,可以根据需要进行手动更改。

要禁用服务,sudo systemd disable ...

raspi-config.service

奇怪的是,它仍然存在,因为它应该在运行后禁用自身,但是如果您忽略它,则可能不会发生。这可能与键盘有关。如果可能的话,您应该插入监视器,看看它在启动后是否弹出。无论如何,您都可以禁用它。

这是情节:http : //www.eternal-lands.com/plot.svg

我认为你应该做disableusb.service After=sysinit.target


我做了一个:pi@raspberrypi:~$ sudo systemd disable raspi-config.service并且得到了Excess arguments.。另外,其中的许多服务未出现在中systemctl list-unit-files
Radu

1
关系如何networking.service?我以为那不是故意的,这就是为什么我建议在sysinit之后启动(等待网络初始化)的原因。无论如何,请记住,如果包括28秒disableusb,对于任何型号的Pi来说,这都是一个相当合理的启动时间。他们都不是很快。
goldilocks

1
禁用USB具有节省电量的作用,而不仅仅是防止wifi启动。这个想法是,wifi应该有时启动,并且在这种情况下脚本不会禁用电源。
Radu

2
如果您要坚持disableusb必须在网络启动之前完成操作,那是在浪费时间尝试进行优化,因为这是您要确保wifi无法启动的方式。坦率地说,那真是愚蠢。你在玩,也要吃我的蛋糕。如果要禁用USB以节省电量,那很好,但是您应该单独处理wifi问题。如果您不被打扰,也不要浪费时间尝试从启动时间中挤出几秒钟。
goldilocks

1
我不明白你在说什么。我告诉你,我按照您的建议移动了大部分脚本,启动时间增加了将近2秒钟……
Radu

3

从图中可以明显看出,禁用console-setup.service实际上并不会加快任何速度。您可以看到networking.service正在等待disableusb.service完成,因此1.6秒的console-setup.service并行加载时间根本不会影响整个启动时间。

计划关键路径时有一个想法,当该路径中的任何活动被延迟时,都会导致整个项目的延迟。其他活动具有“浮动性”,即它们并不重要,可以延迟而不会影响最终完成时间。

这是您必须节省时间的关键路径,而不是非关键活动。systemd-analyze critical-chain尽管您可以在情节中发现它们,但可以帮助您识别关键活动。任何边际收益disableusb.service都会极大地帮助您缩短启动时间。

这也可能有助于了解为什么您的服务需要这么长时间。为此,Bootchart2可能会有用。它可以安装:

apt-get install systemd-bootchart

要实际启用它,请编辑/boot/cmdline.txt并设置:

init=/lib/systemd/systemd-bootchart

启动完成后,您会发现该图表另存/run/log为SVG文件。然后,恢复init=...为初始设置(如果以前没有设置,则将其删除)。

另请参见手册页systemd-bootchart


我的disableusb.service唯一的cpu昂贵的东西raspistill -o /home/pi/test_boot.jpg。这只是一个测试,我可能会再修改一些参数并节省一些时间,但是将来我还想启用原始输出,这将意味着每个图片另外需要10 MB左右的内存,这可能会花费额外的时间来写。我会尝试启动图,希望它不需要监视器:)
Radu

我认为也产生了PNG。应该在文档中将其保存在Raspbian中。
Aurora0001

不幸的是,它不起作用。Setting up bootchart2 (0.14.4-3) ... update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults update-rc.d: warning: stop runlevel arguments (6 0) do not match bootchart-done Default-Stop values (none)。当我开始时,pybootchartgui -i我得到一个警告:路径'/var/log/bootchart.tgz'不存在,忽略了。解析错误:空状态:“ / var / log / bootchart.tgz”不包含有效的引导图
Radu

2
哦,事实证明,引导图现在在Stretch中称为systemd-bootchart,并且与systemd更紧密地集成在一起。我用适当的步骤编辑了@Radu。
Aurora0001

1
因此,我发现相机应用有5秒的延迟,这仅仅是因为。我用过--timeout 1,它将启动时间减少到15.389s :)
Radu

2

我正在运行一个无头的raspberrypi Zero,我可以像这样剃掉它几秒钟:

系统化

# Don't start the Light Display Manager on headless
sudo systemctl disable lightdm.service

# In a headless environment you don't need the keyboard setup.
sudo systemctl disable keyboard-setup.service

# Checks if the country is set in the WIFI config. This is likely a regulatory precaution.
sudo systemctl disable wifi-country.service

# Unless you have an external joystick or something that uses `/dev/input/`
sudo systemctl disable triggerhappy.service 

# I read that the swap file actually slows the PI down and decreases SD card lifetime. 
sudo systemctl disable dphys-swapfile.service

# Disable Bluetooth unless you need it
sudo systemctl disable hciuart.service

# Unless you have a hardware button to disable the WIFI you won't need this
sudo systemctl mask systemd-rfkill.service # disabling won't work


# Open GL should be obsolete on a headless machine
sudo systemctl disable gldriver-test.service

# Only disable this one if you're not using `/etc/rc.local`
sudo systemctl mask rc-local

# You might to re-enable this service when making changes using `sudo raspi-config`
sudo systemctl disable raspi-config.service

请注意,systemd-analyze输出启动时间:

Startup finished in 1.532s (kernel) + 20.862s (userspace) = 22.395s

最小引导输出

boot/cmdline.txt变化tty1tty3并追加loglevel=3 quiet logo.nologo在结束后rootwait

这为我节省了另一秒钟。

杂项

这个家伙完成了3秒的raspberrypi启动:https : //www.samplerbox.org/article/fastbootrpi

这是一个不错的博客,其中包含一些减少启动时间的步骤:http : //himeshp.blogspot.com/2018/08/fast-boot-with-raspberry-pi.html

DougieLawson解释了一些raspberrpi服务https://www.raspberrypi.org/forums/viewtopic.php?t=195692

深入教程为PDF

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.