OpenHarmony标准系统开机时长优化

news2024/11/19 0:29:46

简介

万物互联时代,产品性能至关重要,而系统启动时间是系统性能的重要组成部分,因为用户必须等待系统启动完成后才能使用设备。对于经常需要进行冷启动的汽车等设备而言,较短的启动时间至关重要(没有人喜欢在等待几十秒后才能输入导航目的地),在金融交易设备、电子商务服务器、实时通信设备同样也有较高的应用场景,那我们该如何在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标准系统下性能优化的功能应该有了初步的了解。如果您对本篇文章内容感兴趣,可以根据本篇文章介绍进行研究和使用。同时也欢迎更多开发者与我们共享开发成果,分享技术解读与经验心得。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何手写一个文件索引工具everything(第一章)

第一章&#xff08;NTFS格式及USN日志&#xff09; 背景介绍 Windows平台的Everything文件查找速度非常快&#xff0c;优势在于利用了NTFS的USN日志&#xff0c;以及Windows上的文件监测机制我们也可以仿照类似原理&#xff0c;通过查询USN日志、监测Windows平台文件修改、使…

亚马逊卖家如何用facebook推广?

亚马逊作为全球最大的电商平台之一&#xff0c;吸引了大量的卖家和买家。对于亚马逊的卖家而言&#xff0c;如何进行有效的推广和引流成为了他们最关心的问题之一。其中&#xff0c;利用Facebook广告为亚马逊进行推广是一种较为常见的做法。 但是&#xff0c;亚马逊可以用Face…

springboot实现修改用户信息功能

目录 1、UserEntity层 2、UserMapper层 3、UserService层 4、UserController类 5、Postman测试 要实现修改用户信息的功能&#xff0c;需要编写对应的代码&#xff1a; 如&#xff1a; 在UserEntity中定义用户实体类的属性。 在UserMapper中编写修改用户的SQL语句&#…

【C++】哈希的应用 -- 布隆过滤器

文章目录一、布隆过滤器的引入二、哈希函数个数的选择三、布隆过滤器的实现四、布隆过滤器的应用五、布隆过滤器总结一、布隆过滤器的引入 我们在上一节中学习了 位图&#xff0c;知道了位图可以用来快速判断某个数据是否在一个集合中&#xff0c;但是位图有如下的缺点&#x…

Qemu虚拟机读取物理机的物理网卡的流量信息方法

项目背景&#xff1a; 比如我有三个项目 A&#xff0c;B&#xff0c;C&#xff1b;其中A项目部署在物理机上&#xff0c;B&#xff0c;C项目部署在 虚拟机V1,V2中&#xff0c;三个项目接口需要相互调用。 需要解决的问题点&#xff1a; 1&#xff0c;因为A&#xff0c;B&#x…

2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)题解

2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016) A - Artwork 题目描述&#xff1a; 给定N*M的网格&#xff0c;给出Q次询问&#xff0c;每次询问都给出一个小矩阵&#xff0c;保证每个矩阵要么长为1&#xff0c;要么宽为1&#xff0c;将网格中矩阵部…

最近给shopify跨境电商网站搞google搜索引擎的seo优化,整理了一些内容

接到一个网站&#xff0c;首先要做一些工作&#xff0c;然后按照这个步骤做好每一步&#xff0c;网站的搜索排名会有明显的效果。 对网站进行技术审核&#xff0c;以确保它符合搜索引擎的技术要求。研究关键词并确定目标关键词。优化网站内容&#xff0c;以便更好地针对目标关…

【LeetCode】剑指 Offer 55. 二叉树的深度 p271 -- Java Version

1. 题目介绍&#xff08;55. 二叉树的深度 &#xff09; 面试题55&#xff1a;二叉树的深度&#xff0c; 一共分为两小题&#xff1a; 题目一&#xff1a;二叉树的深度题目二&#xff1a;平衡二叉树 2. 题目1&#xff1a;二叉树的深度 题目链接&#xff1a;https://leetcode.c…

简单写一个Avue增删改查

今天练习了一下avue&#xff0c;真的好用&#xff0c;个人感觉相比于用element plus的组件还方便&#xff01; 简简单单的写了一个页面的增删改查&#xff0c;思路很简单。如果在写那种后台管理项目&#xff0c;基本上全是列表页&#xff0c;用这种方法写出来第一页&#xff0c…

