目录
initcall_debug" >initcall_debug
一、启动耗时统计 " >一、启动耗时统计
printk time" >printk time
bootgraph" >bootgraph
bootchart" >bootchart
gpio+示波器" >gpio+示波器
二、内核优化方法 " >二、内核优化方法
kernel压缩方式" >kernel压缩方式
加载位置" >加载位置
内核裁剪" >内核裁剪
预设置lpj数值" >预设置lpj数值
initcall优化" >initcall优化
内核initcall_module并行" >内核initcall_module并行
减少pty/tty个数" >减少pty/tty个数
首页 运维 linux运维 很有用的速度优化:让系统启动速度更快

很有用的速度优化:让系统启动速度更快

Jul 31, 2023 pm 03:11 PM
优化

嵌入式产品中,系统启动速度是很关键的指标,对系统启动速度的优化,通常我们称之为“快启”。快启”。

要对系统启动速度进行优化,首先要知道如何统计系统启动的时间。

下面介绍几种统计内核启动耗时的方法,以及对内核启动速度优化的几个方法。

一、启动耗时统计

printk time

打开kernel配置:

kernel hacking --->
[*] Show timing information on printks
登录后复制

打开后,每个printk的前面都会显示时间戳

主要用来测量内核启动过程各个阶段的耗时

initcall_debug

众所周知,kernel启动时会执行不同等级的initcall,而每个initcall

要对系统启动速度进行优化,首先要知道🎜如何统计系统启动的时间。🎜🎜下面介绍🎜几种统计内核启动耗时的方法,以及对🎜内核启动速度优化的几个方法。🎜

一、启动耗时统计

printk time

🎜打开kernel配置:🎜
initcall_debug=1
setargs_nand=setenv bootargs console=${console} earlyprintk=${earlyprintk} root=${nand_root} initcall_debug=${initcall_debug} init=${init}
登录后复制
登录后复制
🎜打开后,每个printk的前面都会显示时间戳🎜

主要用来测量内核启动过程各个阶段的耗时🎜

initcall_debug

🎜众所周知,kernel启动时会执行不同等级的initcall,而每个initcall的耗时也是可以统计的。🎜

kernelcmdline中加入参数initcall_debug=1

initcall_debug=1
setargs_nand=setenv bootargs console=${console} earlyprintk=${earlyprintk} root=${nand_root} initcall_debug=${initcall_debug} init=${init}
登录后复制
登录后复制

开启后,就能打印每个initcall函数调用及耗时。

bootgraph

内核自带了一个工具用于统计启动时间:scripts/bootgraph.pl

使用该工具需要打开内核配置CONFIG_PRINTK_TIME=y,并且在cmdline中加上"initcall_debug=1"

系统启动之后,执行命令:

dmesg|perl $(kernel_dir)/script/bootgraph.pl > out.svg
登录后复制

用浏览器查看out.svg文件,可以看到内核启动过程中各个阶段的耗时。

这个工具有点类似于perf的火焰图,可以统计启动各阶段的耗时。

bootchart

除了内核自带的工具,也有开源的工具可用:bootchart

bootchart是一个用于linux启动过程性能分析的开源软件工具,在系统启动过程自动收集CPU占用率、进程等信息,并以图形方式显示分析结果,可用作指导优化系统启动过程。

  • 修改kernel cmdline。将其中的init修改为“init=/sbin/bootchartd”。kernel cmdline。将其中的init修改为“init=/sbin/bootchartd”。
  • 收集信息。bootchartd会从/proc/stat/proc/diskstat/proc/[pid]/stat中采集信息,经过处理后保存为bootchart.tgz文件
  • 转换图片。在pc上通过pybootchartgui.py工具将bootchart.tgz转换为bootchart.png
收集信息。bootchartd会从/proc/stat/proc/diskstat/proc/[pid]/stat中采集信息,经过处理后保存为bootchart.tgz文件

🎜🎜转换图片。在pc上通过pybootchartgui.py工具将bootchart.tgz转换为bootchart.png,方便分析🎜🎜🎜🎜最后也会成图片供做分析,例如:🎜
很有用的速度优化:让系统启动速度更快

bootchar主要用来测量挂载文件系统到主应用程序启动过程中的耗时bootchar主要用来测量挂载文件系统到主应用程序启动过程中的耗时

gpio+示波器

可以找一个在系统启动过程中空闲的GPIO,在适当位置设置GPIO电平。

通过示波器抓取波形可以得到各阶段耗时。

通常该方法被用来测量整个启动的耗时,或者各阶段的耗时,该方法也是用的比较多的。

