一种应用于嵌入式系统的软件性能测试方法

文档序号:6482135阅读:367来源:国知局
专利名称:一种应用于嵌入式系统的软件性能测试方法
技术领域
本发明属于嵌入式软件测试领域,特别是一种基于非插装的嵌入式软件测 试领域。
背景技术
在软件开发的过程中,性能测试在软件质量和性能控制中起着非常关键的
作用。在比较复杂的嵌入式软件开发中,性能测试也显得非常重要,根据80-20 原则,软件的80%的时间消耗在20%的代码中,因此定位性能消耗最多的代码, 能有效的帮助找出关键代码,并对其进行优化,从而达到提高整个软件性能的 目的。但是由于嵌入式系统环境的特殊性,对于软件性能测试造成了不小的阻 碍。首先,嵌入式软件运行在交叉环境的目标端,它的软硬件环境同开发端通 常是完全不同的,如何在软件运行时进行实时在线的性能测试,是一大挑战; 其次,由于嵌入式系统的资源有限性,系统的性能通常不会非常的高,如何在 有限的资源中降低性能测试的丌销,同样是一个难点。
目前,已经有许多用于嵌入式软件性能测试的方案。大致分为纯软件的方 法和软硬件结合的方法。其中,软硬件结合的方法主要用于许多成熟的商业工 具上,比如CodeTest, RTInsight等,它们利用硬件技术,可以很好地对嵌入式 软件进行性能测试,但是它们对硬件依赖过多,价格也非常的昂贵,不利于广 泛的使用。纯软件的方法同样也应用于很多的商业软件中,比如GammaCP等 主流嵌入式性能测试工具,它们都是采用插装的方法来实现性能测试。基于源 代码插装的方法在嵌入式软件性能测试中应用相当广泛,目前该方法多数是对
4GCC插装技术的研究和改进。
在目前的嵌入式软件性能测试中,基本都是采用插装的方法,但是它存在 着明显的不足之处(1)如果函数过多,则插入的代码相应增多,导致代码过
度的膨胀,带来巨大的额外开销;(2)如果程序非正常退出的话,gmon.out数 据不能被保存;(3)不能对共享库进行性能分析,因为无法对其进行插装;(4) 不能实时在线测试,使用的是事后发送gmon.out文件进行分析,对于那些需要 长时间运行的嵌入式软件,则存在很大的局限性。
就现有的软硬件结合的或者纯软件的嵌入式软件性能测试方法来说,要么 实现技术难度大、成本昂贵以及灵活性较差,要么不能满足实时在线的低开销 的要求。

发明内容
本发明的目的在于克服现有嵌入式软件测试技术上的不足,提出了一种基 于采样的非插装的纯软件的嵌入式软件性能测试方法,从可以解决目前嵌入式 软件性能测试开销过大的问题。
为了实现发明目的,采用的技术方案如下
一种应用于嵌入式系统的软件性能测试方法,包括采样系统和分析系统, 所述采样系统设置在目标端中,分析系统设置在宿主端中,采样系统和分析系 统通过网络进行通信,使得采样系统所采集的样本数据通过网络实时发送给分 析系统进行分析。
上述技术方案中,所述采样系统运行于目标端的嵌入式操作系统中。其包 括用于采集样本数据的采样模块和进行样本数据传递的测试代理模块。
所述采样模块运行丁嵌入式Linux的内核空间中,包括数据采样模块和 proc文件系统接口,数据采样模块负责注册中断事件处理函数、初始化Proc文件系统接口、对被测程序进行采样处理等。Proc文件系统向测试代理模块提供
接口来对采样进行读取和配置。
所述测试代理模块运行于嵌入式Linux的用户空间中,负责从网络中接收
数据和控制信息、配置采样模块、读取样本数据、将样本数据发送给位于宿主 端的分析系统
所述分析系统运行于软硬件资源丰富的宿主端开发机中,并通过网络同测 试代理模块进行交互,向测试代理模块发送交叉编译过的可执行文件、命令,
并且接收VM area maps和样本数据。样本数据经过数据收集线程和数据分析线 程处理后,通过可视化界面进行显示。
所述数据收集线程的样本收集器被动监听网络,等待测试代理模块主动发 送样本数据,所述样本收集器将收到的样本逐个交给StackStash Constructor, StackStash Constructor根据样本数据中的返回地址顺序构造或者更新一个称为 StackStash的树型结构,该树中的每个节点都是一个函数返回地址或PC值,这 反映出了采样时函数调用的堆栈情况。
所述数据分析线程维护一棵称为函数调用树的数据结构,该树的每个节点 记录了地址树中每个节点记录的地址所在的函数符号名、子函数采样次数和自 身采样次数,从中取出一批叶子结点,根据地址树的情况,对每个地址进行符 号解析,从而更新符号对应的函数调用树节点中的子函数采样次数和自身采样 次数,并将结果反馈给GUI层,进一步进行结果的分析和显示。
本发明通过采样系统和分析系统实现软件性能的测试,采样系统采集样本 数据通过网络实时发送给分析系统进行分析。在不对源代码和编译过的可执行 文件进行修改的前提下,在程序运行时采集程序的上下文样本进行分析,从而 降低测试过程中的开销。