收入下滑,亏损扩大的人力资源管理公司罗科仕申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;来自北京的人力资源管理公司罗科仕近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为(LGCL) 。罗科仕计划通过此次纳斯…

算法训练第五十八天 | 739. 每日温度、496.下一个更大元素 I

单调栈part01739. 每日温度题目描述思路496.下一个更大元素 I题目描述思路739. 每日温度 题目链接&#xff1a;739. 每日温度 参考&#xff1a;https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html 题目描述 请根据每日 气温 列表&#xff0c;重新生…

Android组件化开发

Android组件开发 一、背景 一个app随着业务增加&#xff0c;代码放在同一个模块中会越来越臃肿&#xff0c;同时也导致多人开发的一个难度。组件化可以把业务单独分出来&#xff0c;形成一个单独模块&#xff0c;可单独运行、测试等&#xff0c;相互之间不会影响。另外一个优…

鼎捷T100制造之工艺工单实战(其他工艺补充)

文章目录 一、网状工艺二、平行工艺三、替代工艺四、返工工艺五、无顺序工艺一、网状工艺 网状工艺类似一张网状结构。可以包含平行和线性工艺等于一体。 网状工艺: 产品结构 aeci004:建立作业 aecm200: 工艺路线维护

kubeasz搭建k8s集群-部署单节点集群(AllinOne部署)

1说明 kubeasz 致力于提供快速部署高可用k8s集群的工具, 同时也努力成为k8s实践、使用的参考书&#xff1b;基于二进制方式部署和利用ansible-playbook实现自动化&#xff1b;既提供一键安装脚本, 也可以根据安装指南分步执行安装各个组件。 kubeasz 从每一个单独部件组装到完…

太赫兹高速通信系统前端关键技术

摘要&#xff1a;对构成太赫兹无线系统的2 种关键电路&#xff08;分谐波混频器和二倍频器&#xff09;进行了深入研究。在关键电路研究取得突破的基础上&#xff0c;开展了太赫兹无线通信技术研究&#xff0c;构建了220 GHz 无线通信实验验证系统。220 GHz 实验验证系统在室外…

elasticsearch 其他字段类型详解和范例

本章主要内容 elasticsearch 中别名字段的详解和范例elasticsearch 中二进制类型的详解和范例elasticsearch 中的嵌套类型的详解和范例elasticsearch 中的范围类型的详解和范例elasticsearch 中的排名类型的详解和范例elasticsearch 中的ip类型的详解和范例elasticsearch 中的…

【网络应用开发】实验3——Web组件重用与JavaBeans

目录 Web组件重用与JavaBeans预习报告 一、实验目的 二、实验原理 三、实验预习内容 1. 静态include指令何时执行&#xff1f;主页面和被包含的子页面是否转换为一个转换单元&#xff1f; 2.动作指令何时执行&#xff1f;主页面和被包含的子页面是否转换为一个转换单元&a…

【Python游戏】坦克大战、推箱子小游戏怎么玩?学会这些让你秒变高高手—那些童年的游戏还记得吗?(附Pygame合集源码)

前言 下一个青年节快到了&#xff0c;想小编我也是过不了几年节日了呢&#xff01;&#xff01; 社交媒体上流传着一张照片——按照国家规定“14岁到28岁今天都应该放半天假&#xff01;”不得不说&#xff0c; 这个跨度着实有点儿大&#xff0c;如果按整自然年来算年龄&…

Spark 连接 Hive

目录 导包 修改配置文件 修改hive-site.xml文件 启动hadoop 启动hive 启动spark 测试 查看表 导包 spark连接hive需要六个关键的jar包&#xff0c;以及将hive的配置文件hive-site.xml拷贝到spark的conf目录下。如果你hive配置没问题的话&#xff0c;这些jar都在hive的目…

Spring Security实战(四)—— 会话管理

目录 一、理解会话 二、防御会话固定攻击 三、会话过期 四、会话并发控制 五、集群会话的缺陷 六、集群会话的解决方案 七、整合Spring Session解决集群会话问题 只需在两个浏览器中用同一个账号登录就会发现&#xff0c;系统并没有任何会话并发限制。一个账号可以多处同…