二、内核优化方法

kernel压缩方式

kernel有不同的压缩格式,常见的如gzxzlzma

gpio+示波器

可以找一个在系统启动过程中空闲的GPIO,在适当位置设置GPIO电平。

🎜通过示波器抓取波形可以得到各阶段耗时。🎜🎜通常该方法被用来🎜测量整个启动的耗时,或者各阶段的耗时🎜,该方法也是用的比较多的。🎜

二、内核优化方法

kernel压缩方式

🎜kernel有不同的压缩格式,常见的如gzxzlzma等。🎜🎜🎜不同的压缩格式,解压速度就不同🎜,通过比较不同压缩方式的启动时间和flash占用情况,选择一种符合实际情况的,以此进行优化。🎜

加载位置

内核镜像可以由kernel自解压,也可以由uboot进行解压。kernel自解压,也可以由uboot进行解压。

对于kernel自解压的情况,如果压缩过的kernel与解压后的kernel地址冲突,则会先把自己复制到安全的地方,然后再解压,防止自我覆盖。这就需要耗费复制的时间。

即把加载地址运行地址设置为不同地址,可以减少耗时。

内核裁剪

裁剪内核是必要的,如果内核镜像太大,那么解压内核就需要很长时间,所以内核要尽量裁剪。

裁剪内核,可以减少解压耗时。初始化内容少了,也会减少耗时。

因此裁剪内核时,要考虑将不需要的功能都去掉。

预设置lpj数值

LPJ也就是loops_per_jiffy

对于kernel自解压的情况,如果压缩过的kernel与解压后的kernel地址冲突,则会先把自己复制到安全的地方,然后再解压,防止自我覆盖。这就需要耗费复制的时间。🎜🎜即把加载地址运行地址设置为不同地址,可以减少耗时。🎜🎜🎜🎜内核裁剪🎜🎜🎜🎜裁剪内核是必要的,如果内核镜像太大,那么解压内核就需要很长时间,所以内核要尽量裁剪。🎜🎜裁剪内核,可以减少解压耗时。初始化内容少了,也会减少耗时。🎜🎜因此裁剪内核时,要考虑将不需要的功能都去掉。🎜🎜🎜🎜预设置lpj数值🎜🎜🎜🎜LPJ也就是loops_per_jiffy,每次启动都会计算一次,但如果没有做修改的话,这个值每次启动算出来都是一样的,可以直接提供数值跳过计算。🎜

如下log所示,有skippedlpjtimer计算得来,不需要再校准calibrate了。

[ 0.019918] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
登录后复制

如果没有skipped,则可以在cmdline中添加lpj=xxx进行预设

initcall优化

如前面提到,initcall耗时是可以打印出来的,在cmdline中设置initcall_debug=1,即可打印跟踪所有内核初始化过程中调用的顺序以及耗时。

