Linux 启动时间优化实战,2.41 秒启动应用!

劳动节快乐,祝大家都能有所收获!

今天我参加了一个关于启动优化的讲座,这里简要总结一下。

本文旨在分享一些简单有效的优化方法,并不涵盖所有技巧。有兴趣的朋友可以关注我的视频号,后续我会通过直播与大家进一步交流。

Linux 启动时间优化实战,2.41 秒启动应用!目标系统

硬件:

Beagle Bone Black (Cortex A8)

USB 摄像头 + LCD

软件:

Linux 5.1 + Buildroot rootfs

FFmpeg,用于采集视频并解码到 LCD。

Linux 启动时间优化实战,2.41 秒启动应用!点击查看大图

当前启动时间:

从上电到 LCD 显示第一帧图像:9.45 秒

1、优化编译器ARM vs Thumb2

比较基于 ARM 或 Thumb2 指令集编译的系统和应用。

ARM:rootfs 为 3.79 MB,ffmpeg 为 227 KB。

Thumb2:3.10 MB (-18%),183 KB (-19%)。

性能方面:Thumb2 的性能略有提升(约小于 5%)。

尽管性能有所提升,我个人还是倾向于选择 ARM 指令集。

musl vs uClibc

Buildroot 中有三种 C 库可选:glibc、musl、uClibc,我们只比较后两种较小的库。

musl:680 KB (统计 /lib 目录)。

uClibc:570 KB (-16%)。

uClibc 节省了 110 KB,我们选择 uClibc。

2、优化应用程序我们可以通过 ./configure 对 FFmpeg 的功能组件进行选择。

此外,还可以使用 strace 和 perf 命令调试以优化 FFmpeg 的内部代码。

优化后的结果:

文件系统:从 16.11 MB 缩小到 3.54 MB (-78%)。

程序的加载和运行时间:缩短 150 ms。

整体启动时间:缩短 350 ms。

虽然空间优化效果显著,但在启动时间上的优化较小,这是因为 Linux 在运行程序时只加载程序的必要部分。

3、优化 Init 和根文件系统思路:

使用 bootchartd 分析系统启动并裁剪不必要的服务。

将 /etc/init.d/ 下的启动脚本合并为一个。

不挂载 /proc 和 /sys。

裁剪 BusyBox,文件系统越小,内核挂载可能会越快。

将 Init 程序替换为我们的应用程序。

静态编译应用程序。

裁剪掉不常用的文件,找出长时间不访问的文件:

$ find / -atime -1000 -type f

优化后的结果:

文件系统:裁剪 Busybox 后,从 3.54 MB 缩小到 2.33 MB (-34%)。

启动时间:基本没有变化,大概是因为文件系统本身已经足够小了。

使用 initramfs 作为 rootfs:

通常情况下,Linux 系统会先挂载 initramfs,initramfs 很小且位于内存中,再由 initramfs 负责负载根文件系统。

当我们将 Buildroot rootfs 裁剪得很小时,就可以考虑直接将其作为 initramfs 使用。

这样有什么好处呢?

initramfs 可以和 Kernel 拼接在一起,Bootloader 负责将 Kernel+initramfs 加载到内存中,内核不再需要访问磁盘。

内核不再需要 block/storage 和 filesystem 相关的功能,体积会变得更小,加载时间和初始化时间都会变小。

注意,需要关闭 initramfs 的压缩(CONFIG_INITRAMFS_COMPRESSION_NONE)。

优化后的结果:

即便禁用了 CONFIG_BLOCK 和 CONFIG_MMC 后,总启动时间仍增加了 20ms。这可能是因为 Kernel + initramfs 拼在一起之后,内核变大了许多,而内核镜像是需要解压,解压的时间增多了。

4、优化内核评估方法:

在启动参数中添加 initcall_debug,可以获得更多内核 log:

