嵌入式
系统
性能
瓶颈
分析
工具
设计
应用
张元胤名
敬请登录网站在线投稿(t o u g a o.m e s n e t.c o m.c n)2 0 2 3年第4期 7 3 嵌入式系统性能瓶颈分析工具的设计与应用张元胤名(中国电子科技集团公司第三十二研究所,上海 2 0 1 8 0 0)摘要:本文研究对龙芯3 A 3 0 0 0处理器硬件拓扑信息的获取以及对性能管理单元PMU的访问。通过指定事件类型获取PMU中相关事件的发生次数来分析嵌入式应用性能瓶颈产生的原因。通过E c l i p s e插件技术使性能瓶颈分析工具以插件的方式集成到E c l i p s e开发环境上,为程序员提供图形用户界面,使程序员能够更直观地获取相关信息,方便其在开发过程中及时发现程序中的性能瓶颈并进行定位。关键词:龙芯3 A 3 0 0 0;性能管理单元;性能瓶颈分析中图分类号:T P 3 1 文献标识码:AD e s i g n a n d A p p l i c a t i o n o f E m b e d d e d S y s t e m P e r f o r m a n c e B o t t l e n e c k A n a l y s i s T o o lZ h a n g Y u a n y i n m i n g(C h i n a E l e c t r o n i c s T e c h n o l o g y G r o u p C o r p o r a t i o n N o.3 2 R e s e a r c h I n s t i t u t e,S h a n g h a i 2 0 1 8 0 0,C h i n a)A b s t r a c t:T h e r e s e a r c h c o n t e n t o f t h i s p a p e r i s m a i n l y t o o b t a i n h a r d w a r e t o p o l o g y i n f o r m a t i o n o f L S 3 A 3 0 0 0 p r o c e s s o r a n d a c c e s s t o t h e p e r f o r m a n c e m a n a g e m e n t u n i t.B y s p e c i f y i n g t h e e v e n t t y p e,t h e n u m b e r o f r e l a t e d e v e n t s i n t h e PMU i s o b t a i n e d t o a n a l y z e t h e c a u s e o f p e r f o r m a n c e b o t t l e n e c k s.T h e p e r f o r m a n c e b o t t l e n e c k a n a l y s i s t o o l i s i n t e g r a t e d i n t o t h e E c l i p s e d e v e l o p m e n t e n v i r o n m e n t a s a p l u g-i n t h r o u g h E c l i p s e p l u g-i n t e c h n o l o g y,p r o v i d i n g a g r a p h i c a l u s e r i n t e r f a c e f o r p r o g r a mm e r s,e n a b l e s p r o g r a mm e r s t o o b t a i n r e l e v a n t i n f o r-m a t i o n m o r e i n t u i t i v e l y,s o t h a t t h e y c a n f i n d p e r f o r m a n c e b o t t l e n e c k s i n t h e p r o g r a m i n t i m e a n d l o c a t e t h e m d u r i n g t h e d e v e l o p m e n t p r o c e s s.K e y w o r d s:L S 3 A 3 0 0 0;p e r f o r m a n c e m a n a g e m e n t u n i t;p e r f o r m a n c e b o t t l e n e c k a n a l y s i s0 引 言对于应用程序来说,算法的复杂度决定了它的性能,因此,若希望软件运行得更加流畅,最根本、最直接的方式是改变其算法1。本文将处理器体系结构和应用程序特征结合起来分析,可以及时发现应用程序在指定处理器上的性能瓶颈。这是一个循环往复的过程,在嵌入式开发中更是如此,程序员需要一个可以实时监测嵌入式系统的性能信息的工具,以便及时解决潜在性能问题。龙芯3 A 3 0 0 0(L S 3 A 3 0 0 0 H)是由龙芯中科技术股份有限公司研发设计的面向个人计算机、服务器等信息化领域的通用处理器。本文在龙芯3 A 3 0 0 0平台上设计并实现了一套面向R e w o r k s应用的性能瓶颈分析工具来解决以上问题。1 相关工作现有的性能分析技术主要分为以下两种:插桩方法和采样方法。接下来我们将探讨这两种分析技术的优缺点和适用的场景。插桩方法是一种常见的测试程序性能、检测错误、获取程序执行信息的技术2。插桩方法的原理如下:在保证被测程序原有逻辑完整性的基础上,在程序中插入一些探针(p r o b e)(即添加一些代码)获得程序的控制流和数据流信息。插桩主要有两种方式:静态插桩和动态插桩。静态插桩在源程序代码编译之前对源代码进行插桩操作,比如在源代码的每一个函数入口或者出口进行探针插入,这样当程序运行起来时,就可以得到应用程序各个函数的运行时间、调用次数、调用关系等相关信息。静态插桩的优点是实现较为简单,且相对于动态插桩来说,对程序的性能影响相对较小。不过,缺点也比较明显,每一次插桩都要重新编译源代码,会造成额外的开销。动态插桩是指在程序运行时进行插桩,不同于静态插桩,动态插桩需要在编译或者链接程序前对程序插入探针,插桩的动作是在程序运行中同时实现。动态插桩的实现较为复杂,需要调试器支持断点调试,而调试功能的使7 4 M i c r o c o n t r o l l e r s&E m b e d d e d S y s t e m s 2 0 2 3年第4期w w w.m e s n e t.c o m.c n 用同样可能会造成性能瓶颈。采样法也是常见的性能分析方法,主要有基于事件的采样和基于时间的采样两种采样方式。基于时间的采样主要支持那些没有性能计数器的处理器,它借助于操作系统的中断机制,每个时钟中断都会记录一次。相比于基于事件的采样,基于时间的采样所支持的采样时间相对较短。由于要借助操作系统时钟中断,对禁用中断的代码不能进行分析。随着电子工业的发展,现在的中央处理器都集成了性能计数器(P e r f o r m a n c e M o n i t o r C o u n t e r,PMC),用于记录计算机系统所发生的硬件事件(如c a c h e未命中数、分支预测失败数等)。通过系统调用访问性能计数器,就能得到相关的性能信息。龙芯3 A 3 0 0 0处理器同样也集成了性能计数器,所以本文采用基于PMU的性能时间采样方法来实现。2 基于P M U的性能瓶颈分析工具在龙芯3 A 3 0 0 0处理器上的实现2.1 总体结构基于国产嵌入式系统的性能瓶颈分析工具主要由以下两部分组成:一部分在搭载麒麟操作系统的宿主机上实现,通过E c l i p s e插件技术将性能瓶颈分析工具集成到嵌入式集成开发环境中,实现了与目标机通信进行参数传递,控制目标机性能数据采集引擎,以及接收目标机采集到的性能数据并进行解析展示等功能。另一部分在目标机上实现,主要功能模块有基于PMU的性能数据采样引擎模块和通信模块。其总体结构图如图1所示。图1 性能瓶颈分析工具结构图性能瓶颈分析工具的通信模块基于风河公司的开源统一交互框架(T a r g e t C o mm u n i c a t i o n F r a m e w o r k,T C F)设计,是一种轻量级、可扩展的通用通信框架,应用在嵌入式开 发 中。T C F基 于T C P,传 输J S ON格 式 的 报 文。J S ON报文中只能容纳A S C I I字符,字节流要通过B a s e 6 4编码后才能传输。其示意图如图2所示。性能瓶颈分析工具的通信模块由两部分组成:第一部图2 目标通信框架结构示意图分在宿主机中,下发参数到目标机,接收从目标机采样引擎采样的数据;第二部分在目标机中,接收宿主机下发的采样参数并上传。2.2 性能瓶颈分析工具的采样模块2.2.1 采样引擎的启动龙芯3 A 3 0 0 0处理器由4个G S 4 6 4 E高性能处理器核组成,每个G S 4 6 4 E处 理 器 核 实 现 了2 8组 性 能 计 数 器(H P C s),分配到7个模块上4,它的性能分析功能主要通过硬件集成的性能计数器来完成,用于统计处理器内部某些事件的发生次数。特别是可以分析程序代码在与处理器微结构交互影响过程中所体现的性能瓶颈,主要包括c a c h e不命中次数、T L B r e f i l l例外次数和分支预测出错次数等。由于龙芯3 A 3 0 0 0是多核平台,因此在采集前用户需要指定采集性能数据的C P U序号,然后将指定采样频率和P MU采样事件通过宿主机的控制按钮将参数下发到目标机,控制目标机采样引擎开始工作,其实现函数如下:v o i d p a O n(i n t p o l l D e l a y)u s e r I n i t P m u E v e n t();/初始化p m u事件 e n a b l e P m u E v e n t(i n t e v e n t I d);/使能p m u事件 目标机采样引擎在收到来自宿主机传来的采样周期和选定的PMU事件后,通过初始化PMU事件函数和使能PMU事件函数开启采样。采样的数据类型包括c a c h e不命中数、分支预测失败次数和T L B r e f i l l例外次数,通过以上3种事件帮助用户查找系统中可能发生性能瓶颈的原因。以上3种事件在龙芯G S 4 6 4 E处理器核中定义的事件号如表1所列。表1 处理器性能计数器事件定义事件号事件描述所属模块1 4 6T L B r e f i l l例外次数ROQ模块1 5 6b r q提交的预测错的分支指令ROQ模块3 9 8c a c h e数据失效次数C A C HE 2 MEM模块 敬请登录网站在线投稿(t o u g a o.m e s n e t.c o m.c n)2 0 2 3年第4期 7 5 通过c o n v e r t P m u E v e n t T y p e()函数将宿主机下发的参数进行转换,之所以不在宿主机上直接下发对应参数,是考虑到在以后的开发中,宿主机端的嵌入式集成开发可能不仅仅集成一套工具链,这样可以方便日后的拓展。2.2.2 性能数据的采样过程基于PMU的性能事件采样方法以一定的采样频率对指定的PMU事件进行采集,用户所设定的采样事件不同,得到的采样结果也不同,其采样的数据结构体如下:t y p e d e f s t r u c t u n s i g n e d i n t p h i s i c a l I d x;/*p m u分配的c o u n t e r寄存器I D*/E V E N T_U P D A