[ 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

只把必须要加进内核的才编译进内核,其他的编译成模块。

例如将必要的clockttypinctrl等编译进内核

三、其他优化

uboot

如果是考虑RISC-V架构,可以去掉ubootRISC-V架构,可以考虑去掉uboot

XIP

xipeXecute In Place。即芯片内执行,是指CPU直接从存储器中读取程序代码执行,而不用再读到内存中。

一般我们的程序都是放到flash中,系统启动时,把程序从flash拷贝到ddr中执行,而xip技术则不需要拷贝程序到ddr

🎜🎜XIP🎜🎜🎜🎜xipeXecute In Place。即芯片内执行,是指CPU直接从存储器中读取程序代码执行,而不用再读取到内存中。🎜🎜一般我们的程序都是放到flash中,系统启动时,把程序从flash拷贝到ddr中执行,而xip技术则不需要剪切程序到ddr,所以速度会很快。🎜

这项技术是必须要芯片支持才行,可以看看芯片手册中对SPI的描述是否支持XIP功能。

四、总结

以上对系统启动速度的优化,归根结底是提供一些思路、一些方法。

要优化启动速度,通常来说需要对整个系统的启动有比较深入的了解

优化无止境,需要根据目标来进行优化,综合考虑启动速度和效果。

以上是很有用的速度优化:让系统启动速度更快的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Win11新电脑收到后怎么优化设置提升性能? Win11新电脑收到后怎么优化设置提升性能? Mar 03, 2024 pm 09:01 PM

我们在收到新电脑后要怎么设置优化性能,用户们可以直接的打开隐私和安全性,然后点击常规(广告ID,本地内容,应用启动,设置建议,生产力工具或者是直接的打开本地组策略编辑器来进行操作就可以了。下面就让本来为用户们来仔细的介绍一下Win11新电脑收到后如何优化设置提升性能的方法吧。Win11新电脑收到后如何优化设置提升性能的方法方法一:1、按【Win+i】组合键,打开设置,然后左侧点击【隐私和安全性】,右侧点击Windows权限下的【常规(广告ID,本地内容,应用启动,设置建议,生产力工具)】。方法二

深度解读:为何Laravel速度慢如蜗牛? 深度解读:为何Laravel速度慢如蜗牛? Mar 07, 2024 am 09:54 AM

Laravel是一款广受欢迎的PHP开发框架,但有时候被人诟病的就是其速度慢如蜗牛。究竟是什么原因导致了Laravel的速度不尽如人意呢?本文将从多个方面深度解读Laravel速度慢如蜗牛的原因,并结合具体的代码示例,帮助读者更深入地了解此问题。1.ORM查询性能问题在Laravel中,ORM(对象关系映射)是一个非常强大的功能,可以让

解码Laravel性能瓶颈:优化技巧全面揭秘! 解码Laravel性能瓶颈:优化技巧全面揭秘! Mar 06, 2024 pm 02:33 PM

解码Laravel性能瓶颈:优化技巧全面揭秘!Laravel作为一款流行的PHP框架,为开发者提供了丰富的功能和便捷的开发体验。然而,随着项目规模增大和访问量增加,我们可能会面临性能瓶颈的挑战。本文将深入探讨Laravel性能优化的技巧,帮助开发者发现并解决潜在的性能问题。一、数据库查询优化使用Eloquent延迟加载在使用Eloquent查询数据库时,避免

Golang的gc优化策略探讨 Golang的gc优化策略探讨 Mar 06, 2024 pm 02:39 PM

Golang的垃圾回收(GC)一直是开发者们关注的一个热门话题。Golang作为一门快速的编程语言,其自带的垃圾回收器能够很好地管理内存,但随着程序规模的增大,有时候会出现一些性能问题。本文将探讨Golang的GC优化策略,并提供一些具体的代码示例。Golang中的垃圾回收Golang的垃圾回收器采用的是基于并发标记-清除(concurrentmark-s

C++ 程序优化:时间复杂度降低技巧 C++ 程序优化:时间复杂度降低技巧 Jun 01, 2024 am 11:19 AM

时间复杂度衡量算法执行时间与输入规模的关系。降低C++程序时间复杂度的技巧包括:选择合适的容器(如vector、list)以优化数据存储和管理。利用高效算法(如快速排序)以减少计算时间。消除多重运算以减少重复计算。利用条件分支以避免不必要的计算。通过使用更快的算法(如二分搜索)来优化线性搜索。

Laravel性能瓶颈揭秘:优化方案大揭秘! Laravel性能瓶颈揭秘:优化方案大揭秘! Mar 07, 2024 pm 01:30 PM

Laravel性能瓶颈揭秘:优化方案大揭秘!随着互联网技术的发展,网站和应用程序的性能优化变得愈发重要。作为一款流行的PHP框架,Laravel在开发过程中可能会面临性能瓶颈。本文将探讨Laravel应用程序可能遇到的性能问题,并提供一些优化方案和具体的代码示例,让开发者能够更好地解决这些问题。一、数据库查询优化数据库查询是Web应用中常见的性能瓶颈之一。在

优化WIN7系统开机启动项的操作方法 优化WIN7系统开机启动项的操作方法 Mar 26, 2024 pm 06:20 PM

1、在桌面上按组合键(win键+R)打开运行窗口,接着输入【regedit】,回车确认。2、打开注册表编辑器后,我们依次点击展开【HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorer】,然后看目录里有没有Serialize项,如果没有我们可以单击右键Explorer,新建项,并将其命名为Serialize。3、接着点击Serialize,然后在右边窗格空白处单击鼠标右键,新建一个DWORD(32)位值,并将其命名为Star

Vivox100s参数配置大揭秘:处理器性能如何优化? Vivox100s参数配置大揭秘:处理器性能如何优化? Mar 24, 2024 am 10:27 AM

Vivox100s参数配置大揭秘:处理器性能如何优化?在当今科技飞速发展的时代,智能手机已经成为我们日常生活不可或缺的一部分。作为智能手机的一个重要组成部分,处理器的性能优化直接关系到手机的使用体验。Vivox100s作为一款备受瞩目的智能手机,其参数配置备受关注,尤其是处理器性能的优化问题更是备受用户关注。处理器作为手机的“大脑”,直接影响到手机的运行速度

See all articles