Optimasi Boot Pi yang Ekstrem
(kittenlabs.de)- SolarCamPi adalah kamera tenaga surya off-grid yang hanya menyalakan Raspberry Pi Zero 2 W saat mengambil foto lalu mematikannya, sehingga waktu boot itu sendiri menentukan umur baterai
- Berdasarkan Debian 12 arm64 Lite, ketika
/init.shdiukur sebagai kode user space pertama, boot awal mengonsumsi sekitar 12 detik dan 9,5 Ws - Dengan mengurangi HDMI, LED, HAT/PoE/LCD, deteksi otomatis kamera dan display, serta initramfs, waktu tunggu dan deteksi yang tidak perlu dihilangkan, dan arus turun dari 136,7 mA → 120,6 mA
- Setelah beralih ke Buildroot 2024.02.1 dan kernel kustom, driver, kompresi, KASLR, serta beberapa mitigasi dihapus sehingga program user space Linux dapat dicapai dalam kurang dari 3,5 detik
- Menurunkan tegangan input dari 5,0 V ke 3,6 V mengurangi total energi dari 1,754 Ws → 1,438 Ws, tetapi karena beroperasi di luar spesifikasi, pengujian stabilitas dan keandalan masih tersisa
Mengapa SolarCamPi perlu memangkas waktu boot
- SolarCamPi adalah kamera WiFi bertenaga surya yang secara berkala mem-boot Raspberry Pi Zero 2 W untuk mengambil foto, mengunggahnya ke layanan cloud melalui WiFi, lalu mematikannya kembali
- Di lingkungan dengan daya terbatas seperti musim dingin Eropa Barat, setiap detik Pi menyala langsung menjadi biaya daya
- Koneksi server dan unggahan foto pada aplikasi user space sudah dioptimalkan sejauh mungkin, dan rangkaian elektroniknya juga sudah dirancang untuk mengurangi daya saat tidur
- Jalur penghematan yang tersisa ada dua
- Mengurangi arus konsumsi
- Mengurangi waktu berjalan
- Menurunkan arus saja tidak selalu menguntungkan
- Meski mematikan CPU turbo menurunkan arus, jika waktu eksekusi bertambah maka total energi justru bisa meningkat
- Tujuannya adalah meminimalkan luas area di bawah grafik arus dan waktu
Peralatan pengukuran dan metode pengujian
- Dalam optimasi boot embedded, karena perlu cepat memeriksa eksekusi nyata setelah perubahan, alat yang mengurangi bongkar-pasang kartu SD dan manipulasi daya sangat penting
- Peralatan yang digunakan adalah sebagai berikut
- Nordic Power Profiler Kit II
- USB-SD-Mux Fast
- Konverter USB-UART
- Power Profiler Kit II memasok daya ke perangkat yang diuji sambil mengukur konsumsi daya dari waktu ke waktu beserta status 8 input digital
- Pin GPIO Raspberry Pi dihubungkan ke input digital
- Sebagai aksi pertama aplikasi, GPIO di-toggle untuk mengukur waktu dari pemberian daya hingga eksekusi kode user space
- USB-SD-Mux adalah interposer yang ditempatkan di antara kartu microSD dan perangkat, memungkinkan komputer mengambil alih kartu, menulis ulang isinya, lalu mengembalikannya ke perangkat
- Menghilangkan pekerjaan berulang melepas kartu, memasukkannya ke reader, lalu memasangnya kembali ke perangkat
- Dengan GPIO onboard, reset atau kontrol daya perangkat uji juga dapat diotomatisasi
- Konsol USB-UART diperlukan untuk memeriksa status saat sistem bermasalah, seperti kegagalan boot atau masalah WiFi
Pengukuran boot berdasarkan Debian
- Pada image Debian 12 bookworm arm64 Lite yang bersih,
init=/init.shditambahkan ke/boot/firmware/cmdline.txt - Pengaturan ini membuat kernel menjalankan
/init.shsebagai proses pertama di user space sebelum systemd - Contoh
init.shmen-toggle GPIO4 lalu melanjutkan boot systemd denganexec /sbin/init - Pada pengukuran awal, input digital 0 menjadi low setelah sekitar 12 detik, mengonfirmasi bahwa
init.shtelah berjalan - Proses boot ini menggunakan total 1,90 coulomb
1.9As * 5.0V = 9.5Ws- Satu baterai alkaline AA dapat menyediakan energi sekitar 13500 Ws
Mengurangi arus konsumsi
- Setelah encoder HDMI dinonaktifkan sepenuhnya, arus turun dari 136,7 mA menjadi 122,6 mA
- Karena data kamera harus di-encode, GPU itu sendiri tidak bisa dimatikan
- Untuk aplikasi yang tidak memerlukan kamera atau GPU, menonaktifkan GPU juga bisa dicoba
- Menonaktifkan activity LED saja menghemat 2 mA, menurunkan arus dari 122,6 mA menjadi 120,6 mA
- Jika ada LED kamera, itu dapat dinonaktifkan
- Kemungkinan pantulan LED pada gambar juga berkurang
- Dalam pengujian perubahan pengaturan turbo, Pi pada kondisi perubahan saat ini menggunakan 1,62 As
- Saat dijalankan tanpa turbo paksa, ia menggunakan 1,58 As
- Karena alasan yang tidak diketahui, mematikan mode turbo/boost membalik status default GPIO4, sehingga polaritas diubah di
init.sh
Mengurangi waktu boot
- Arus berkurang sekitar 13%, tetapi sebelum output pertama Linux muncul di konsol masih diperlukan sekitar 8 detik, dan sekitar 1 As dikonsumsi di bagian ini
- Pada keluarga Raspberry Pi, GPU diinisialisasi terlebih dahulu
- GPU mencari
bootcode.bindi kartu SD - Pi 4 dan yang lebih baru menggunakan EEPROM
- GPU mencari
- Jika
BOOT_UARTpadabootcode.bindiaktifkan, log UART yang detail dapat dilihat- Cadangan
bootcode.binasli diperlukan, dan proses perubahan berpotensi merusak
- Cadangan
- Bootloader menunggu respons EDID untuk mencoba mendeteksi otomatis parameter video monitor HDMI yang terhubung
- Karena HDMI tidak digunakan, string EDID di-hardcode untuk menghindari deteksi
- Deteksi EEPROM I2C terkait HAT, kipas PoE, LCD, dan touchscreen juga dinonaktifkan
- Opsi-opsi ini menunggu respons bus I2C, jadi dapat dimatikan jika tidak diperlukan
- Deteksi otomatis kamera dan display MIPI juga memakan waktu
- Karena kamera yang digunakan sudah ditetapkan sebagai HQ Camera IMX477,
camera_auto_detect=0dandisplay_auto_detect=0digunakan untuk mematikannya, laludtoverlay=imx477dimuat langsung
- Karena kamera yang digunakan sudah ditetapkan sebagai HQ Camera IMX477,
- Dengan perubahan di atas, waktu boot yang dilaporkan sendiri turun dari 5,38 detik menjadi 4,75 detik, dan dengan mematikan initramfs lewat penghapusan
auto_initramfs=1, turun lagi hingga 4,47 detik - Metode
sdtweakyang meng-overclock periferal SD ke 100 MHz tidak menghasilkan perbedaan performa boot yang terukur- Karena ada risiko korupsi data pada akses tulis, ini tidak ideal untuk perangkat IoT jarak jauh
Bottleneck loading kernel dan peralihan ke Buildroot
- Pada titik ini, loading kernel merupakan salah satu pekerjaan paling lambat
- Loading
kernel8.imgberukuran 9.276.375 byte memakan waktu sekitar 1,54 detik - Kecepatan transfer sekitar 6 MiB/s
- Loading
- Loading kernel dilakukan oleh GPU yang menggunakan prosesor internal proprietary VideoCore IV
- Ada kemungkinan kode loader tidak efisien atau memakai pengaturan konservatif, tetapi karena berupa black box, register atau parameter tidak dapat disesuaikan secara berguna
- Overclock core prosesor GPU secara teori memungkinkan dan mengurangi waktu load kernel sebesar 20%
- Tidak direkomendasikan karena efek samping seperti keandalan tidak diketahui
- Sistem dipindahkan dari Raspbian/Debian ke distribusi kustom berbasis Buildroot 2024.02.1
- Menggunakan toolchain native aarch64
- glibc dan alat Raspberry Pi userland tetap dipertahankan
- Pada kernel kustom, hal-hal berikut dihapus atau dikurangi
- Dukungan suara
- Sebagian besar driver perangkat blok dan filesystem, kecuali SD/MMC dan ext4 tetap dipertahankan
- RAID, USB, HID, DVB
- Dukungan video dan framebuffer
- Fitur jaringan lanjutan seperti tunnel, bridging, firewall
- Kompresi kernel Gzip dan kompresi modul
- Membiarkan kernel dan modul sama-sama tidak terkompresi menguntungkan dari sudut pandang energi keseluruhan, meski GPU memuat lebih lama
- Dekompresi Gzip memakai banyak energi dan pada dasarnya mencakup tahap relokasi tambahan
- KASLR juga dinonaktifkan
- KASLR mengacak alamat load memori kernel agar pembuatan exploit lebih sulit, tetapi setelah loading oleh GPU, relokasi kernel diperlukan
- Dalam use case ini, permukaan serangan jaringan sangat terbatas dan semua software aplikasi berjalan sebagai root
- Mitigasi kerentanan speculative execution seperti Spectre juga dinonaktifkan
- Ukuran kernel hasilnya 8,5 MiB tanpa kompresi, dan ukuran kompresi Gzip untuk perbandingan adalah 4,1 MiB
- Kernel Raspbian asli berukuran 25 MiB tanpa kompresi dan 8,9 MiB dengan kompresi Gzip
Hasil akhir dan optimasi tegangan input
- Pada akhirnya, program user space Linux dapat dicapai dalam kurang dari 3,5 detik
- Waktu yang digunakan di dalam kernel Linux sekitar 400 ms
- Total konsumsi energi adalah 0,364 As * 5,0 V = 1,82 Ws
- Dibandingkan energi untuk mencapai user space pada stock Debian, 9,5 Ws, ini sekitar seperlimanya
- Setelah dipublikasikan, Graham Sutherland / Polynomial menunjukkan bahwa regulator Pi Zero tidak efisien pada input 5,0 V
- Dalam skenario pengujian dan produk akhir, tegangan input dapat diturunkan hingga 4,0 V
- 5,0 V:
350.94mAs * 5.0V = 1.754Ws - 4,0 V:
390.77mAs * 4.0V = 1.563Ws - 3,6 V:
399.60mAs * 3.6V = 1.438Ws
- 5,0 V:
- Saat tegangan diturunkan, mC, yaitu mAs, meningkat karena kenaikan arus, tetapi total energi turun signifikan
- Operasi pada 3,6 V mengurangi energi tambahan sekitar 20% dengan memakai switching regulator pada titik operasi yang lebih ideal, tetapi secara teknis berada di luar spesifikasi sehingga diperlukan pengujian stabilitas dan keandalan lebih lanjut
Konfigurasi dan kode yang dipublikasikan
- SolarCamPi config.txt:
config.txtlengkap - SolarCamPi Linux kernel defconfig: konfigurasi kernel yang dipangkas
- SolarCamPi-Buildroot v2 branch: keseluruhan tree Buildroot, masih dalam proses pengerjaan
1 komentar
Komentar Hacker News
Manajemen daya lini Raspberry Pi jelas merupakan salah satu kelemahannya. Karena itu, Pico 2 baru terasa menjanjikan, sebab tampaknya lebih mudah masuk ke kondisi hemat daya yang cukup dalam tanpa perangkat keras eksternal
Saya pernah membuat kamera untuk用途 serupa dengan Google Coral mini. Kameranya memang tidak sebagus HQ cam, tetapi RTC bawaan membuat mode siaga/bangun sangat mudah didukung, sehingga pas untuk aplikasi yang mengambil gambar secara berkala. Performanya dan memori 2GB-nya juga cukup untuk memproses gambar beresolusi tinggi
Secara fisik HQ camera bisa disambungkan, tetapi sejauh yang saya tahu tidak ada pipeline perangkat lunak di Coral untuk mengelolanya
Ekosistem Raspberry Pi jauh lebih matang, dan saya lebih percaya pada ketersediaan Raspberry Pi ke depannya dibanding kemungkinan Google terus memasok lini Coral. Tetap saja, saya benar-benar merasakan betapa bergunanya dukungan daya yang baik di perangkat keras
Ironisnya, kamera versi berikutnya dibuat oleh vendor eksternal dengan Raspberry Pi, dan masalah dayanya ditutupi dengan memasang baterai yang jauh lebih besar. Akibatnya saya kini menumpuk satu Coral dev mini dan 100 kamera yang bahkan belum dibuka, jadi harus mencari ide bagus atau menjualnya
Saya mencoba mencari akun Twitter resminya dengan menelusuri "google coral twitter", dan cukup mengejutkan hasil kedua adalah cuitan Anda yang ingin menjual 100 board tersisa itu
Melihat disebutkan bahwa daya dikelola dengan perangkat keras eksternal, tampaknya ini bukan sekadar masalah perangkat lunak
Jika aplikasi dibundel sebagai initramfs yang ditautkan ke kernel, untuk kasus sederhana kebutuhan me-mount filesystem bisa hilang, sehingga cukup banyak yang bisa dipangkas
Dalam beberapa kasus, hal seperti BusyBox init juga bisa diganti dengan skrip bash sederhana yang hanya melakukan boot minimal. Layak juga mempertimbangkan untuk me-mount devtmpfs, proc, sysfs, dan lain-lain, serta meninggalkan glibc jika memungkinkan
Sebelum membundel initramfs ke kernel, sebaiknya uji lewat chroot untuk memastikan semua dependensi aplikasi yang diperlukan sudah ada. Jika berjalan di chroot, kernel juga bisa menjalankannya saat boot, dan iterasi pengembangan menjadi jauh lebih cepat
Dengan mematikan modul kernel dan menautkan hanya fitur yang dibutuhkan ke dalam kernel, ruang dan waktu boot bisa dipangkas lagi. Kompresi zstd sebagai pengganti gzip juga layak diuji
Ini berlaku ketika tahap boot sebelumnya tidak memanfaatkan performa perangkat keras secara penuh, atau ketika image besar sehingga lebih baik melakukan hal lain secara paralel sambil memuatnya
Dengan begitu yang tersisa hanyalah initramfs berisi satu biner yang ditautkan statis
Ada dua tulisan bagus lain tentang memangkas waktu boot Pi
https://www.furkantokac.com/rpi3-fast-boot-less-than-2-secon...
http://himeshp.blogspot.com/2018/08/fast-boot-with-raspberry...
Dengan mengacu pada dua tulisan ini, saya membuat bingkai foto digital memakai Pi dan berhasil membuatnya boot sangat cepat sampai ke browser mode kios. Jika kebutuhannya sangat sedikit, waktu boot yang didapat bisa cukup mengesankan
Tragedi sebenarnya adalah kode GPU bootcode.bin bersifat black box proprietary dan tidak ada kode sumbernya
Mengerikan kalau proyek hacking dan hobi harus memiliki black box rahasia tersembunyi yang tidak bisa dimodifikasi
Sekarang itu adalah perangkat lunak bebas dan open source
https://www.theregister.com/2023/11/28/microsoft_opens_sourc...
Namun itu tidak otomatis membuat seluruh firmware Pi menjadi bebas dan open source. Karena itu bukan driver. Tapi jika mereka mau, mereka bisa melakukannya
Saya penasaran apa yang ada di dalamnya sampai harus ditutup
Saya suka keseluruhan tulisannya, tetapi saya kurang yakin dengan bagian ini
Maksudnya bagian yang mengatakan bahwa mematikan turbo CPU untuk sedikit menghemat konsumsi arus adalah pilihan buruk, dan karena waktu yang menjadi lebih lambat, energinya justru lebih banyak daripada menyelesaikan pekerjaan cepat lalu mematikannya
Di kelas ilmu komputer saya belajar bahwa konsumsi daya berbanding lurus dengan kuadrat frekuensi clock. Artinya, jika clock dinaikkan dua kali lipat, dayanya menjadi empat kali lipat
Kalau begitu, untuk memastikan apakah kenaikan kuadratik dari peningkatan clock lebih besar daripada hasil kali konsumsi daya tetap yang muncul karena waktu kerja bertambah, sepertinya perlu mengukur selisih daya sebenarnya
Terkait hal itu, akan bagus jika CPU Pi menyediakan informasi konsumsi daya yang rinci, yang bisa diturunkan dari datasheet atau diekspos secara real-time lewat register
Sebagian besar chip membutuhkan tegangan lebih tinggi untuk mencapai kecepatan clock yang lebih tinggi, dan dari situlah hubungan kuadratik itu muncul
Namun setahu saya Raspberry Pi tidak memiliki kontrol tegangan dinamis, jadi jika hanya menurunkan clock tanpa menurunkan tegangan, sepertinya tidak akan berdampak pada total konsumsi energi switching
Tentu saja ada titik optimalnya juga. Jika CPU dioverclock terlalu tinggi, performa per watt menjadi terlalu buruk sehingga race to idle tidak lagi berlaku
Karena itu, sistem embedded modern sering memakai strategi "race-to-sleep" atau "race-to-halt": menjalankan pekerjaan secepat mungkin, lalu mematikan sebagian besar komponen sampai event berikutnya datang
Jika suatu perhitungan membutuhkan 1J untuk dilakukan dalam 1 detik, misalnya 1W pada 1GHz, maka dalam model sapi bulat yang sempurna, melakukan perhitungan yang sama dalam 0,5 detik berarti membutuhkan 2J. Karena pada 2GHz dayanya menjadi 4W
Namun itu hanya melihat konsumsi CPU, dan jika seluruh sistem memiliki konsumsi tetap 4W, maka pada 1GHz totalnya 5J, yaitu CPU 1J dan sistem 4J, sedangkan pada 2GHz totalnya 4J, yaitu CPU 2J dan sistem 2J
Jika pemahaman saya benar, artinya kalau konsumsi daya seluruh sistem kira-kira sebanding dengan konsumsi daya CPU dalam kondisi turbo, maka memakai turbo adalah pilihan yang tepat, dan jika tidak, maka bukan?
Mengesankan. Namun setiap kali membaca tulisan seperti ini, saya teringat rekaman boot Plan 9 di Pi Zero yang pernah saya buat: https://taoofmac.com/space/blog/2020/09/02/1900#resurrecting
GIF-nya adalah output real-time
Namun apakah ia bisa memuat driver kamera dan Wi-Fi yang dibutuhkan proyek di tulisan asli adalah soal lain
Secara pribadi, menurut saya waktu boot distro Linux secara umum cukup mengecewakan, dan pada hardware lemah seperti ini masalahnya jauh lebih besar
Saya pernah melakukan optimasi serupa di SBC MQ-Pro. Di laptop pun hal ini cukup terasa. MacBook mungkin pengecualian, tetapi bagaimanapun ini hal yang menjengkelkan
Setelah menyala, kalau hanya login lagi memang seketika, tetapi reboot memakan waktu lumayan
Namun distro, dengan alasan yang masuk akal, membuat kernel dan initramfs yang sangat serbaguna, dan kombinasi ini memang tidak terlalu cepat saat boot
[0]: https://blog.davidv.dev/posts/minimizing-linux-boot-times/
Kecuali ada salah konfigurasi mengerikan seperti NetworkManager menunggu Wi-Fi yang tidak ada selama 90 detik. Mesin Linux saya butuh sekitar 4 detik sampai graphical.target, dan sebagian besar karena koneksi Wi-Fi dan ntpd, yang keduanya pada prinsipnya opsional
Jika benar-benar ingin boot sangat cepat, buang saja semua kemungkinan konfigurasi dinamis seperti lapisan kompatibilitas bootloader, abstraksi, dan initramfs. Namun itu membuat kita bergantung pada vendor hardware, jadi tidak sepadan
Misalnya MacBook Air 11 yang menjalankan Linux menampilkan layar login begitu cepat sampai saya hampir tidak sempat melihat log boot. Menurut systemd-analyze, kurang dari 4 detik sampai graphical target
Kuncinya tampaknya dua hal. Tidak memakai desktop environment, lalu boot ke mode teks dan menjalankan startx saat diperlukan, atau boot ke X dengan login manager ringan seperti lightdm. Tanpa desktop environment, jumlah service turun beberapa kali lipat hingga hanya satu digit, sehingga tekanan I/O saat boot pada hardware lama jauh berkurang. Bahkan saat X dijalankan, sistem yang sudah boot memakai kurang dari 200MB
Satu lagi, EFI stub bisa meningkatkan kecepatan: https://wiki.archlinux.org/title/EFISTUB
Kesan pertama saya adalah, apakah tidak bisa memakai core lain? Apakah benar-benar perlu Linux hanya untuk mengambil foto dan mengirimkannya ke cloud?
Saya bukan orang hardware, jadi saya penasaran bagaimana pekerjaan ini bisa diselesaikan dengan anggaran seminimal mungkin. Tulisannya menarik
Mungkin hanya karena sekarang ada dua ESP32-CAM di atas meja makan saya, tapi saya penasaran bagaimana konfigurasi ESP32-CAM akan dibandingkan. Mungkin hanya akan oke sampai gambar 2 megapiksel, tetapi waktu mulai dan konsumsi dayanya sepertinya sama-sama hampir satu orde besaran lebih rendah
Kalau penasaran, detailnya ada di sini: https://components101.com/modules/esp32-cam-camera-module
Secara prinsip bisa saja bare-metal, tetapi membuat periferal yang diperlukan berjalan itu tidak mudah
Saya sempat bertanya-tanya kenapa kernel kustom baru muncul begitu terlambat. Kalau mau optimasi, bukankah biasanya mulai dari LFS atau distro berbasis source? Sepertinya perangkat seperti ini juga tidak benar-benar membutuhkan pembaruan software otonom
Saya juga penasaran apakah EFI/BIOS pada perangkat seperti ini bisa dioptimalkan. Setidaknya di desktop Arch Linux biasa saya, itu memakan porsi cukup besar dari waktu boot
$ systemd-analyzeStartup finished in 10.076s (firmware) + 1.339s (loader) + 1.569s (kernel) + 2.974s (initrd) + 3.894s (userspace) = 19.854sSaya tidak tahu persis hardware Raspberry Pi, tetapi banyak SoC embedded lain punya bootloader yang cukup minimal yang berjalan dengan u-boot dan biasanya sangat cepat. Apalagi kalau jeda untuk menunggu input pengguna diatur ke 0
Sistem kernel minimal plus busybox jauh lebih tidak menyakitkan, dan Gentoo juga bukan pilihan buruk
> systemd-analyzeStartup finished in 3.259s (firmware) + 35.127s (loader) + 1.823s (kernel) + 2.927s (userspace) = 43.138s3,5 detik memang keren, tetapi kalau seluruh skenarionya benar-benar hanya tersambung ke Wi-Fi setiap beberapa menit untuk mengunggah gambar, ESP32 akan menjadi pilihan yang jauh lebih baik dari sisi konsumsi daya
Kecuali kalau modul kamera untuk Pi memiliki fitur tertentu yang memang dibutuhkan dan tidak ada pada kamera yang kompatibel dengan ESP32-CAM
Ini terlihat seperti melakukan terlalu banyak pekerjaan untuk sesuatu yang bisa dilakukan mikrokontroler nyaris tanpa usaha