Dans les produits embarqués, la vitesse de démarrage du système est un indicateur clé. L'optimisation de la vitesse de démarrage du système est généralement appelée "Démarrage rapide". 快启”。
要对系统启动速度进行优化,首先要知道如何统计系统启动的时间。
下面介绍几种统计内核启动耗时的方法,以及对内核启动速度优化的几个方法。
一、启动耗时统计
printk time
打开kernel配置:
kernel hacking --->
[*] Show timing information on printks
打开后,每个printk的前面都会显示时间戳
主要用来测量内核启动过程各个阶段的耗时
initcall_debug
众所周知,kernel启动时会执行不同等级的initcall,而每个initcall
Pour optimiser la vitesse de démarrage du système, vous devez d'abord savoir 🎜comment compter le temps de démarrage du système. 🎜🎜Ce qui suit présente 🎜plusieurs méthodes pour compter le temps de démarrage du noyau , ainsi que plusieurs méthodes pour optimiser la 🎜vitesse de démarrage du noyau. 🎜
Bootchart est un outil logiciel open source utilisé pour l'analyse des performances du processus de démarrage de Linux. Il collecte automatiquement l'utilisation du processeur, le processus et d'autres informations pendant le processus de démarrage du système, et affiche les résultats de l'analyse sous forme graphique, qui peuvent être utilisés pour guider et optimiser le processus. processus de démarrage du système.
Modifierligne de commande du noyau. Modifiez le init est remplacé par "init=/sbin/bootchartd". kernel cmdline。将其中的init修改为“init=/sbin/bootchartd”。
Collectez des informations. bootchartd commencera à partir de /proc/stat,/proc/diskstat,/proc/[pid]/stat collecte des informations et les enregistre sous bootchart.tgz fichier 🎜🎜Convertir les images. Dans pc via la police pybootchartgui.pyL'outil bootchart.tgzconvertir enbootchart.png, pratique pour l'analyse🎜🎜🎜🎜Enfin, il sera également transformé en image pour analyse, par exemple :🎜
bootchar est principalement utilisé Mesurez le temps nécessaire pour monter le système de fichiers sur le processus de démarrage principal de l'applicationbootchar主要用来测量挂载文件系统到主应用程序启动过程中的耗时
gpio+示波器
可以找一个在系统启动过程中空闲的GPIO,在适当位置设置GPIO电平。
通过示波器抓取波形可以得到各阶段耗时。
通常该方法被用来测量整个启动的耗时,或者各阶段的耗时,该方法也是用的比较多的。
二、内核优化方法
kernel压缩方式
kernel有不同的压缩格式,常见的如gz、xz、lzma
gpio+oscilloscope
Vous pouvez en trouver un dans le système Inactif au démarrageGPIO, où Paramètres de position appropriésGPIO niveau.
🎜Vous pouvez obtenir la consommation de temps de chaque étape en capturant la forme d'onde avec un oscilloscope. 🎜🎜Habituellement, cette méthode est utilisée pour 🎜mesurer le temps de l'ensemble du démarrage, ou le temps de chaque étape🎜. Cette méthode est également couramment utilisée. 🎜
2. Méthode d'optimisation du noyau
méthode de compression du noyau
🎜noyau a différents formats de compression, les plus courants sont 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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>lzmaetc. . 🎜🎜🎜Différents formats de compression ont des vitesses de décompression différentes🎜 En comparant le temps de démarrage et l'utilisation du flash des différentes méthodes de compression, choisissez celle qui correspond à la situation réelle et optimisez-la. 🎜
Emplacement de chargement
L'image du noyau peut être déterminée par : rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break -all;color: rgb(239, 112, 96);"> kernel
auto-extractible, peut également être utilisé par uboot pour décompresser. <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;word-break: break-all;color: rgb(239, 112, 96);'>kernel自解压,也可以由uboot进行解压。
Pour noyau situation auto-extractible, Si le 0,05 compressé);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">kernel et décompressé kernel conflit d'adresse, il mettra d'abord Copiez-le dans un endroit sûr, puis décompressez-le pour éviter tout écrasement automatique. Cela nécessite une copie fastidieuse. 🎜🎜Définissez l'adresse de chargement et l'adresse d'exécution sur des adresses différentes, ce qui peut réduire la consommation de temps. 🎜🎜🎜🎜Recadrage du noyau🎜🎜🎜🎜Il est nécessaire de couper le noyau. Si l'image du noyau est trop grande, la décompression du noyau prendra beaucoup de temps, le noyau doit donc être recadré autant que possible. 🎜🎜Coupez le noyau pour réduire le temps de décompression. Moins de contenu d’initialisation réduira également la consommation de temps. 🎜🎜Ainsi, lorsque vous coupez le noyau, pensez à supprimer toutes les fonctions inutiles. 🎜🎜🎜🎜Valeur lpj prédéfinie🎜🎜🎜🎜LPJ C'est-à-dire <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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>loops_per_jiffy, tous les Il sera calculé une fois à chaque démarrage, mais si aucune modification n'est apportée, la valeur sera la même à chaque démarrage. Vous pouvez directement fournir la valeur pour ignorer le calcul. 🎜
如下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
内核module
只把必须要加进内核的才编译进内核,其他的编译成模块。
例如将必要的clock、tty、pinctrl等编译进内核
三、其他优化
uboot
如果是RISC-V架构,可以考虑去掉uboot。RISC-V架构,可以考虑去掉uboot。
XIP
xip:eXecute In Place。即芯片内执行,是指CPU直接从存储器中读取程序代码执行,而不用再读到内存中。