Como posso diminuir mais o tempo de inicialização?

11

Depois de remover a maioria dos serviços que eu não preciso, ainda leva cerca de 28 segundos para inicializar, tirar uma foto e desligar. Eu gostaria de diminuir ainda mais isso, fiz um systemd-analyze blamee obtive o seguinte:

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 [email protected]
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 [email protected]
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é meu e, ao contrário do que o nome indica, ele também faz outras coisas. Duvido que possa melhorar o tempo lá.

Meu sistema está funcionando sem cabeça, por serial. Eu só preciso de rede via Wi-Fi (o Wi-Fi não inicia porque desabilito a alimentação USB, mas às vezes não o desabilito para que possa iniciar).

Olhando para esta lista, vejo coisas como: 1.736s keyboard-setup.servicee 958ms kbd.service. Eles levam quase 3 segundos. Preciso deles se não estiver usando um teclado? Caso contrário, como faço para desativá-los?

O que mais posso desativar com segurança a partir daqui?

Ok, há algo realmente estranho acontecendo aqui. Desabilitei mais alguns serviços, e ainda leva muito tempo no total, só que agora alguns serviços que levavam menos tempo antes demoravam muito mais ...

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 [email protected]
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 [email protected]
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

Arquivo de serviço: (não faço ideia por que a sintaxe do código não funciona)

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

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

[Install]

Aqui está o enredo: http://www.eternal-lands.com/plot.svg

insira a descrição da imagem aqui

Radu
fonte
11
Talvez seja mais claro qual é o problema se você executar systemd-analyze plote incluir a imagem aqui (isso deve produzir um bom gráfico SVG mostrando os horários e talvez esclarecer as coisas).
precisa saber é o seguinte
11
Obrigado pela sugestão, editei o post para adicionar o enredo.
Radu
Você deve colar no arquivo de serviço para disableusb.service. BTW, você pode rapidamente convert plog.svg plog.jpgse instalar o imagemagickpacote /
goldilocks
Editei a pergunta para adicionar o arquivo de serviço.
Radu
Pergunta: Que tipo de cartão SD você possui? Um cartão SD mais rápido pode fornecer tempos de inicialização mais rápidos do que qualquer uma dessas otimizações. É classificado para pelo menos 60mb / s?
cybernard

Respostas:

7
7.476s disableusb.service

Isso implica que você está executando algo em primeiro plano, porque não é persistente; portanto, você sente que não há sentido em colocá-lo em segundo plano. No entanto, se levar muito tempo para fazer isso, talvez você deva colocá-lo em segundo plano assim que começar.

O problema aqui é simplesmente que é mais provável que você beneficie o tempo de inicialização do que deixá-lo em primeiro plano, embora isso possa não fazer nenhuma diferença. No entanto, se algo mais depender da conclusão (ao contrário de simplesmente concluir a inicialização com êxito, o que é mais aplicável a um serviço persistente), você deve deixá-lo como.

Eu vejo coisas como: 1.736s keyboard-setup.service e 958ms kbd.service. Eles levam quase 3 segundos.

Eu nunca procurei, porque não importa muito para mim, mas acredito que há algo errado na maneira como a "configuração do teclado" é tratada no Raspbian. Já o vi rodar 90 segundos antes de ser morto pelo systemd.

Preciso deles se não estiver usando um teclado? Caso contrário, como faço para desativá-los?

Suponho que não, mas isso pode criar um aborrecimento para você, se você precisar de um teclado de repente ... ou talvez não faça nenhuma diferença - parte da minha suspeita é que ele realmente não está realizando nada, já que o "teclado setup "é algo que é configuração estática e pode ser alterado manualmente, conforme necessário.

Para desativar um serviço sudo systemd disable ...,.

raspi-config.service

Estranho, isso ainda está lá, pois deve se desativar após a execução - mas isso pode não acontecer se você o ignorar. Isso pode estar relacionado à coisa do teclado. Se possível, você deve conectar um monitor e ver se ele aparece após a inicialização. De qualquer forma, isso é outra coisa que você também pode desativar.

Aqui está o enredo: http://www.eternal-lands.com/plot.svg

Eu acho que você deveria fazer disableusb.service After=sysinit.target.

