OpenHarmony标准系统开机时长优化
简介
万物互联时代,产品性能至关重要,而系统启动时间是系统性能的重要组成部分,因为用户必须等待系统启动完成后才能使用设备。对于经常需要进行冷启动的汽车等设备而言,较短的启动时间至关重要(没有人喜欢在等待几十秒后才能输入导航目的地),在金融交易设备、电子商务服务器、实时通信设备同样也有较高的应用场景,那我们该如何在OpenAtom OpenHarmony(简称OpenHarmony ) 标准系统现有的能力下,完成秒级开机?本文由深圳市优博终端科技有限公司的研发同学介绍一套关于优化OpenHarmony标准系统开机时长优化的方案,通过对硬件、Kernel、 Framework的相应优化让系统开机时长尽量缩短。
效果展示
下面给出系统开机时长优化前后的对比效果视频,优化前的开机时长在18秒左右,优化后的开机时间在7秒左右。
开发环境
硬件平台:RK3588
系统版本:OpenHarmony 3.1 Release
开发语言:C、 C++
四步带你体验OpenHarmony标准系统开机时长优化
一、调整硬件资源使用率
调整硬件资源相应配置参数使之尽可能地达到最优运行状态,这里所指的硬件资源是指 RAM、FLASH。
RAM:运存的调优需要根据厂商的指导文档在设备树文件<.dtsi文件>中进行调整,比如设定运存的时钟频率 memory-frequency、设定内存带宽 memory-bandwidth、内存时序 memory-timings 等,Kernel 层可以对 swappiness、dirty_ratio、dirty_background_ratio、min_free_kbytes等相应值进行调整,来达到运存的性能调优。
FLASH:比如对 physical_block_size 项进行调整,目前 OpenHarmony 采用的文件系统为 ext4,可以在熟悉ext4文件系统后,然后对其中缓存、模式、压缩、清理等方向进行调优。减少KMSG与HiLog 日志输出,调整其输出等级。
二、Kernel 启动时长优化
Kernel 启动阶段会进行硬件检测、驱动加载、文件系统挂载、设置网络等,其中耗时比较长的基本上为驱动加载,因为这中间会有重复尝试跟 Sleep 的时间,需要重点关注,在 Kernel 启动的过程中可以将一些无用的子系统进行裁剪,比如 bootchart。
三、系统框架启动时长优化
在系统层启动时,需要启动很多服务,可以采用并行启动系统必要服务,延迟启动非必要服务,这些服务从加载到启动完成、其中比较耗时的有 so 加载,可采用多线程的方式对其进行加载,下面贴出多线程加载多个 so 文件的 Demo 代码;
- #include <iostream>
- #include <dlfcn.h>
- #include <thread>
- #include <vector>
- #include <string>
- void thread_func(void* handle){
- // 空函数
- }
- int main(){
- std::vector<std::string> lib_names = {"mpp1.so", "mpp2.so", "mpp3.so"};
- std::vector<void*> handles;
- for (const auto& lib_name : lib_names) {
- void* handle = dlopen(lib_name.c_str(), RTLD_LAZY);
- if (handle == nullptr) {
- std::cerr << "Error loading library " << lib_name << ": " << dlerror() << std::endl;
- return 1;
- }
- handles.push_back(handle);
- }
- std::vector<std::thread> threads;
- for (const auto& handle : handles) {
- threads.emplace_back(thread_func, handle);
- }
- for (auto& thread : threads) {
- thread.join();
- }
- for (const auto& handle : handles) {
- dlclose(handle);
- }
- return 0;
- }
如果发现加载的单个so文件过大时,可采用多线程分段加载此so 文件。
四、 开机动画显示优化
优化思路大致为进入 bootAnimation 的 main 函数后,将动画图片采用数组或者链表的方式进行预加载,开启每秒60帧的刷新率,此处为什么要开60帧,因为如果设定为30帧时,出现掉帧的情况后,会出现肉眼可见的卡顿。当图片播放完成后,延迟几百毫秒左右再进入桌面,因为Launcher 加载已安装的 app ,需要一定的时间。下面是开机动画优化的部分内容 :
1. 提高开机动画、渲染进程优先级;
- "services" : [{
- "name" : "render_service",
- "path" : ["/system/bin/render_service"],
- "uid" : "root",
- "importance" : -20,
- "gid" : ["system", "shell", "uhid", "root"]
- }, {
- "name" : "bootanimation",
- "path" : ["/system/bin/bootanimation"],
- "once" : 1,
- "importance" : -20,
- "uid" : "root",
- "gid" : ["system", "shell", "uhid", "root"]
- }
- ]
2. 提前加载开机动画图片;
- ReadZipFile(BOOT_PIC_ZIP, imageVector_, jsonConfig);
- imgVecSize_ = static_cast<int32_t>(imageVector_.size());
- if (imgVecSize_ <= 0) {
- PostTask(std::bind(&AppExecFwk::EventRunner::Stop, runner_));
- LOGE("zip pic num is 0.");
- return;
- }
- SortZipFile(imageVector_);
3. 指定开机动画显示帧率;
- OHOS::Rosen::VSyncReceiver::FrameCallback fcb = {
- .userData_ = this,
- .callback_ = std::bind(&BootAnimation::onVsync, this),
- };
- int32_t changefreq = static_cast<int32_t>((1000.0 / freq_) / 16);
- ret = receiver_->SetVSyncRate(fcb, changefreq);
开机优化需要借助一些工具来分析比如串口工具、bootchart 生成的可视化图表来进行分析。
OpenHarmony 标准系统默认集成了bootchart,下面介绍如何使用bootchart 工具来获取开机性能数据及生成性能图片:
(1) 开机完成后,运行 hdc_std shell
(2) 运行 begetctl bootchart enable
(3) 运行 reboot 或者断电重启
(4) 运行 begetctl bootchart stop
(5) 运行 begetctl bootchart disable
(6) 进入到/data/bootchart/文件夹下查看是否有
(7) header、proc_diskstats.log、proc_ps.log、proc_stat.log
(8) 在/data/bootchart/目录下执行命令:tar -czf bootchart.tgz *
(9) 将bootchart.tgz 导出到本地磁盘上
(10) hdc_std file recv /data/bootchart/bootchart.tgz ./
(11) 生成开机性能图片 java -jar bootchart.jar bootchart.tgz
上面的bootchart.jar 需要下载源码去编译生成或者下载他人已经编译好的jar包。源码下载地址 https://sourceforge.net/projects/bootchart/ 。
下图为 bootchart 生成的 OpenHarmony性能可视化视图。
总结
通过本篇文章介绍,您对OpenHarmony标准系统下性能优化的功能应该有了初步的了解。如果您对本篇文章内容感兴趣,可以根据本篇文章介绍进行研究和使用。同时也欢迎更多开发者与我们共享开发成果,分享技术解读与经验心得。
OpenHarmony标准系统开机时长优化的更多相关文章
- timeout超时时长优化和hystrix dashboard可视化分布式系统
在生产环境中部署一个短路器,一开始需要将一些关键配置设置的大一些,比如timeout超时时长,线程池大小,或信号量容量 然后逐渐优化这些配置,直到在一个生产系统中运作良好 (1)一开始先不要设置tim ...
- 系统开机时提示BOOTMGR is compressed
问题描述: 开机时提示 BOOTMGR is compressed Press Ctrl+Alt+Del to restart 操作方法: 1.插入带有U盘启动的U盘2.进入winpe系统后,打开“ ...
- Windows 2008 R2系统开机时如何不让Windows进行磁盘检测?
开始→运行,在运行对话框中键入“chkntfs /t:0”,即可将磁盘扫描等待时间设置为0, 如果要在计算机启动时忽略扫描某个分区,比如C盘,可以输入“chkntfs /x c:”命令:如果要恢复对C ...
- 【直播回顾】OpenHarmony知识赋能第四期直播——标准系统HDF开发
3月10日晚上19点,OpenHarmony开发者成长计划社群内,我们举办了知识赋能第四期直播课<OpenHarmony标准系统HDF框架介绍>,吸引了数千名开发者线上观看学习,并 ...
- Long类型时间如何转换成视频时长?
数据库中存放的视频时长是一个Long类型的毫秒/秒时间,现在需要把这个时间转换成标准的视频时长格式,在我看来这应该是一个很常用的转化有一个很常用的转换方法工具才对,可是我百度找了许久,没有一个简单直观 ...
- Linux系统开机启动时的工作原理
Linux系统开机启动时的工作原理也是深入了解Linux系统核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至 ...
- 在Linux系统如何让程序开机时自动启动
在Linux系统如何让程序开机时自动启动 核心提示:系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统“开始”--& ...
- TTL 机制排毒,线上k8s的Job已经通过API 增加了Job的TTL 时长,且成功响应,为什么系统还是清理了Job?
TTL 机制排毒,线上k8s的Job已经通过API 增加了Job的TTL 时长,且成功响应,为什么系统还是清理了Job? 面试官:"已完成 Job 的 TTL 机制了解嘛?简单说说TTL存在 ...
- 大文件视频断点续传插件resumabel.js,优化上传速度,缩短最后一片等待时长。
在angular中使用resumable.js遇到的一个问题:大视频上传到99-100%时,此时正在上传最后一片,最后一片的xhr一直是pending状态.原因插件会检查第一片和最后一片的元数据,检测 ...
- Spring-Redis缓存业务优化(通配符删除、两种自定义缓存时长)
application.yml配置 spring: cache: type: REDIS redis: time-to-live: PT300S # 默认缓存秒数 ...
随机推荐
- Oracle设置日志参数-ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
要实现两个数据库之间的实时同步,需要给Oracle设置参数 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- 执行了12小时,等待数据库中的其它事务都提交以后才 ...
- sql判断字符串中含中文方法
基于UTF-8字符集 它是一种多字节字符集,编码为变长编码.那么它的编码范围根据:http://www.iteye.com/topic/977671 作者提供的资料学习,整理出它编码范围如下: u2e ...
- javascript浮点数相减、相乘出现一长串小数
149.7 * 100 = 14969.999999999998 3.57 - 2.33 = 1.2399999999999998 这是JavaScript浮点运算采用IEEE 754标准导致的Bug ...
- Python 初学者容易踩的坑
哈喽大家好,我是咸鱼. 今天咸鱼列出了一些大家在初学 Python 的时候容易踩的一些坑,看看你有没有中招过. 原文:https://www.bitecode.dev/p/unexpected-pyt ...
- config.js 多人同步更新 解决方案 多项目公用一套config.js dev
index.html <script type='text/javascript' src='<%= BASE_URL %>config.js?${Math.random().toS ...
- c语言之被遗漏的角落---#pragma pack
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Linux 运维工程师面试真题-2-Linux 命令及文件操作
Linux 运维工程师面试真题-2-Linux 命令及文件操作 1.在/tmp/目录下创建 test.txt 文件,内容为: Hello,World! ,用一个命令写出来. 2.给 test.txt ...
- 大年学习linux(第二节---磁盘管理)
二.磁盘管理 文件系统配置文件 /etc/filesystems: 系统指定的测试挂载文件系统类型 /proc/filesystems: linux 系统已经加载的文件系统类型 /lib/module ...
- 更智能的广告素材生成!看A/B测试如何驱动AIGC素材调优
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 前言:AIGC大爆发,引发广告营销行业变革 ChatGPT等AI产品引发的AIGC大爆发引起了各行业的震动,其中以 ...
- 使用MFT进行加密文件传输的7个好处
至少,托管文件传输(MFT)解决方案是一种产品,它包含入站和出站文件传输的所有方面,同时使用行业标准的网络协议和无缝加密.它可以从单个集中管理点在您的网络,系统,应用程序,贸易伙伴和云环境中自动化和传 ...