neo's profile十年一场梦 ..BlogListsGuestbookMore ![]() | Help |
|
|
8/20/2009 对于性能测试分析的一些看法 性能测试好比是部侦探小说,拿到一些暗示或信息去不断挖掘找出真相的过程, 或更似做实验的过程,不停的去try do,try do…直到记录的数据足够去证明这个实验的好坏.我个人认为性能测试可分为如下几种; 一种是基线测试,又可分为横向测试及纵向测试两种,所谓横向测试是指自己的技术方案与同行其他技术做性能对比,通常这是要显出自己的性能好于其他的或在某些情况下优于其他的,如果要能有数学理论做基础支持就更好了. 纵向测试是在记录自己技术性能的一个updata情况,比如打了修正性能的patch,再比如修改某个内核变量 重新编译kernel会得到不同的性能结果,通常纵向测试是记录一个性能调优的过程. 另一类可以姑且叫做探索性测试,很大程度上是需要多种技术背景知识才能做好的.通常是利用性能监控或数据收集工具对程序进行一段时间甚至是很长时间的监控,通过数据来揭示性能瓶颈,有时问题可能昙花一现难以捕捉但总会留下一丝线索,有时问题可能是由多个因素相互影响造成的,如何找到hotpots是个难点. 下面就根据自己这些年的工作 总结出几条做好性能分析的要点 第一. 做性能测试之前最好搞先清楚技术的实现,未必是要理解看懂每行代码,因为这样时间上也不允许,如果能最好但总之也是要理解实现原理,运行流程,对机制的框架有个总体的把握,这样才能针对环境设计合适的性能测试方案.才能进行有效的测试,忌讳什么都不清楚上来就动手测. 第二. 性能测试要有明确的目标,有针对性,减少不相干组件的影响,要清楚我所做的是要干什么,比如说要测试某个组件性能就要针对它设计特定的测试场景,例如测试网卡性能.通常应使用点对点直连连接利用c/s模式测试,而不应当中间再经过一个hub、路由器,或其他主机在使用网络时进行测试.再例如测试无线网络性能,就应该在特定的屏蔽房中测试,应尽量减少信号干扰衰减. 第三. 性能测试要选择准确的”尺子”.这里所说的尺子也就是时钟,我们要确保测试的准确.对于性能测试一般的都是运行一段测试代码,记录该程序起始时间与结束时间,以该时间差做为性能基准(或者一些程序会在这个时间差上加个权值计算).因此这个时间是否可靠也就是测试准确的前提条件.比如说虚拟化中时钟中断是异步处理的,就会出现时间不准确的情况.因此虚拟化中的性能测试先要解决时钟问题. 第四. 性能测试要选择恰当的精确度.那,我们都通常希望所做的性能测试精确度越高越好,数据小数点后位数越多越好越精确,但这样的话我们就要选用高精度定时器或提高时钟频率,同样带来的一个问题就是时钟中断频繁发生,很可能会打断系统正在运行的程序去处理时钟中断,从而加大了系统负荷.整体性能反而会下降.因此我们应选个折中点. 第五. 研发应为性能测试留有余地.性能测试,我们不能光用眼睛看,我们要用工具,无论是开源的还是自己写的通常这个工具都要会到一些底层的lib接口,那开发应把这个接口留出来以便测试.比如说我们以前剪裁小系统,很多接口先前都被裁掉了,影响了测试.当然这个部分是需要沟通的,而且要及时. 第六. 减少或避免测试的overload.何所谓测试的overload: 我们可以想象到测试程序也是要用资源的,比如说cpu,内存.那~出现一个问题,我们应当尽量减少测试程序使用资源以防止对待测程序的性能影响. 其中一种较好的方法:可以使用pmu硬件性能计数器来做数据的收集.亦或者实在不能减少overload,那我们只能使用模糊模型,利用相对性能数据来说明问题 第七. 如何应对多因素引起的瓶颈,上面写探索性分析时提到过,当找到一个点,很可能是瓶颈,但从数据上看,可能是由多种因素构成(多个算法,多个函数或多个子程序,多种资源).这时我们应当利用 阿姆达尔法则”:在计算机编程的并行处理程序中,少数必需顺序执行的指令是影响性能的一个要素,即使增加新的处理器也不能改善运行速度.” 将多个组件加以权值,分级分层次分析阻塞点(见”从cpu pipeline阻塞中分析性能问题”),优先解决顺序执行的路径上的性能. 第八. 性能测试是个循环的过程,不可能一次性就能判断出问题所在,需要分析-修改-分析…同时要注意修改很可能会引出另一个或一些问题. 第九. 重视理论知识,但要更重视实验结果. 做性能测试不难,但要做准确的性能测试需要时间! TrackbacksThe trackback URL for this entry is: http://sh-neo.spaces.live.com/blog/cns!1E3CA285E5F9E122!754.trak Weblogs that reference this entry
|
|
|