王 卉,赵政文,齐万华
(西北工业大学计算机学院,西安 710068)
随着软件的发展和应用,用户关注的已经不仅仅是软件的功能,性能也开始成为关注的焦点。因此开发人员希望通过对被测系统进行性能测试,定位性能瓶颈,分析引起性能问题的原因。由于软件的性能最终要通过系统的整体性能表现出来,一般开发人员因为各种因素,并不能通过代码来对系统的资源利用率和相关资源(如网络、数据库、应用服务器等)的使用和消耗数据进行性能分析和测试。Windows作为最广泛使用的操作系统,对其内核的运行状态进行可视化研究很有意义。
可视化泛指利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来并进行交互处理的理论、方法和技术,这是一个展示数据并获得对数据更深层次认识的过程。基于Windows内核运行过程的可视化系统通过调用ETW,并在开发程序的关键处插入代码,当代码在内核中运行时,以事件跟踪的方式实时进行采集、解析,并通过可视化界面工具打开。由此开发人员可以通过代码运行时系统的资源利用率和对相关资源(如网络、数据库、应用服务器等)的使用等进行性能分析和测试。
作为性能分析及数据采集的系统,应遵守以下准则:
(1)真实性:采集出的数据可视化后反应的是真实的系统运行状况,获取系统最真实的性能表现。
(2)动态性:体现各种操作执行的时序关系。
(3)可靠性,系统具有容错能力和可连续运行的能力。
(4)可用性,系统开销要小,不会严重降低系统和网络性能。
(5)适应性,对系统来说必须是易于开发的,可添加新的功能,能随时适应系统环境的改变。
Windows事件跟踪(ETW)是操作系统提供的一个高速通用的跟踪工具,能够满足上述需求。ETW的优势在于结合使用系统内核模式和用户模式的组件,优化事件日志的快速写入,在实际操作环境中实现详细跟踪。ETW在内核中实现缓冲和日志记录机制,日志记录机制使用处理器的缓冲区,当缓冲区满或是ETW会话终止时,系统将提前转储缓冲区的内容,由异步写线程将这些缓冲区写入磁盘。这样,在写入事件时大型服务器应用程序所受的干扰可以被降至最小。从Windows Vista开始,微软新推出了ETW统一事件提供程序模型和API。使用ETW提供的程序API,任何应用程序DLL或驱动程序都可以成为事件的提供程序(引发事件的组件),因此任何可被记录的重要活动都可以成为事件。
使用系统附带的控制器应用程序logman,在本地和远程系统上调用 ETW,以“事件跟踪方式(event trace)”对于指定时间段内的事件跟踪日志进行收集。使用logman工具启动ETW会话和事件提供程序,由提供程序引发的事件写入ETW会话中,当会话终止时,跟踪事件跟踪器将日志记录在以.etl为扩展名的二进制文件中。数据解析主要是依据事件的不同类型,不同观察粒度对采集的二进制数据提取进程/线程号、时间戳、提供程序GUID、CPU时间、CPU ID等等,并且通过数据的分类整理,转变为规整的可视化工具数据。
可视化界面沿着时间轴真实的还原了代码运行时,进程的整个运行状态,包括磁盘和CPU占用时间状况和调度状况、进程间的通信状况。
可视化工具,是利用MFC编程实现的。把采集出的信息进行解析处理,将解析出的数据导入到可视化工具,输出可视化界面,如图1所示。
图1 一个java进程的可视化实例
图1展示一个java线程沿着时间轴的整个事务过程。图的左侧是系统运行时进程的列表,包括进程名和线程号。右侧就是所有进程/线程在内核中运行的图形显示,进程/线程对CPU和磁盘的使用分开表示,进程/线程在CPU使用时,将之划分为“可执行状态”、“执行中”和“休眠状态”三种状态,在“执行中”状态根据用户模式、内核模式、缺页异常等活动类型,根据进程/线程的状态和活动类型的不同,以适当的颜色加以区分。当线程从休眠状态变为可执行状态时使用箭头表示,以不同的颜色进行区分wakeup的原因,如网络时间中断、时间片中断、其他进程中断等等。时间轴显示的是相对时间,可以通过修改设置,变为绝对时间。
图1中显示ID号为17631的java线程与ID号为17657的postmaster线程之间通信的动作。图1中ID号为17631的java线程有“202”的数字,是事件提供程序ApProbe Trace在应用程序中插入的探测点,“202”作为methodID是用户自定义的,通过这些探测点的加入,用户可以更好的跟踪代码在内核中运行的真实状况。
图2所示的是用户点击使用flash制作的网页链接时一个事务的执行过程,可视化界面上显示从浏览器进程结束到Framework进程的执行中出现了延迟,并且浏览器进程占用了很多资源,消耗了很多时间。这些延迟和消耗过多的资源需要具体分析其原因,也可以将运行程序在不同的配置环境中运行,得出可视化界面,分析是因为系统环境造成的延迟和损耗还是因为代码等其他原因。
因此通过内核运行的可视化界面,开发人员能够真实的了解到应用程序在各种不同操作系统内核中的运行状态,对比性能指标进行性能分析。
图2 一个事务执行过程的图形化显示
某一Java产品一到自己的框架处理处响应时间就从40毫秒增加到700毫秒。开发人员无法分析出问题原因,通过使用本系统,使动作/性能可视化、只用了半天时间问题点就明确化,问题得到解决。
通过可视化测试结果,进行详细分析,发现有两个问题,见图3中第一幅图虚线框出的①和②两个部分。
图3 利用可视化进行性能分析的实例
问题:
①CPU等待/空闲区间过多;
②与其他Java线程之间通信频繁。
根据问题应采取以下措施进行改善:
①CPU等待/空闲区间的原因检讨;
②减少java线程间的通信次数;
③减少java线程的访问时间。
通过以上三点对代码进行改善,再次运行后,对比发现:改善前需要312毫秒的处理时间,改善后只需要69毫秒(约1/5)。
注:上下两幅图倍率,区间相同(时间间隔200毫秒)
与 Windows Performance Monitor相比,Event Tracing for Windows旨在提供较低开销的跟踪。ETW通常占用不超过5%的CPU,它每秒可以记录多达20,000条事件,启用实时跟踪会相当快。在性能调查过程中,通常会检查四个因素:CPU、磁盘I/O、内存和可伸缩性。大多数调查都将从CPU开始,CPU将影响应用程序的启动和执行时间。在诊断较长的启动时间时,检查磁盘I/O是最有用的,磁盘I/O是冷启动时间的主要因素,冷启动时间是指内存中没有某个应用程序时(如重启后)启动此应用程序所花的时间,而过多的内存消耗(或泄露)可能会导致应用程序随时间的流逝变得更慢。
通过对Windows操作系统内核进行可视化,并结合一个例子展示了性能分析的应用。实例证明对内核状态的数据采集、解析和还原对性能优化是可用的,目前的工作已获得阶段性成果。但是利用系统的可视化界面进行软件性能分析和优化,需要有专业知识的开发人员去完成。如何更好的使用这一工具,还需要进一步的研究。
[1]Darren Mar-Elia.深入 Windows跟踪日志[J].系统网络,2004,1(1):50 -57.
[2]Dr.Insung Park,Alex Bendetovers.Event Tracing for Windows[EB/OL].MSDN Magazine.(2009) [2012].http://msdn.microsoft.com/zh - cn/magazine/ee 412263.aspx.
[3]Dr.Insung Park,Ricky Buch.使用 ETW 改善调试和性能优化[EB/OL].MSDN Magazine,(2007)[2012],http://msdn.microsoft.com/zh - cn/magazine/cc 163437.aspx.
[4]RUSSINOVICH ME,SOLOMON DA.深入解析 Windows操作系统:MicrosoftWindowsServe:2003,Windows XP and Windows2000技术内幕[M].北京:电子工业出版社,2007.
[5]Carver,R.H.,K.- C.Tai.Use of sequencing constraints for specification-based testing of concurrent programs[J].IEEE Transactions on Software Engineering,1998,24(6):471-490.
[6]Emrath,P.A.,S.Ghosh,D.A.Padua.Detecting nondeterminacy in parallel programs[J].IEEE Software,1992,9(1):69-77.
[7]刘群策.LoadRunner和软件项目性能测试[M].北京:机械工业出版社,2007.
[8]段念.软件性能测试过程详解与案例剖析[M].北京:清华大学出版社,2006.