应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下

HarmonyOS HiViewDFX框架图
一、HiViewDFX介绍
一般地,捕获异常信号需要自行增加捕获异常的机制,通过信号来感知异常及采集对应的异常日志,但是往往这类信息无法有效的与系统信息关联。
HiViewDFX为应用开发者提供了具有轻量级故障检测、精准的故障定位日志以及快速恢复功能的开发套件,能够迅速提高应用的可靠性。
如下图所示,在HarmonyOS系统中首先内置崩溃、泄漏、卡死等轻量级故障检测器,用来记录应用在系统侧的异常状态。
其次,在应用程序框架内及运行时增加了异常捕获能力,使得系统和应用能够分层检测和记录异常信息,通过开放查询、订阅、恢复三个API(Application Programming Interface, 应用程序编程接口)提供给开发者。

HarmonyOS应用异常处理框架图
在应用崩溃和卡死的时候,HiViewDFX提供的精准日志定位功能能够详细地记录异常发生时的日志。
HiViewDFX 提供了对应的应用异常日志查询接口,将JS_CRASH, CPP_CRASH, APP_FREEZE这三类故障日志提供给开发者,并且是结构化的日志信息,开发者可以从反馈的信息中快速获取到故障的相关信息。
为给用户提供更佳的体验,在日志信息反馈异常数据的基础上,HiViewDFX提供了应用快速恢复的框架(如下图),当系统感知到JS_CRASH, CPP_CRASH, APP_FREEZE, KILL等故障之后,能快速通知应用,应用将之前的状态进行保存,而后系统会自动拉起应用,然后恢复到故障前的原界面。

应用恢复框架图
二、HIViewDFX相关工具介绍
HiViewDFX的工具入口---Insight,是DevEco Studio中的插件,拥有众多系统能力支撑,如图所示,有调试连接器、HiTrace、HiPerf 以及HiProfiler 框架。
HiViewDFX提供的系统能力包含日志、事件、分布式跟踪、故障等。

HiViewDFX调试调优架构图
接下来,就让我们一起了解下HiViewDFX提供的部分工具吧!
1)调试连接器
如下图所示,调试连接器是连接上位机和下位机的通道,通常用做嵌入式开发,常用的连接工具,比如,基于串口或者网口的Telnet、SSH等。
HarmonyOS面向不同形态的设备时,这些设备可能不具备网口或者USB端口,只有一个串口,要支持这个,串口上需要具备Shell和文件IO等功能。有了调试连接器作为中转,就可以让开发者使用的IDE和其他工具脚本无需面临硬件的复杂性,更好的关注调试和调优本身。

调试连接器原理示意图
2)HiTrace
如下图所示,HiTrace工具用于追踪进程轨迹,进行程序性能分析,支持内核FTrace预置埋点和用户态打点。
在性能分析中,Trace是最常用的方式,可以说Trace就是性能的日志,把Trace按照模块分门别类,这就是Trace的Tag。例如,Sched是操作系统内核的调度信息打点;Ability是Ability模块在用户态的关键生命周期打点。
假设定位某应用掉帧的问题,在分析时,打开Graphic、Ability、Sched等tag点,可以在Insight里面分析应用在送显、图形模块绘制相关的耗时。

HiTrace工具原理示意图
3)HiPerf
如下图所示,HiPerf是为开发者提供的采样调优分析工具,通过采样的方式,可以采集CPU PMU、Tracepoints以及程序热点函数信息,并且和Insight联动,提供离线和实时分析的能力。
HiPerf采集定位过程中会遇到一个难点:使用跨编程语言,在程序运行时,可能会存在一些跨语言的调用。例如,从JS调用NAPI到C++接口等。
因为是抽样的调用栈采集,如果只采集其中一种语言的调用栈会导致两个语言之间的耗时数据无法同步,从而产生冲突,影响性能问题的度量和定位,所以在调用栈采集的时候进行缝合。

HiPerf工具原理示意图
如下图所示,这段JS代码调用了三个内存相关的数据获取接口,均是NAPI实现的NATIVE接口。
在HiPerf中,首先采集NAPI调用JS的调用栈信息,当采集到一个C++的调用栈时,此时栈顶是函数NativeFunctionCallBack()的NAPI回调,则这个NATIVE调用栈就可以和前一次采集到的JS调用栈合并,最终拼接出一个完整的调用栈。

