Jak mogę bardziej skrócić czas uruchamiania?

11

Po usunięciu większości usług, których nie potrzebuję, nadal trwa około 28 sekund, aby uruchomić, zrobić zdjęcie i zamknąć. Chciałbym obniżyć to jeszcze bardziej, zrobiłem systemd-analyze blamei otrzymałem następujące:

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.servicejest moja i w przeciwieństwie do tego, co sama nazwa wskazuje, robi też inne rzeczy. Wątpię, czy mogę poprawić tam czas.

Mój system działa bez głowy, szeregowo. Potrzebuję tylko sieci przez Wi-Fi (Wi-Fi nie uruchamia się, ponieważ wyłączam zasilanie USB, ale czasami nie wyłączam go, aby mógł się uruchomić).

Patrząc na tę listę, widzę takie rzeczy jak: 1.736s keyboard-setup.servicei 958ms kbd.service. Zajmują prawie 3 sekundy. Czy potrzebuję ich, jeśli nie używam klawiatury? Jeśli nie, jak mogę je wyłączyć?

Co jeszcze mogę bezpiecznie wyłączyć z tego miejsca?

Ok, dzieje się tu coś naprawdę dziwnego. Wyłączyłem więcej usług i nadal trwa to w sumie tyle, że teraz niektóre usługi, które zajęły mniej czasu wcześniej, zajmują znacznie dłużej ...

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

Plik usługi: (nie mam pojęcia, dlaczego składnia kodu nie działa)

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

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

[Install]

Oto fabuła: http://www.eternal-lands.com/plot.svg

wprowadź opis zdjęcia tutaj

Radu
źródło
1
Być systemd-analyze plotmoże łatwiej będzie wyjaśnić, na czym polega problem, jeśli uruchomisz i włączysz tutaj obraz (to powinno wygenerować ładny wykres SVG pokazujący czasy i być może wyczyści wszystko).
Aurora0001
1
Dzięki za sugestię, edytowałem post, aby dodać fabułę.
Radu,
Należy wkleić plik usługi dla disableusb.service. BTW, możesz szybko, convert plog.svg plog.jpgjeśli zainstalujesz imagemagickpakiet /
goldilocks
Zredagowałem pytanie, aby dodać plik usługi.
Radu,
Pytanie: Jaką masz kartę SD? Szybsza karta SD może zapewnić krótszy czas uruchamiania niż jakakolwiek z tych optymalizacji. Czy jest oceniany na co najmniej 60 Mb / s?
cybernard

Odpowiedzi:

7
7.476s disableusb.service

Oznacza to, że uruchamiasz coś na pierwszym planie, ponieważ nie jest to trwałe, więc uważasz, że nie ma sensu umieszczać go w tle. Jeśli jednak zajmuje to tyle czasu, być może powinieneś rozwidlić go w tle, gdy tylko zacznie.

Problem polega po prostu na tym, że bardziej prawdopodobne jest, że skorzystasz z czasu rozruchu, niż pozostawianie go na pierwszym planie, chociaż i tak nie robi to żadnej różnicy. Jeśli jednak coś innego zależy od jego ukończenia (w przeciwieństwie do zwykłego pomyślnego zainicjowania, co bardziej dotyczy stałej usługi), należy pozostawić to jako.

Widzę takie rzeczy jak: 1.736s keyboard-setup.service i 958ms kbd.service. Zajmują prawie 3 sekundy.

Nigdy się tym nie zajmowałem, ponieważ nie ma to dla mnie większego znaczenia, ale wierzę, że jest coś złego w sposobie obsługi „konfiguracji klawiatury” w Raspbian. Widziałem, jak działa 90 sekund przed zabiciem przez systemd.

Czy potrzebuję ich, jeśli nie używam klawiatury? Jeśli nie, jak mogę je wyłączyć?

Przypuszczam, że nie, ale może to być dla ciebie kłopotliwe, jeśli nagle potrzebujesz klawiatury ... lub może to wcale nie mieć znaczenia - częściowo podejrzewam, że tak naprawdę nic nie robi, ponieważ klawiatura setup ”to konfiguracja statyczna, którą można ręcznie zmienić w razie potrzeby.

Aby wyłączyć usługę sudo systemd disable ....

raspi-config.service

Dziwne, wciąż istnieje, ponieważ ma się wyłączyć po uruchomieniu - ale może się tak nie zdarzyć, jeśli go zignorujesz. Może to dotyczyć klawiatury. Jeśli to możliwe, należy podłączyć monitor i sprawdzić, czy wyskakuje on po uruchomieniu. W każdym razie jest to coś, co równie dobrze możesz wyłączyć.

Oto fabuła: http://www.eternal-lands.com/plot.svg

Myślę, że powinieneś zrobić disableusb.service After=sysinit.target.

