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

news2024/10/7 6:16:07

作为基础软件服务子系统的HarmonyOS HiViewDFX(以下简称HiViewDFX)框架,是HarmonyOS的公共基础设施。包括日志、事件、跟踪、故障管理及观测剖析五大部分,同时也提供了故障检测、定位和性能观测剖析的开发套件,以及将端侧数据直接对接云侧大数据质量分析平台和IDE(Integrated Development Environment, 集成开发环境)调试调优工具。为应对应用开发难题,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框架来开发一个高可靠高性能的应用!

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

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

相关文章

操作系统权限提升(十一)之系统错误配置-启动项提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

【前端】Vue项目:旅游App-(19)loading:网络请求时显示loading效果

文章目录目标过程与代码loading效果mainStore控制loading显示点击蒙板取消网络请求在网络请求处添加对loading的控制效果总代码修改或添加的文件loading.vueservice/request/indexstore/modules/mainApp.vue参考本项目博客总结:【前端】Vue项目:旅游App-…

自动化运维|云原生架构下的产品自动化发布、快速部署和持续交付实战之路

自动化运维|云原生架构下的产品自动化发布、快速部署和持续交付实战之路。 1.背景介绍 CI/CD是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一种面向开发和运维团队的解决方案,CI/CD 主要针…

只做笔记有必要买apple pencil吗?平价电容笔排行榜

如今国内的电容笔,牌子也越来越多了,苹果原装电容笔虽然性能不错,但价格也非常昂贵,一般人是买不起的。现在市面上有很多可以取代原来的苹果电容笔的平替电容笔。下面,我给大家推荐几款电容笔,好用而且价格…

Java 文件IO操作基础,File,FileInputStream,FileOutputStream

什么是文件 有个时候我们程序中的数据不会直接保存,一旦程序断电,数据将不会存在,如果我们想要我们程序中的数据永久的保存起来,所以,java的文件io显得非常重要。 什么是文件流 创建文件 如下相关的文件io方法 new F…

【教程】Wireshark抓取抖音直播的OBS推流地址和密钥

真不用花钱去买提取推流码的软件。。。自己提取很简单的。 简单记录一下,以备自己需要时候忘了怎么搞。 1、电脑开热点,手机连接热点; 2、电脑安装wireshark软件,并选择WLAN或者以太网接口; 3、wireshark筛选rtmpt&am…

Kubernetes持久化Events到sentry

背景 Kubernetes中的事件最终还是存储在etcd中,默认情况下只保存1个小时,由于etcd并不支持一些复杂的分析操作,默认Kubernetes只提供了非常简单的过滤方式,比如通过Reason、时间、类型等。同时这些事件只是被动的存在etcd中&…

CAPL(vTESTStudio) - DOIP - UDP发送_03

继UDP接收的介绍完成后,今天我们介绍下UDP发送的函数,这里我们将我自主开发的函数整体都会介绍个大家,一般能够完成大家日常脚本开发中90%以上使用发送UDP的数据函数,绝对干货满满。 UDP发送 一、参数定义 无论DoIP发送报文的UDP还是TCP函数,亦或是CAN、CANFDLIN的发送函…

Redux了解及应用(三)

React - redux 使用(由浅入深):https://blog.csdn.net/Jie_1997/article/details/128078971 这篇文章总结的很棒!!!了解redux及应用直接看这篇文章即可 备注:第五节的第三小节,容器…

学习驱动的复杂软件符号执行

原文来自微信公众号“编程语言Lab”:学习驱动的复杂软件符号执行搜索关注“编程语言Lab”公众号(HW-PLLab)获取编程语言更多技术内容!欢迎加入编程语言社区 SIG-编程语言测试,了解更多编程语言测试相关的技术内容。加入…

元宇宙:有人追捧,就会有人抵触

或许,直到现在,我们依然无法否认元宇宙即将对我们的生产和生活产生的深刻影响。即使是在它遭遇巨大的不确定性的大背景下,依然如此。 有人追捧,便有人抵触。元宇宙商用的止步不前,元宇宙技术的难以突破……几乎都是这…

为什么不进行穷举测试?

本章主要介绍不对所有可能性进行测试的原因,对于经理和测试人员,都应该了解测试是一种采样过程,需要了解采样给测试所带来的风险。 1、可进行测试的数目是无限的 如果不能查看代码内部逻辑,可输入的测试用例是无限的。当然还有在不…

第30章 分布式缓存强制删除触发器的触发调试

1 Services.Users.Caching.RoleCacheEventConsumer using Core.Caching; using Core.Domain.Users; using Services.Caching; namespace Services.Users.Caching { /// <summary> /// 摘要&#xff1a; /// 通过该类中的方法成员&#xff0c;在角色实体的1个实例…

Linux —— 文件系统概述、软硬链接与动静态库

目录 1.文件系统概述 1.1磁盘的基本存储结构 1.2磁盘的基本逻辑结构 1.3操作系统中的文件系统 1.4文件系统如何对磁盘进行管理 2.软链接、硬链接 2.1软链接 2.2硬链接 2.3目录的硬链接数 3.静态库和动态库 3.1静态库的制作 3.2静态库的使用 3.3动态库的制作 3.4动态…

年薪50k大佬带你五分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架怎么做&#xff1f;自动化测试自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发展的趋势。特别是在敏捷模…

分布式请求链路跟踪-SpringCloud Sleuth

文章目录1.概述1.1.为什么会出现这个技术&#xff1f; 需要解决哪些问题?1.2.是什么?1.3.如何解决问题?2.搭建链路监控步骤2.1.zipkin2.2.服务提供者2.3.服务消费者&#xff08;调用方&#xff09;2.4.测试1.概述 1.1.为什么会出现这个技术&#xff1f; 需要解决哪些问题?…

力扣刷题记录——1108. IP 地址无效化、1281. 整数的各位积和之差 次数 、1295. 统计位数为偶数的数字、1394. 找出数组中的幸运数

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——1108. IP 地址无效化、1281. 整数的各位…

手撕排序算法(一)——插入排序

排序的概念及意义本章内容我们采用C语言完成代码。排序的概念我们先来了解一下基础概念&#xff1a;排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序…

cin关闭流同步的利弊与cout的endl使用(超时问题)

重要&#xff1a;1&#xff1a;比如print&#xff0c;scanf&#xff0c;gets()&#xff0c;pus()&#xff0c;getchar()不要与cin&#xff0c;cout共用2&#xff1a;cout中不要使用endl每次使用endl&#xff0c;都要flush缓冲区&#xff0c;造成大量时间耗费。推荐cout <<…

springBoot国际化的一种方式

引言&#xff1a; 当我们的应用面向不同国家用户时&#xff0c;根据不同的locale返回不同的语言信息的国际化功能就显得有必要了。一般来说国际化主要表现在前端用户界面上&#xff0c;在现在前后端分离的背景下&#xff0c;前端页面的国际化交由前端代码独立完成&#xff1b;少…