当前位置: 首页 > 科技观察

RTC性能自动化工具在内存优化场景下的实践_0

时间:2023-03-13 18:17:44 科技观察

背景介绍性能测试是SDK发布的重要依据。VolcRTC业务方更注重性能指标,对RTC接入有明确的接入标准。为此,我们建立了离线性能自动化测试系统。在测试过程中,我们发现VolcRTC内存占用较高,优化空间较大。A版1v1语音通话VolcRTC1v1语音通话内存占用:占用资源内存[MB]Android高端设备17.87Android中端设备17.58Android低端设备16.06iOS高端设备6.19iOS中端设备6.52iOSlow-enddevice5.73为了实现内存优化,首先需要梳理两个问题:哪些模块消耗多少内存?如何优化?内存组成在回答上面两个问题之前,我们先来了解一下内存的主要组成部分有哪些。在Android系统上,内存主要分为:下图中红框部分是VolcRTC调用过程中的JavaHeap,由Java代码分配的对象;Java内存在调用过程中的分布曲线主要表现为锯齿状的周期性变化。结合VolcRTC的业务特点可知,这部分内存主要是调用JNI时分配的临时对象,积累到一定程度后会被系统的GC机制回收。NativeHeap,从C或C++代码分配的对象。这部分是VolcRTC的主要内存使用。代码,用于处理代码和资源的内存,例如dex字节码、优化或编译的dex代码、.so库和字体。VolcRTC库占用内存不等于动态库包大小。主要原因是代码段是按需分页加载的,所以有些代码不会加载到内存中。VolcRTC是一个动态库,所以Code的内存也是调用过程中的主要部分。优化方向根据上面的初步分析,可以确定VolcRTC的内存占用主要分布在NativeHeap和Code段。因此,我们定义大体的优化方向如下:原生内存优化动态库包体优化内存归因分析哪些模块消耗了多少内存?内存分配栈信息由模块归属Heapprofd实现原理hookmalloc,calloc,realloc,free等内存分配相关函数复制寄存器和栈内存,存入共享内存进行栈回溯根据栈信息聚类生成trace文件由于VolcRTC归属规则VolcRTC主要分为两部分:底层媒体引擎和上层RTCSDK。媒体引擎的整体架构由管道(Pipeline)组成,每条Pipeline又由实现不同功能的Node组成。我们可以根据相关命名空间进行栈过滤,然后根据软件分层架构进行逐层归属。纯系统栈VolcRTC引起的系统栈内存分配,栈中不包含VolcRTC符号信息,不能按照前述规则归类,需要归入VolcRTC引起的系统内存分配。属性示例的内存分配栈特征一般是栈底是__pthread_start(void*),栈顶是内存分配方法,中间是VolcRTC栈信息。根据栈信息,结合归属规则,逐层归属,形成树状结构,准确分析每条Pipeline、每条Node、每类对象占用的内存大小。遇到的问题Hookmalloc获取的内存大小和NativeHeap的大小不一致。malloc向内存分配器申请的内存与程序运行时传入的大小一致。内存分配器向操作系统申请的内存是按页分配的,一般每页4K,NativeHeap统计这部分内存大小。由于内存分配器需要反复分配和释放内存,所以不可避免地会产生内存间隙,即内存碎片。另外,内存分配器会缓存一些小的内存块,以提高内存分配效率。语音通话内存分析使用性能自动化测试工具生成分析报告。我们根据分析报告绘制语音通话内存全景图,然后通过全景图识别出内存占用高的几个模块,指导优化方向。内存优化编译和优化包大小会直接影响内存大小,因此优化包大小也可以有效降低内存大小。通过启用LTO、Oz等编译选项,结合离线性能自动化测试评估是否对性能指标产生负面影响,确定需要启用的编译优化选项。编译优化后,Android端动态库包体减少900KB,调用进程内存优化约850KB。按需动态分配VolcRTC作为一个通用的SDK,针对每个特定的场景都会有很多冗余的逻辑和函数,而这些逻辑和函数预分配的内存较多。相应的优化方案是:合理的代码组件化,将不同的功能抽象成组件,实现灵活组装和按需加载。比如AI降噪功能内置的数据和模型都会占用很大的内存空间。内存应尽可能动态分配。比如AEC回声消除在不同的场景下有不同的算法,需要根据实际场景按需分配内存,减少过多的内存预分配。设置合理的缓存大小不合理的缓存大小也会造成不必要的内存浪费。通过内存归属分析,结合不同场景的业务特点,设置更合理的缓存大小,可以减少内存占用。例如:RTC使用RTP包重传机制来对抗网络丢包。为了实现重传机制,需要缓存一定数量的数据包,需要根据帧长、实时性要求等业务特点,将缓存数量设置为合理的值。合理的算法和数据结构设计合理的算法和数据结构也能有效减少内存。该算法在保证计算精度的前提下,通过缩小数据取值范围和使用占用内存空间较小的数据类型来实现,如统计时间相关数据时使用相对时间代替绝对时间,而空间音频算法通过定点优化使用短类型而不是浮点数据。另外,数据结构设计需要考虑内存对齐问题。优化效果语音通话1v1占用资源优化前内存[MB]优化后内存[MB]Android高端机17.8713.59Android中端机17.5813.98Android低端机16.0612.93iOS高端机6.193.87iOS中端设备6.523.84iOS低端终端5.733.14在本次内存优化中,我们探索了性能归因分析驱动的性能优化在RTC场景下的实践。可以总结出以下经验:构建稳定测试用例,建立性能退化数据归因模型,基于归因模型识别性能热点问题,形成优化方案,从1v1调用开始,逐步扩展到多人,数百人,数千人。