Złotowłosa
źródło
Zrobiłem: pi@raspberrypi:~$ sudo systemd disable raspi-config.servicei dostałem Excess arguments.. Ponadto wiele z tych usług nie pojawia się na liście systemctl list-unit-files.
Radu,
1
Co z tym związkiem networking.service? Zakładam, że nie było to celowe, dlatego zaleciłem zacząć po sysinit (który czeka na zainicjowanie pracy w sieci). W każdym razie pamiętaj, że jeśli 28 sekund obejmuje twój disableusb, to całkiem rozsądny czas rozruchu dla dowolnego modelu Pi. Żadne z nich nie jest szybkie.
goldilocks
1
Wyłączenie usb ma na celu oszczędzanie energii, a nie tylko zapobieganie uruchomieniu Wi-Fi. Chodzi o to, że wifi POWINIEN się czasami uruchamiać, a skrypt nie wyłącza zasilania w takim przypadku.
Radu
2
Marnujesz czas, próbując zoptymalizować, jeśli chcesz nalegać, że musisz disableusbzakończyć przed rozpoczęciem pracy w sieci, ponieważ w ten sposób chcesz się upewnić, że wifi się nie uruchomi. To po prostu głupie, szczerze mówiąc; bawisz się, masz moje ciasto i jesz. Jeśli chcesz wyłączyć USB w celu oszczędzania energii, świetnie, ale powinieneś poradzić sobie z problemem Wi-Fi osobno. Jeśli nie możesz się tym przejmować, nie marnuj czasu na wyciskanie sekund z czasu rozruchu.
goldilocks
1
Nie sądzę, że rozumiem co mówisz. Powiedziałem ci, że przesunąłem większość skryptu, jak sugerowałeś, a czas rozruchu wydłużył się o prawie 2 sekundy ...
Radu
3

Patrząc na wykres, wydaje się jasne, że wyłączenie w console-setup.servicerzeczywistości i tak niczego nie przyspieszy. Jak widać, networking.serviceczeka na disableusb.servicezakończenie, więc 1,6-sekundowy czas ładowania console-setup.servicerównoległego nie wpłynie w ogóle na całkowity czas uruchamiania.

Istnieje pomysł zaplanowania ścieżki krytycznej, która w przypadku opóźnienia jakiejkolwiek aktywności na tej ścieżce powoduje opóźnienia w całym projekcie. Inne czynności mają „pływak”, tzn. Nie są krytyczne i można je opóźnić bez wpływu na końcowy czas zakończenia.

To jest ta krytyczna ścieżka, na której musisz oszczędzać czas, a nie niekrytyczne działania. systemd-analyze critical-chainpomoże ci zidentyfikować krytyczne działania, chociaż możesz je właściwie dostrzec na fabule. Jakikolwiek marginalny zysk disableusb.serviceznacznie pomógłby w czasie rozruchu.

Może również pomóc zrozumieć, dlaczego Twoje usługi trwają tak długo. W tym celu przydatne może być Bootchart2 . Można go zainstalować z:

apt-get install systemd-bootchart

Aby faktycznie to włączyć, edytuj /boot/cmdline.txti ustaw:

init=/lib/systemd/systemd-bootchart

Po zakończeniu uruchamiania wykres zostanie zapisany /run/logjako plik SVG. Następnie przywróć init=...ustawienia początkowe (lub usuń je, jeśli nie było go wcześniej).

Zobacz także stronęsystemd-bootchart podręcznika dla .

Aurora0001
źródło
Jest to jedyna droga procesor, którą robi moja disableusb.service raspistill -o /home/pi/test_boot.jpg. To tylko test, mógłbym nieco zmodyfikować parametry i zaoszczędzić trochę czasu, ale w przyszłości chcę również włączyć nieprzetworzone dane wyjściowe, co będzie oznaczać kolejne ~ 10 MB dla każdego obrazu, co prawdopodobnie zajmie dodatkową sekundę pisać. Spróbuję uruchomić program, mam nadzieję, że nie wymaga monitora :)
Radu
Myślę, że produkowany jest również plik PNG; należy odnotować w dokumentacji, w której zapisuje się w języku Raspbian.
Aurora0001
Niestety to nie działa. 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). Kiedy zaczynam pybootchartgui -i, pojawia się: ostrzeżenie: ścieżka '/var/log/bootchart.tgz' nie istnieje, ignorując. Błąd analizy: stan pusty: „/var/log/bootchart.tgz” nie zawiera prawidłowego programu rozruchowego
Radu
2
Och, okazuje się, że bootchart w Stretch nazywa się teraz systemd-bootchart i jest ściślej zintegrowany z systemd. Edytowałem @Radu, podając odpowiednie kroki.
Aurora0001
1
Dowiedziałem się, że aplikacja aparatu ma opóźnienie 5 sekund, właśnie dlatego. Użyłem --timeout 1i to skróciło czas uruchamiania do 15.389s :)
Radu
2

Używam bezgłowego raspberrypi Zero i mógłbym się z niego zgolić kilka sekund w następujący sposób:

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

Należy pamiętać, że systemd-analyzewyświetla czas rozruchu:

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

Minimalna wydajność rozruchowa

W boot/cmdline.txtzmianie tty1do tty3i dołączyć loglevel=3 quiet logo.nologona końcu porootwait

To uratowało mi kolejną sekundę.

Misc

Ten facet osiąga rozruch w Raspberrypi w ciągu 3 sekund: https://www.samplerbox.org/article/fastbootrpi

To jest dobry blog z kilkoma krokami w celu skrócenia czasu uruchamiania: http://himeshp.blogspot.com/2018/08/fast-boot-with-raspberry-pi.html

DougieLawson wyjaśnia niektóre usługi raspberrpi https://www.raspberrypi.org/forums/viewtopic.php?t=195692

Szczegółowy samouczek w formacie PDF

Besi
źródło