NAPI调用中JS-CPP栈缝合示意图
除了上述系统内置的分析点,开发者也可以通过HiTrace接口增加自定义的性能分析打点。
如下列代码所示,HiTraceMeter的接口比较简单,找到一段流程的开始和结束,加上Trace打点,就能在Insight中看到Start-End的耗时。
// API
declare namespace hiTraceMeter {
// Async trace
function startTrace(name: string, taskId: number, exceptedTime?: number): void;
function finishTrace(name: string, taskId: number): void; // Counter trace
function traceByValue(name: string, count: number): void;
} //example
onWindowStageCreate(windowStage) {
...
hiTraceMeter.startTrace('getMainWindow');
windowStage.getMainWindow().then((win) => {
Appstorage.SetOrCreate(Constants.MAIN_WINDOW, win);
hiTraceMeter.finishTrace('getMainWindow');
...
});
...
}
HiTrace API介绍及开发样例图
4)HiProfilerHiProfiler
框架是基于HiViewDFX基础能力构建的一个插件集,可以为Insight提供调优数据采集。
该组件整体分为PC端和设备端两部分。
PC端最终作为DevEco Studio的插件进行发布,内部主要包括分为UI绘制、设备管理、进程管理、插件管理、数据导入、数据存储、 数据分析、Session管理、配置管理等模块。
设备端主要包括命令行工具、服务进程、插件集合、应用程序组件等模块。
设备端提供了插件扩展能力,对外提供了插件接口,基于该扩展能力可以按需定义自己的能力,并集成到框架中。

HiProfiler框架
三、如何查询内存信息
操作系统对内存是分级定义的,从物理地址空间到虚拟地址空间,再分为用户态和内核态。应用内存调优分析的时候,还需要分解到虚拟地址、Ark JS的内存、NATIVE的内存、字体图标等资源、So的映射、线程栈等,这些都属于内存观测的范围。
HiViewDFX提供了HiDumper工具,作用是系统信息查询,它提供了系统版本、CPU占用率、内存以及Sa信息,开发者可以使用HiDumper来分析应用的内存(如下图)。开发者分析内存比较关注的是Ark JS Heap以及NATIVE Heap、Pss、Dirty这些指标,如果程序有内存泄漏或者一般的内存膨胀的问题,可以看到这些值会不断变大。

HiDumper查看内存信息示意图
如果应用要在程序中监控内存,可以使用这组HiDebug接口(如下列代码所示),前三个接口是NATIVE内存分配器的统计信息,可以获取NATIVE分配器的总大小、分配大小和可用大小,后三个接口是从系统Smaps获取的统计信息,注意这两个信息不是一个维度上的,不能做数据的等同,在使用场景上也有差异。
// API
declare namespace hidebug {
function getNativeHeapSize(): bigint;
function getNativeHeapAllocatedSize(): bigint;
function getNativeHeapFreeSize(): bigint;
function getPss(): bigint;
function getSharedDirty(): bigint;
function getPrivateDirty(): bigint;
}
HiDebug接口示意图
分配器的信息经常用于统计程序中对Native内存的分配情况,不代表这些内存实际被使用,这部分内存是开发者可以控制且可以进行优化的。
而系统Smaps统计信息,常用于程序感知自身内存的实际占用大小,这个大小经常受到分配器延迟释放、系统延迟回收、Copy-on-write、分配器MetaData额外损耗等,造成统计出来的内存信息和分配器控制的内存不完全等同,往往不能作为内存优化的直接依据,而是作为内存压力统计的依据。
四、如何进行内存调优分析
我们通过信息查询得知了内存的大小信息,那么如何进行内存分析呢?
如下图所示,右侧部分是开发者使用Insight进行分析的样例。
首先分析泳道图上的内存曲线,得到三类数据,JS、Native和虚拟内存,它们采集的分配信息基本都比较相似。例如,图中分配信息部分,名字和调用栈,是区分一块内存的重要信息,地址和大小是一块内存的基本信息。引用关系可以帮助我们建立内存之间的关系树,帮助我们更快找到内存的引入点。分配时间则可以帮助开发者了解哪些内存会长时间存留,长时间存留的内存是需要重点关注的。