[ 3.750000] calling ov2640_i2c_driver_init+0x0/0x10 @ 1[ 3.760000] initcall ov2640_i2c_driver_init+0x0/0x10 returned 0 after 544 usecs[ 3.760000] calling at91sam9x5_video_init+0x0/0x14 @ 1[ 3.760000] at91sam9x5-video f0030340.lcdheo1: video device registered @ 0xe0d3e340, irq = 24[ 3.770000] initcall at91sam9x5_video_init+0x0/0x14 returned 0 after 10388 usecs[ 3.770000] calling gspca_init+0x0/0x18 @ 1[ 3.770000] gspca_main: v2.14.0 registered[ 3.770000] initcall gspca_init+0x0/0x18 returned 0 after 3966 usecs...

此外,可以使用 scripts/bootgraph.pl 将 dmesg 的信息转换成图片:

$ scripts/bootgraph.pl boot.log > boot.svg

Linux 启动时间优化实战,2.41 秒启动应用!点击查看大图

接下来,找出消耗时间最多的环节,进行优化。

裁掉 tracing

在 Kernel hacking 中关闭 Tracers 相关的功能。

启动时间:缩短 550ms。

秒哒 秒哒

秒哒-不用代码就能实现任意想法

秒哒 134 查看详情 秒哒

内核大小:缩小 217KB。

裁掉一些用不上的硬件功能

omap8250_platform_driver_init() // (660 ms)cpsw_driver_init()  // (112 ms)am335x_child_init() // (82 ms)...

预设 loops per jiffy

在每次启动时,内核都会校准 delay loop 的值,用于 udelay() 函数。

这会测量 loops per jiffy (lpj) 的值。我们只需要启动一次内核,在 log 中查找 lpj 值:

Calibrating delay loop... 996.14 BogoMIPS (lpj=4980736)

然后将 lpj=4980736 填写到启动参数中,即可:

Calibrating delay loop (skipped) preset value.. 996.14 BogoMIPS (lpj=4980736)

大约缩短了 82 ms。

禁用 CONFIG_SMP

SMP 的初始化很慢。它通常在默认配置中是启用的,即使是一个单核 CPU。

如果我们的平台是单核的,可以禁用 SMP。

关闭后,内核缩小:-188 KB (-4.6%),启动时间缩短 126ms.

禁用 log

启动参数中添加 quiet,启动时间缩短 577 ms。

禁用 CONFIG_PRINTK 和 CONFIG_BUG 后,内核缩小 118 KB (-5.8%)。

禁用 CONFIG_KALLSYMS 后,内核缩小 107 KB (-5.7%)。

合计,启动时间缩短 767 ms。

开启 CONFIG_EMBEDDED 和 CONFIG_EXPERT

这会让系统调用变得更精简,内核会变得没那么通用,但是能保持你的应用程序能运行就足够了。

内核缩小 51 KB。

启动时间缩短 34 ms。

选择 SLAB memory allocators

一般是 SLAB、SLOB、SLUB 三选一。

SLAB:默认选择,最通用、最传统、最可靠。

SLOB:更简洁,代码量更少,更节省空间,适合嵌入式系统,使能后,内核缩小 5 KB,但是启动时间增加 1.43 S!

SLUB:更合适大型系统,使能后,启动时间增加 2 ms。

因此,我们仍使用 SLAB。

内核压缩方式

不同压缩方式的特点如下:

Linux 启动时间优化实战,2.41 秒启动应用!实测效果:

Linux 启动时间优化实战,2.41 秒启动应用!看起来,gzip 和 lzo 表现更好。测试的效果应该是和 CPU/磁盘 的性能相关的。

内核编译参数

使能 CONFIG_CC_OPTIMIZE_FOR_SIZE,该选项可能是用 gcc -Os 代替 gcc -O2。

Linux 启动时间优化实战,2.41 秒启动应用!点击查看大图

注意,这只是在 BeagleBone Black + Linux 5.1 上的测试结果,不同平台之间有差异。

禁用 /proc 等伪文件系统

要考虑应用的兼容性。

ffmpeg 依赖 /proc,所以只能关闭一些 proc 相关的选项:CONFIG_PROC_SYSCTL、CONFIG_PROC_PAGE_MONITOR CONFIG_CONFIGFS_FS,启动时间没有变化。