Cachinhos Dourados
fonte
Eu fiz um: pi@raspberrypi:~$ sudo systemd disable raspi-config.servicee consegui Excess arguments.. Além disso, muitos desses serviços não aparecem listados em systemctl list-unit-files.
Radu
11
E o relacionamento com networking.service? Presumo que isso não tenha sido intencional, por isso recomendei iniciar após o sysinit (que aguarda a inicialização da rede). De qualquer forma, lembre-se de que se 28 segundos incluírem o seu disableusb, é um tempo de inicialização bastante razoável para qualquer modelo de Pi. Nenhum deles é rápido.
goldilocks
11
Desabilitar o usb tem o papel de economizar energia, não apenas para impedir que o wifi seja iniciado. A idéia é que o wifi DEVE iniciar às vezes, e o script não desativará a energia nesse caso.
Radu
2
Você está perdendo seu tempo tentando otimizar se quiser insistir que disableusbprecisa terminar antes do início da rede, porque é assim que você deseja garantir que o wifi não seja iniciado. Isso é idiota, para ser franco; você está jogando, coma meu bolo e coma também. Se você deseja desativar o USB para economizar energia, ótimo, mas deve lidar com o problema do wifi separadamente. Se você não pode ser incomodado, também não perca tempo tentando espremer segundos do seu tempo de inicialização.
goldilocks
11
Acho que não entendo o que você está dizendo. Eu lhe disse que eu movi a maior parte do script como você sugeriu, e o tempo de boot aumentou com quase 2 segundos ...
Radu
3

Olhando para o gráfico, parece claro que a desativação console-setup.servicenão acelerará nada de qualquer maneira. Como você pode ver, networking.serviceestá aguardando a disableusb.serviceconclusão, portanto, um tempo de carregamento de 1,6 segundo para console-setup.serviceexecução em paralelo não afetará o tempo geral de inicialização.

Existe uma idéia no agendamento de um caminho crítico que, quando qualquer atividade nesse caminho é atrasada, causa atrasos em todo o projeto. As outras atividades têm 'flutuação', ou seja, não são críticas e podem ser adiadas sem afetar o tempo final de chegada.

É nesse caminho crítico que você deve economizar tempo, não nas atividades não críticas. systemd-analyze critical-chainajudará a identificar as atividades críticas, embora você possa identificá-las na trama. Qualquer ganho marginal disableusb.serviceajudaria significativamente o tempo de inicialização.

Também pode ajudar a entender por que seus serviços demoram tanto. Para isso, o Bootchart2 pode ser útil. Pode ser instalado com:

apt-get install systemd-bootchart

Para ativá-lo, edite /boot/cmdline.txte defina:

init=/lib/systemd/systemd-bootchart

Após a conclusão da inicialização, você encontrará o gráfico salvo /run/logcomo um arquivo SVG. Em seguida, volte init=...à sua configuração inicial (ou exclua-a se não estivesse lá antes).

Veja também a página de manual parasystemd-bootchart .

Aurora0001
fonte
A única coisa cara da cpu que o disableusb.service faz raspistill -o /home/pi/test_boot.jpg. Este é apenas um teste, eu posso modificar os parâmetros um pouco mais e economizar algum tempo, mas no futuro também quero ativar a saída bruta, o que significará mais ~ 10 MB para cada foto, o que provavelmente levará um segundo extra escrever. Vou tentar a coisa bootchart, espero que não requer um monitor :)
Radu
Eu acho que um PNG também é produzido; isso deve ser observado na documentação em que ele é salvo no Raspbian.
precisa saber é o seguinte
Infelizmente, isso não funciona. 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). Quando inicio pybootchartgui -i, recebo um aviso: caminho: /var/log/bootchart.tgz 'não existe, ignorando. Erro de análise: estado vazio: '/var/log/bootchart.tgz' não contém um gráfico de inicialização válido
Radu
2
Oh, acontece que o bootchart agora é chamado systemd-bootchart no Stretch e está integrado mais de perto com o systemd. Editei o @Radu com as etapas apropriadas.
precisa saber é o seguinte
11
Então, descobri que o aplicativo da câmera tem um atraso de 5 segundos, apenas porque. Eu usei --timeout 1e reduziu o tempo de inicialização para 15.389s :)
Radu
2

Estou executando um zero raspberrypi sem cabeça e poderia raspar alguns segundos com o seguinte:

Systemd

# 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

Observe que systemd-analyzegera o tempo de inicialização:

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

Saída mínima de inicialização

Na boot/cmdline.txtmudança tty1para tty3e acrescentar loglevel=3 quiet logo.nologono final depoisrootwait

Isso economizou outro segundo para mim.

Diversos

Esse cara consegue uma inicialização raspberrypi de 3 segundos: https://www.samplerbox.org/article/fastbootrpi

Este é um bom blog com algumas etapas para reduzir o tempo de inicialização: http://himeshp.blogspot.com/2018/08/fast-boot-with-raspberry-pi.html

DougieLawson explica alguns dos serviços raspberrpi https://www.raspberrypi.org/forums/viewtopic.php?t=195692

Tutorial detalhado como PDF

Besi
fonte