Dalam produk terbenam, kelajuan permulaan sistem ialah penunjuk utama Mengoptimumkan kelajuan permulaan sistem biasanya dipanggil "Permulaan pantas". 快启”。
要对系统启动速度进行优化,首先要知道如何统计系统启动的时间。
下面介绍几种统计内核启动耗时的方法,以及对内核启动速度优化的几个方法。
一、启动耗时统计
printk time
打开kernel配置:
kernel hacking --->
[*] Show timing information on printks
打开后,每个printk的前面都会显示时间戳
主要用来测量内核启动过程各个阶段的耗时
initcall_debug
众所周知,kernel启动时会执行不同等级的initcall,而每个initcall
Untuk mengoptimumkan kelajuan permulaan sistem, anda mesti terlebih dahulu tahu 🎜cara mengira masa permulaan sistem. 🎜🎜Yang berikut memperkenalkan 🎜beberapa kaedah untuk mengira masa permulaan kernel , serta beberapa kaedah untuk mengoptimumkan 🎜kelajuan permulaan kernel. 🎜
Bootchart ialah alat perisian sumber terbuka yang digunakan untuk analisis prestasi proses permulaan Linux Ia secara automatik mengumpul penggunaan CPU, proses dan maklumat lain semasa proses permulaan sistem, dan memaparkan hasil analisis secara grafik, yang boleh digunakan untuk membimbing dan mengoptimumkan. proses permulaan sistem.
Ubah suaikernel cmdline. Tukar init ditukar kepada "init=/sbin/bootchartd". kernel cmdline。将其中的init修改为“init=/sbin/bootchartd”。
Kumpul maklumat. bootchartd akan bermula daripada /proc/stat,/proc/diskstat,/proc/[pid]/stat mengumpul maklumat dan menyimpannya sebagai bootchart.tgz file 🎜🎜Tukar gambar. Dalam pc melalui pybootchartgui.pyAlat akan bootchart.tgztukar kepadabootchart.png, mudah untuk analisis🎜🎜🎜🎜Akhir sekali, ia juga akan dijadikan gambar untuk analisis, contohnya:🎜
bootchar digunakan terutamanya Ukur masa yang diperlukan untuk melekapkan sistem fail ke proses permulaan aplikasi utamabootchar主要用来测量挂载文件系统到主应用程序启动过程中的耗时
gpio+示波器
可以找一个在系统启动过程中空闲的GPIO,在适当位置设置GPIO电平。
通过示波器抓取波形可以得到各阶段耗时。
通常该方法被用来测量整个启动的耗时,或者各阶段的耗时,该方法也是用的比较多的。
二、内核优化方法
kernel压缩方式
kernel有不同的压缩格式,常见的如gz、xz、lzma
gpio+oscilloscope
Anda boleh cari satu dalam sistem Melahu semasa permulaanGPIO, di mana tetapan Kedudukan yang sesuaiGPIO level.
🎜Anda boleh mendapatkan penggunaan masa setiap peringkat dengan menangkap bentuk gelombang menggunakan osiloskop. 🎜🎜Biasanya kaedah ini digunakan untuk 🎜mengukur masa yang memakan masa keseluruhan permulaan, atau memakan masa setiap peringkat🎜 Kaedah ini juga biasa digunakan. 🎜
2. Kaedah pengoptimuman kernel
kaedah pemampatan kernel
🎜kernel mempunyai format mampatan yang berbeza, yang biasa ialah gz, xz, <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31 , 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>lzmadsb. . 🎜🎜🎜Format mampatan yang berbeza mempunyai kelajuan penyahmampatan yang berbeza🎜 Dengan membandingkan masa permulaan dan penggunaan denyar kaedah mampatan yang berbeza, pilih satu yang menepati situasi sebenar dan optimumkannya. 🎜
Untuk kernel situasi pengekstrakan sendiri, Jika 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">kernel dan nyahmampat kernel konflik alamat, ia akan meletakkan terlebih dahulu sendiri Salin ke tempat yang selamat dan kemudian nyahzip untuk mengelakkan overwrite sendiri. Ini memerlukan penyalinan yang memakan masa. 🎜🎜Tetapkan alamat pemuatan dan alamat berjalan kepada alamat yang berbeza, yang boleh mengurangkan penggunaan masa. . 🎜🎜Potong kernel untuk mengurangkan masa penyahmampatan. Kandungan permulaan yang kurang juga akan mengurangkan penggunaan masa. 🎜🎜Jadi apabila memangkas kernel, pertimbangkan untuk mengalih keluar semua fungsi yang tidak diperlukan. 🎜🎜🎜🎜Pratetap nilai lpj🎜🎜🎜🎜LPJ Iaitu, <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>loops_per_jiffy, setiap Ia akan dikira sekali setiap kali ia dimulakan, tetapi jika tiada pengubahsuaian dibuat, nilainya akan sama setiap kali ia dimulakan Anda boleh terus memberikan nilai untuk melangkau pengiraan. 🎜
如下log所示,有skipped,lpj由timer计算得来,不需要再校准calibrate了。
[ 0.019918] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[ 0.021772] initcall sunxi_pinctrl_init+0x0/0x44 returned 0 after 9765 usecs
[ 0.067694] initcall param_sysfs_init+0x0/0x198 returned 0 after 29296 usecs
[ 0.070240] initcall genhd_device_init+0x0/0x88 returned 0 after 9765 usecs
[ 0.080405] initcall init_scsi+0x0/0x90 returned 0 after 9765 usecs
[ 0.090384] initcall mmc_init+0x0/0x84 returned 0 after 9765 usecs
根据打印信息,可以对耗时较多的initcall进行优化。
内核initcall_module并行
initcall有很多等级,但比较耗时的是module。
如果是多核,可以考虑将module_initcall并行执行来节省时间。
目前内核do_initcalls是一个一个按照顺序来执行,可以修改成新建内核线程来执行
减少pty/tty个数
加入initcall打印之后,发现pty/tty init耗时很多,可减少个数来缩短init时间。
initcall pty_init+0x0/0x3c4 returned 0 after 239627 usecs
initcall chr_dev_init+0x0/0xdc returned 0 after 36581 usecs
Teknologi ini mesti disokong oleh cip Anda boleh menyemak fungsi SPI的描述是否支持XIP dalam manual cip.
4. Ringkasan
Pengoptimuman kelajuan permulaan sistem di atas akhirnya untuk memberikan beberapa idea dan kaedah.
Untuk mengoptimumkan kelajuan permulaan, secara amnya
anda perlu mempunyai pemahaman yang lebih mendalam tentang permulaan keseluruhan sistem.
Pengoptimuman tidak berkesudahan, ia perlu dioptimumkan mengikut matlamat, dengan mengambil kira kelajuan dan kesan permulaan.
Atas ialah kandungan terperinci Pengoptimuman kelajuan yang sangat berguna: buat sistem bermula lebih cepat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!