关闭 sysfs,启动时间缩短 35 ms。

拼接 DTB

启用 CONFIG_ARM_APPENDED_DTB:

$ cat arch/arm/boot/zImage arch/arm/boot/dts/am335x-boneblack-lcd4.dtb > zImage$ setenv bootcmd 'fatload mmc 0:1 81000000 zImage; bootz 81000000'

启动时间缩短 26 ms。

5、优化 Bootloader这里我们采用最好的方案:使用 Uboot Falcon mode。

Falcon mode 只执行 Uboot 的第一阶段:SPL,然后跳过 Stage 2,执行加载 Kernel。

启动时间缩短 250 ms。

总结到此,启动优化基本完成,最终效果如下:

[0.000000 0.000000][0.000785 0.000785] U-Boot SPL 2019.01 (Oct 27 2019 - 08:04:06 +0100)[0.057822 0.057822] Trying to boot from MMC1[0.378878 0.321056] fdt_root: FDT_ERR_BADMAGIC[0.775306 0.396428] Waiting for /dev/video0 to be ready...[1.966367 1.191061] Starting ffmpeg...[2.412284 0.004277] First frame decoded

从上电到 LCD 显示第一帧图像,总时间为 2.41 秒。

最有效果的步骤如下:

Linux 启动时间优化实战,2.41 秒启动应用!点击查看大图

仍值得优化的空间:

系统花了 1.2 秒等待 USB 摄像头的枚举,这里是否有办法加速?

是否可以关闭 tty 和终端登录?

最后,关于优化启动时间,有一些原则可以遵循:

请不要过早地进行优化。

从一些影响面最小的点开始优化。

从 rootfs、kernel、bootloader 自上而下进行优化。

重点关注短板。

感谢阅读,欢迎转发哦!

以上就是Linux 启动时间优化实战,2.41 秒启动应用!的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/465655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
hyperf框架和laravel哪个好
上一篇 2025年11月8日 05:19:59
Win11系统输入法消失 Win11无法切换输入法的修复方法
下一篇 2025年11月8日 05:20:05