图1为交叉测试模式框架图
图2为基于采样的非插装的嵌入式测试方法框架图。
图3为采样系统框架图。
图4为样本缓存结构图。
图5为分析系统框架图。
具体实施方式
下面结合附图对本发明做进一步的说明。
本发明为了实现实时在线的性能测试,采用基于交叉测试的测试模式,如 图1所示,测试工具运行在软硬件配置丰富的宿主机上,它对被测程序进行插 装处理后,使其运行在软硬件资源相对缺乏的目标机上,产生测试信息,并通 过一定的通信连接由测试代理传输到宿牛-机上,由测试工具接收。
本发明为丫尽量减少性能开销,采用非插装采样技术。能在不对源代码和 编译过的可执行文件进行修改的前提下,在程序运行时采集程序的上下文样本 的方法。由于嵌入式操作系统可以根据许多不同的事件产生异步的中断,因此 可以利用这一特性,在程序的运行过程中,通过一定的频率对程序运行的上下 文数据(如堆栈信息)进行采样,从而得到一个样本数据库。在这些大量的样 本中,测试人员便可以结合已知的程序信息对样本数据进行分析,进行嵌入式 软件进行性能测试。
本发明将非插装采样技术进行修改并结合嵌入式软件交叉测试模式,提出 了一种基于采样的非插装的纯软件的嵌入式软件性能测试方法,从而可以解决
目前嵌入式软件性能测试开销过大的问题。该方法的整体框架如图2所示。整
个框架分为两个部分在宿主端的分析系统和在目标端的采样系统,两部分通过网络进行通信。在目标端上执行被测试程序时,测试代理负责把采样模块加 载到内核中,当采样事件发生时由采样模块对被测试程序进行采样,样本库通 过文件接口提供给测试代理,测试代理负责把数据发送到开发机,在开发机进 行分析,从而实现对嵌入式软件进行交叉的性能测试。
采样系统运行于目标机端的嵌入式操作系统上,由采样模块和测试代理两
个部分组成,如图3所示。采样模块运行于嵌入式Linux的内核空间中,由采 样模块和Proc文件系统接口两部分组成。采样模块负责注册中断事件处理函 数、初始化Proc文件系统接口、对被测程序进行采样处理等。Proc文件系统向 测试代理提供接口来对采样进行读取和配置。测试代理运行于Embedded Linux 的用户空间中,负责从网络中接收数据和控制信息、配置采样模块、读取样本 数据、将样本数据发送给位于宿主端的分析系统。
采样模块被插入内核后,进行一系列的初始化工作。它首先在Proc文件系 统中注册三个文件,分别对外提供读取样本缓存、设置采样目标程序PID以及 读取被采样程序VM area maps的接口 ,采用Proc文件系统作为交互的接口 , 在各种版本的Embedded Linux中可移植性较好。之后,由Configure controller 接收从用户空间的配置,包括采样事件的类型和被采样程序PID,相应注册并 且配置、或者释放中断事件处理函数,从而开始或者停止整个采样系统的工作。
采样的发生依赖于中断事件的发生,而该采样系统提供了比较灵活的中断 事件选择。在目前的Linux-based操作系统中,主要有Linux时钟中断和性能监 控计数器产生的事件中断可以做为采样事件。由于Linux七ased OS是分时系统, 以固定的频率(典型的为100HZ)进行时钟中断,可以通过向系统定时器注册 中断处理函数来实现采样。而更为精确的采样是基于性能监控计数器的 (PMC),现代的主流CPU都提供了简单的指令接口和一系列的性能监控寄器,可以通过指令对这些寄存器进行配置,从而使系统产生相应的事件中断, 比如缓存缺失、分支预测失效、CPU时钟中断等。因此,采样系统可以根据 CPU所能支持的中断事件进行配置,使得采样更为灵活、内容更为广泛。
中断处理函数负责采样。当中断事件发牛时,处理函数便记录PC、回溯栈 帧从而得到-组返回地址,从这些返回地址可以得到一个函数调用关系树,从 而准确地分析出中断事件发生时,程序的运行上下文。
为了支持可配置的采样功能,采样模块的样本缓存结构如图4所示,该缓 存是一个循环队列,每个队列元素采用Slot的结构。在每个Slot中,缓存了一 组变长的数据结构,每个结构由size, type, data三个域组成,其中size占一个字 节,表征该结构长度;type占一个字节,表征采样该数据时,中断事件的类型; 而data域为变长数组,记录采样的PC值和多个返回地址。采样模块将样本添 加到head所指的Slot中,当Slot被填满后,将其标记为可读;而用户空间一 次从tail所指的标记为可读的Slot中读取全部数据。这样的数据结构带来了如 下好处
(1) 减少了用户空间对模块内部缓存的读取次数,从而减少开销;
(2) 由于样本的产生频率比对其读取的频率高,需要缓存机制来避免数据 的丢失;
(3) 采用循环队列,可以避免资源的冲突问题。 采样模块对运行中的程序进行采样,从而得到了许多指令地址,这些地址
本身对分析人员没有意义,需要将其转换为相应的符号。这样就需要得到程序 运行时的内存区域映像。当遇到无法解析的地址时,采样系统便通过Proc文件 提供一个最新的内存区域映像。这可以通过获取进程task一stmct结构,遍历其 中的vm_area_struct类型的mmap链表来实现。但是,如果被测程序运行时间短,便可能来不及获取。本发明的策略是拦截sys一exit系统调用,当程序退出
时,读取一次内存区域映像,这样便至少有一次的读取,保证性能测试的正确 执行。
由于本发明采用的是交叉测试的模式,测试代理向宿主端提供测试服务。
它运行于目标端的用户空间中,通过Proc文件系统和采样模块进行交互。测试
代理的主要功能有(1)从宿主端分析系统获取事件配置信息,对采样模块进 行事件配置;(2)从采样模块的样本缓存中读取样本数据,并发送给分析系统 进行性能分析;(3)从宿主端下载并运行交叉编译完的可执行文件,将相应的 PID通知给采样模块;(4)从宿主端接收传送内存区域映像的命令,从采样模 块的Proc文件接口读出并发送给分析系统。
分析系统运行于软硬件资源丰富的宿主端开发机上。分析系统和采样系统 相互合作,实现了实时在线的性能测试。分析系统的框架如图5所示,分析系 统通过网络同测试代理进行交互,向后者发送交叉编译过的可执行文件、命令, 并且接收VM area maps和样本数据。样本数据经过数据收集线程和数据分析线 程处理后,通过可视化界面进行显示。
在数据收集线程中,Sample collector被动监听网络,等待测试代理主动发 送样本数据。当缓存了一批样本数据后,Sample collector将样本一个一个地交 给StackStash Constmctor。由于每个样本中都包含了一系列的返回地址以及采 样发生时的PC值,并且返回地址的顺序是按照采样时栈帧回溯的顺序排列的, 因此StackStash Constructor可以根据样本数据屮的返回地址顺序构造或者更新 一个称为StackStash的树型结构,该树中的每个节点都是一个函数返冋地址或 PC值,这反映出了采样时函数调用的堆栈情况。当地址树建立完毕后, StackStash Constructor将该树的叶子节点的引用放入一个临时队列中。当该队
10列达到一定长度后,将其加入Data Queue队列。后者是一个FIFO缓冲队列, 数据分析线程一次从中取出一个叶子节点队列。由于样本数据产生的非常快, 采用该缓冲队列后,可以降低数据分析和界面更新的频率。
数据分析线程维护一棵称为函数调用树的数据结构,该树的每个节点记录 了地址树中每个节点记录的地址所在的函数符号名、子函数采样次数和自身采 样次数。从Data Queue中取出一批叶子节点后,根据地址树的情况,对每个地 址进行符号解析,从而更新符号对应的函数调用树节点中的子函数采样次数和 自身采样次数,并将结果反馈给GUI层,进一步进行结果的分析和显示。
权利要求
1、一种应用于嵌入式系统的软件性能测试方法,其特征在于包括采样系统和分析系统,所述采样系统设置在目标端中,所述分析系统设置在宿主端中,采样系统和分析系统通过网络进行通信,采样系统采集所测试的软件的样本数据,并通过网络实时发送给分析系统进行分析。
2、 根据权利要求1所述的软件性能测试方法,其特征在于所述采样系统运行于目标端的嵌入式操作系统中,其包括用于采集样本数据的采样模块和进 行样本数据传递的测试代理模块。
3、 根据权利要求2所述的软件性能测试方法,其特征在于所述采样模块 运行于嵌入式Linux的内核空间中,其包括数据采样模块和proc文件系统接口 , 数据采样模块用于注册中断事件处理函数、初始化proc文件系统接口、对被测 程序进行采样处理,Proc文件系统向测试代理模块提供接口来对采样数据进行 读取和配置。
4、 根据权利要求2所述的软件性能测试方法,其特征在于所述测试代理 模块运行于嵌入式Linux的用户空间中,用于从网络中接收数据和控制信息、 配置数据采样模块、读取样本数据、将样本数据发送给分析系统。
5、 根据权利要求2所述的软件性能测试方法,其特征在于所述分析系统 运行于宿主端开发机中,并通过网络同测试代理模块进行交互,向测试代理模 块发送交叉编译过的可执行文件、命令,并且接收样本数据。
6、 根据权利要求1或5所述的软件性能测试方法,其特征在于所述样本 数据在分析系统中经过数据收集线程和数据分析线程处理后,通过可视化界面 进行显示。
7、 根据权利要求6所述的软件性能测试方法,其特征在于所述数据收集线程的样本收集器采用被动方式监听网络,等待测试代理模块主动发送样本数 据。
8、 根据权利要求7所述的软件性能测试方法,其特征在于所述样本收集 器设置一函数,并将收到的样本数据逐个交给该函数,该函数根据样本数据中 的返回地址顺序构造或者更新一个树型数据结构,该树型数据结构中的每个节 点都是一个函数返回地址或PC值,以反映采样时函数调用的堆栈情况。
9、 根据权利要求6所述的软件性能测试方法,其特征在于所述数据分析 线程维护一个函数调用树的数据结构,该函数调用树的每个节点记录了地址树 中每个节点记录的地址所在的函数符号名、子函数采样次数和自身采样次数, 从中取出一批叶子结点,根据地址树的情况,对每个地址进行符号解析,从而 更新符号对应的函数调用树节点屮的子函数采样次数和自身采样次数,并将结 果反馈给GUI层,进一步进行结果的分析和显示。
全文摘要
本发明提供一种应用于嵌入式系统的软件性能测试方法,包括采样系统和分析系统,所述采样系统设置在目标端中,分析系统设置在宿主端中,两部分通过网络进行通信,使得采样系统所采集的样本数据通过网络实时发送给分析系统进行分析,在不对源代码和编译过的可执行文件进行修改的前提下,在程序运行时采集程序的上下文样本进行分析,从而降低测试过程中的开销。本发明通过采样系统和分析系统实现软件性能的测试,采样系统采集样本数据通过网络实时发送给分析系统进行分析。在不对源代码和编译过的可执行文件进行修改的前提下,在程序运行时采集程序的上下文样本进行分析,从而降低测试过程中的开销。
文档编号G06F11/36GK101630285SQ20091004174
公开日2010年1月20日 申请日期2009年8月7日 优先权日2009年8月7日
发明者刘发贵, 刚 吴, 浩 张, 李胜文 申请人:华南理工大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1