内存分析数据采集原理图
另外,虽然虚拟内存在64位上可能不是一个痛点问题,但是在32位程序上经常会导致问题。32位程序的地址空间只有4GB,如果是32位内核,那么用户态一般情况只有3GB地址空间,这种情况下开发者需要关注虚拟内存的使用情况,HarmonyOS的做法是在Mmap的地方进行Hook,拿到分配的调用栈,并且对系统映射的绝大多数匿名页都进行了命名。因此不论是文件页还是匿名页,在分配信息中都能看到页的命名信息,这对于内存分析非常有帮助。
以上就是HiViewDFX提供的可靠性和性能优化调试调优能力的相关介绍了,欢迎广大开发者使用HiViewDFX框架来开发一个高可靠高性能的应用!

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下的更多相关文章
- 60,000毫秒内对Linux的性能诊断效的方法
转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0225/168.html?1456484140 60,000 毫秒内对 Linux 的性能诊断 当你 ...
- BizTalk开发系列(三十七) 性能监视器在BizTalk性能测试中的使用
BizTalk应用程序的性能测试和分析是一个非常重要的过程,因为BizTalk的应用程序在Run-time时受部署结构.消息请求数量和消息大小等 的影响很大,因此无论是简单还是复杂的的应用都需要在部署 ...
- Windows计数器做性能监控(window server 2008服务器)
使用Windows计数器 一.创建数据收集器集 二.创建数据收集器 三.使用数据收集器 1.修改数据收集器的属性 2.手动启用.手动停止数据收集器集 3.计划任务 4.在性能监视器中查看 一.性能监视 ...
- SQLServer2008-2012资源及性能监控—CPU使用率监控具体解释
前言: CPU是server中最重要的资源.在数据库server中,CPU的使用情况应该时刻监控以便SQLServer一直处于最佳状态. 本文将会使用可靠性和性能监视器来获取CPU相关的使用统计信息 ...
- 第四章——SQLServer2008-2012资源及性能监控(3)
原文:第四章--SQLServer2008-2012资源及性能监控(3) 本文为本系列最后一章,监控内存使用.监控服务器的内存是非常重要的事情,有很多情况会引起内存消耗.所以要经常性地做检查. 本文将 ...
- 第四章——SQLServer2008-2012资源及性能监控(2) .
原文:第四章--SQLServer2008-2012资源及性能监控(2) . 本文接着上文继续,讲述如何监控CPU的使用情况 前言: CPU是服务器中最重要的资源.在数据库服务器中,CPU的使用情况应 ...
- 第四章——SQLServer2008-2012资源及性能监控(1)
原文:第四章--SQLServer2008-2012资源及性能监控(1) 性能优化的第一步是发现问题,而发现问题通常又有两类:突发问题的侦测和常规问题的侦测,对于常规问题的侦测,通常需要有一个长效的性 ...
- 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑
由于是开发阶段,所以并没有配置postgres的参数,都是使用安装时的默认配置,以前运行也不见得有什么不正常,可是前几天我的cpu资源占用突然升高.查看进程,发现有一个postgres的进程占用CPU ...
- 【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)
原创 2016-09-12 熊军 [云和恩墨]性能优化:Linux环境下合理配置大内存页(HugePage) 熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 PC S ...
- Kafka消息的可靠性测试--针对直播业务的方案选择
转自:http://blog.csdn.net/bailove/article/details/44240303 业务场景 来疯直播互动平台,每天有数百万人上下线,有数十万人同时参与互动直播聊天.用户 ...
随机推荐
- 【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
问题描述 在博文 "[Azure Developer]使用 Powershell az account get-access-token 命令获取Access Token (使用用户名+密码 ...
- 关于 LLM 和知识图谱、图数据库,大家都关注哪些问题呢?
自 LLM 系列文章<知识图谱驱动的大语言模型 Llama Index>.<Text2Cypher:大语言模型驱动的图查询生成>.<Graph RAG: 知识图谱结合 L ...
- Mysql常用存储引擎以及区别?
InnoDB:是Mysql的默认存储引擎,支持事务.外键.如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新.删除操作,那么InnoDB存 ...
- C++ STL之 map 学习笔记
•何为 map? map 是 STL 的一个关联容器,它提供一对一的数据处理,map 中存放的是一个 key-value键值对,其类型可以自己定义: 第一个可以称为关键字,每个关键字在 map 中只能 ...
- 案例8:将"picK"的大小写互换
最终输出结果为PICk. 需要先计算两个字母之间的间隔,比如a和A之间的间隔为多少. 然后在将大写字母转换为小写字母,加上间隔的值: 将小写字母转换为大写字母,减去间隔的值. 示例代码如下: #def ...
- 协议 UARST & 数据发送与接收
STM32具有的协议 UASRT是通用异步/同步收发器,UART是通用异步收发器 串口空闲状态时高电平,开始传输数据时,第一个数据为固定的低电平: 数据:最后为高电平的停止位 奇偶校验:通过+1或者不 ...
- docsify + GitHub Page免费搭建个人博客
docsify生成文档 docsify是一个动态生成文档网站的工具.通过编辑MarkDown文件就能实现简约清爽的文档页面. 先在Github创建项目 创建项目成功后,把项目克隆到本地(以自己的实际地 ...
- day09-数据格式化&验证以及国际化
数据格式化&验证以及国际化 1.数据格式化 1.1基本介绍 说明:在我们提交数据(比如表单时),SpringMVC 是怎样对提交的数据进行转换和处理的 基本数据类型可以和字符串之间自动进行转换 ...
- 8、Linux CentOS 安装.Net Core 3.1
1.添加密钥 将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库. 打开终端并运行以下命令: sudo rpm -Uvh https://packages.m ...
- TCP可靠传输的保证
我们知道传输层提供最主要的两种协议,TCP和UDP,其中TCP是保证可靠传输,为什么他要保证可靠传输呢,IP说:当然是我不能,我只提供尽力而为的服务,不保证你能不能交付,不保证能不能正确的交付,不保证 ...