相关推荐

  • 从AI场景搭建到蝴蝶号运营,全流程实战攻略

    从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略

    做ai内容变现需先明确方向再选工具,注册蝴蝶号要模拟真实行为,用ai提升效率但需调整内容细节,流量转化重于播放量。一、先确定内容类型和风格,根据方向选择合适ai工具链搭建流程,用免费api测试效果。二、蝴蝶号注册尽量用企业主体,资料完整,养号阶段关注同类账号,保持每天发布1~2条内容,视频控制在30…

    2026年9月22日 用户投稿
    100
  • GIMP中如何利用AI裁剪图片?一步步完成高效图像裁剪方法

    GIMP虽无“一键AI裁剪”功能,但可通过智能选择工具(如前景选择、智能剪刀)精准选中主体,结合Resynthesizer插件的内容感知填充实现类AI裁剪效果;对于更高要求,可协同Remove.bg等外部AI工具完成自动抠图,再导入GIMP进行裁剪或背景替换,形成高效智能裁剪工作流。 ☞☞☞AI 智…

    2026年9月22日
    100
  • 疑似荣耀500系列入网 代号Merry全系支持80W有线快充

    10月25日,知名数码博主“数码闲聊站”透露,荣耀500系列新机已现身工信部,型号分别为mep-an00和mey-an00,预计代号为merry/merryp,全系支持80w有线快充。该博主还表示,此前上手的样机提供了黑色、银色、粉色和蓝色等多种配色方案,外观设计或将延续前代爆款风格。 据最新消息,…

    2026年9月22日
    000
  • VSCode搭建Python开发环境(附详细截图,小白也能学会)

    答案:搭建VSCode Python环境需安装Python并添加至PATH,安装VSCode及Python扩展,创建项目文件并选择正确解释器,通过虚拟环境隔离依赖,利用Pylance、Black、Flake8等工具提升开发效率,常见问题多为路径或环境配置错误,可通过检查解释器选择和安装路径解决。 在…

    2026年9月22日
    100
  • Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析

    Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析

    号外号外!awesome-vit 上新啦, 欢迎大家 Star Star Star ~ https://github.com/open-mmlab/awesome-vit 前言 在 Vision Transformer 必读系列之图像分类综述(一):概述 一文中对 Vision Transforme…

    2026年9月22日 用户投稿
    200
  • 蝴蝶号无人直播完整流程详解:搭建+开播+引流

    蝴蝶号无人直播完整流程详解:搭建+开播+引流蝴蝶号无人直播完整流程详解:搭建+开播+引流蝴蝶号无人直播完整流程详解:搭建+开播+引流蝴蝶号无人直播完整流程详解:搭建+开播+引流

    蝴蝶号无人直播的完整流程包括前期准备、直播搭建、开播设置、引流推广、监控与维护五个步骤。前期准备需完成账号注册认证、硬件设备配置、软件安装及素材准备;直播搭建涉及场景设置、素材导入、循环播放设定及自动化脚本配置;开播设置包括直播间信息填写、推流配置与测试直播;引流推广可通过平台内工具、社交媒体、内容…

    2026年9月22日 用户投稿
    100
  • 如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤

    如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤

    VEED.io通过“文本转视频”和“AI形象”功能,让视频制作变得简单高效。用户只需输入文本,即可生成带AI配音、字幕和匹配素材的视频,或选择AI虚拟人物进行口型同步播报。平台还提供AI语音合成、自动字幕、多语言支持及丰富编辑功能,便于后期精修。优化效果需从高质量文本入手,合理选择声音与形象,并通过…

    2026年9月22日 用户投稿
    000
  • Java中递归处理列表:条件性移除最大值策略与实现

    本教程深入探讨了如何在Java中使用递归方法,根据特定条件(如列表是否已排序、最大值是否位于列表的首尾)来移除列表中的最大值。文章将详细阐述如何设计一个高效的递归算法,包括排序检查、最大值定位以及条件性移除的实现细节,并提供完整的代码示例和注意事项,帮助读者掌握递归在复杂列表操作中的应用。 引言:递…

    2026年9月22日
    000
  • 玩转 Spring Boot 集成篇(定时任务框架Quartz)

    玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)

    在日常项目研发中,定时任务可谓是必不可少的一环,关于 spring boot 如何实现静态定时任务、动态定时任务以及如何开启多线程跑任务,均已在上篇分享过,不再赘述。 虽然 Spring Boot 内置注解方式实现的定时任务,在一定程度上也能解决一定的业务场景问题,但是若做更复杂的动作,例如启停任务…

    2026年9月22日 用户投稿
    100
  • Cortana如何连接邮箱_Cortana邮箱同步配置方法

    首先需将邮箱账户与Cortana连接,可通过Windows设置添加账户或在Cortana应用内手动配置,支持Outlook.com、Gmail及Exchange等类型;完成账户添加后,须在隐私权限中启用邮件读取和同步权限,确保Cortana可访问邮件、日历及联系人数据,从而实现智能提醒与信息同步功能…

    2026年9月22日
    000
  • 如何用Sublime导出MySQL数据表结构_生成Markdown或HTML格式文档

    要使用 sublime text 导出 mysql 数据表结构并生成 markdown 或 html 文档,需通过以下步骤操作:1. 使用 show create table 命令或 mysqldump 工具获取建表语句;2. 在 sublime 中整理字段信息,按字段名、类型、是否为空、键、默认值…

    2026年9月22日
    000
  • 三角洲行动S6九格保险任务速通指南

    三角洲行动S6九格保险任务速通指南三角洲行动S6九格保险任务速通指南三角洲行动S6九格保险任务速通指南三角洲行动S6九格保险任务速通指南

    在《三角洲行动》s6赛季中,九格保险任务成了不少玩家头疼的难题,耗时久、节奏慢,稍不注意就被卡住。其实只要掌握策略,合理安排任务顺序,高效推进并非难事!接下来这份分阶段速通攻略,将帮你理清思路,快速通关九格保险任务! 三角洲行动S6赛季九格保险任务高效速通指南 第一阶段:聚焦主线与关键前置 优先完成…

    2026年9月22日 用户投稿
    100
  • 解决PHP应用中本地文件更新后网页视图不刷新的缓存问题

    本文探讨了PHP应用中,本地JSON或图片文件更新后,网页视图无法实时刷新的常见问题。核心原因在于浏览器缓存机制。文章将提供多种解决方案,包括强制刷新、隐身模式诊断、以及通过URL参数、服务器配置(.htaccess)和文件版本控制来有效管理缓存,确保用户始终获取最新数据。 理解问题:本地文件更新与…

    2026年9月22日
    200
  • VSCode如何安装和使用插件 VSCode插件管理的高效方法

    安装插件需通过vscode扩展视图搜索并点击安装,部分插件需重启或配置后生效;2. 使用插件时可通过命令面板、上下文菜单、状态栏或自动语言特性调用功能,并在设置中自定义行为;3. 高效管理应定期审视插件使用频率,禁用或卸载不常用者,关注性能影响,利用“开发者: 显示正在运行的扩展”识别资源占用高的插…

    2026年9月22日
    200
  • Java Stream API:从嵌套集合中提取唯一值的高效实践

    本文深入探讨如何利用Java Stream API,从包含嵌套集合的对象列表中高效地提取唯一的字符串值。我们将重点介绍flatMap()和mapMulti()这两种强大的流操作,演示它们如何替代传统的嵌套循环,从而实现代码的简洁性、可读性以及潜在的性能优化。 在java应用开发中,我们经常会遇到处理…

    2026年9月22日
    100
  • safari浏览器如何将网页保存为PDF_safari浏览器网页保存为PDF方法

    Safari浏览器支持将网页保存为PDF,可通过三种方式实现:1. 使用打印功能,点击“文件”→“打印”,选择“另存为PDF”并设置参数后保存;2. 点击共享按钮,选择“创建PDF”,生成后存储到指定位置;3. 利用快捷指令应用创建自动化流程,获取当前网页并转换为PDF自动归档。 如果您在浏览网页时…

    2026年9月22日
    100
  • CapCut的AI混合工具如何使用?快速制作高质量短视频的教程

    CapCut的AI混合工具通过智能算法将多段素材自然融合,支持画中画、双重曝光、背景替换等效果,提升视频创意与质感;使用时需导入素材并分层,选择“混合模式”如滤色、叠加等,结合不透明度、位置调整实现融合;可打造情绪隐喻、时间流逝等叙事效果,增强艺术表达;避免过度使用、素材冲突等问题,善用蒙版、色彩调…

    2026年9月22日
    500
  • 使用Java Selenium验证表格数据排序:金额列的升序与降序检查

    本教程详细介绍了如何利用Java Selenium WebDriver验证网页表格中金额列的排序功能。文章涵盖了从环境配置、登录应用到数据提取、清洗、数值转换,再到实现表格数据(特别是金额数据)的升序或降序验证的完整流程。通过示例代码,演示了如何获取页面元素、处理文本数据,并使用JUnit进行断言,…

    2026年9月22日
    100
  • VSCode安装C/C++代码格式化 专业VSCode开发环境配置

    配置VSCode进行C/C++开发需安装C/C++扩展包和clang-format,设置自动格式化与调试环境,推荐使用CMake Tools、Include Autocomplete等扩展,结合快捷键、代码片段和任务自动化提升效率。 配置VSCode以实现C/C++代码的专业格式化和高效开发环境,核…

    2026年9月22日
    400
  • 抖音播放量是什么意思?抖音播放量如何变现呢

    短视频平台已成为当下最受欢迎的传播媒介之一。作为国内领先的短视频平台,抖音凭借其强大的算法推荐机制和丰富的内容生态,吸引了大量用户。而抖音播放量,作为衡量短视频传播效果的重要指标,也逐渐成为创作者和品牌方关注的重点。本文将深入解析抖音播放量的含义,探讨其背后的逻辑及影响因素,为短视频内容生产者提供有…

    2026年9月22日
    000

发表回复

登录后才能评论
关注微信