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 # 默认缓存秒数 ...
随机推荐
- 2021 虎符杯hate num 注入题
前言 今天遇到个有意思的SQL盲注,花了不少功夫,也学到了新姿势,遂记录下来以备后续碰到相同场景使用. 题目 这是2021 虎符杯的一道web题,有一个目标站点且附带了源码. 源码内容包括: 主要逻辑 ...
- 【Azure 事件中心】EventHub 中同一条消息不停的推送给消费端问题记录
问题描述 EventHub 中同一条消息,不停的推送给消费端,查看日志发现错误: Caused by: com.azure.messaging.eventhubs.implementation.Par ...
- 小程序开发:app.vue检测更新时判断是否是朋友圈进入
因为如果从朋友圈点进小程序来的,有些功能就用不了,所以需要判断下是否从朋友圈点进来的. 检查代码如下: checkScene() { // 判断场景值 如果是从分享到朋友圈再打开 就会有一些功能无法使 ...
- 接口自动化有多少case?覆盖率是多少?执行完需要多久?
case根据接口数量而定,比如两百个接口,大概有5000个用例,一个接口大概有25到30个用例,一个接口大概200ms左右响应时间 覆盖率能达到95%以上,有时候可以达到百分之百,所有接口自动化用例执 ...
- 有n步台阶,一次只能上1步或2步,共有多少种走法
循环迭代: 1 public class steps { 2 public int js(int n) { 3 int one = 2; //初始化为第三级台阶最后跨一步的走法 4 int two ...
- 安卓app设置背景音乐循环播放另有强制不能调节音量软件无法退出(仅供个人学习)
步进式调节:(直接调到那个音量): setStreamVolume (int streamType, int index, int flags) int streamType 需要调整的音量类型 ( ...
- 单词本z ctrl shift alt - tr踩踏 shi流出 al不同
单词本z ctrl shift alt ctrl = control = 控制 con = com = 一起 tr- = 踩 踏 - 原始印欧语形式为 *der- contra = 相对,相反(一起踩 ...
- AMD Intel CPU 对比图
- 玉蟾宫(悬线dp)
求最大子矩阵一般用采用悬线法 (包好用的牢底) 悬线法: [ 以这道题为例,我们将R称为障碍格子,将F称为非障碍格子] 我们选择任意一个非障碍格子,引出三条直线:左直 右直 上直 随后从这个点出发,分 ...
- Oracle数据库中sql查询很快,但在程序中查询较慢的原因和解决方法
代码如下 string sql = "SELECT * FROM LIS_V_LABTESTSAMPLE WHERE PATIENT_ID=:P"; HlsA ...