一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库。从操作系统(CPU调度,内存管理,进程调度,磁盘I/O)、网络、协议(HTTP, TCP/IP ),还是从应用程序代码,数据库调优,中间件配置等方面入手。
单一个中间件又分web中间件(apache 、IIS),应用中间件(tomcat 、weblogic 、webSphere )等,虽然都是中间件,每一样拎出来往深了学都不是一朝一夕之功。但调优对于每一项的要求又不仅仅是“知道”或“会使用”这么简单。起码要达到“如何更好的使用”。
常看到性能测试书中说,性能测试不单单是性能测试工程师一个人的事儿。需要DBA 、开发人员、运维人员的配合完成。但是在不少情况下性能测试是由性能测试人员独立完成的,退一步就算由其它人员的协助,了解系统架构的的各个模块对于自身的提高也有很大帮助,同进也更能得到别人的尊重。
再说性能调优之前,我们有必要再提一下进行测试的目的,或者我们进行性能测试的初衷是什么?
能力验证:验证某系统在一定条件具有什么样的能力。
能力规划:如何使系统达到我们要求的性能能力。
应用程序诊断:比如内存泄漏,通过功能测试很难发现,但通过性能测试却很容易发现。
性能调优:满足用户需求,进一步进行系统分析找出瓶颈,优化瓶颈,提高系统整体性能。
性能瓶颈实际上就是一个软件的性能缺陷 。
在性能测试中,总会用到“性能瓶颈”这个词,也就把它当成基本的一个词汇了,从没想过它到底是个什么东西。今天忽然有人问道什么是“性能瓶颈”,虽然勉强能列举一些例子来说明它,但总不是太令人满意,所以就总结一下。
首先得说明“瓶颈”的意思。瓶颈,通俗地说,就是一个瓶子的脖子,就是整个系统最薄弱的环节。好比一个桶,能装多少水取决于最短的那块木板,其它的木板再长也没用,那么我们就可以认为这块短的木板就是这个桶的瓶颈了。
所以性能瓶颈,就是说指限制系统性能的关键因素。
一般包括:
(1)硬件上的性能瓶颈
主要指的是CPU、RAM方面的问题。例如,在进行软件需求分析、概要设计时,确定了在数据库服务器上需要6个CPU、12G内存但是在测试时,发现CPU的持续利用率超过95%,这时可以认为在硬件上出现了性能瓶颈。
(2)应用软件上的性能瓶颈
一般指的是应用服务器、WEB服务器等应用软件,还包括数据库系统。例如,在WEBLogic平台上配置了JDBC连接池的参数,最大连接数为50,最小连接数为5,增加量为10。在测试时发现,当负载增加时,现有的连接数不足,系统会动态生成10个新的连接数,这样导致了交易处理的响应时间大大的增加。
这时可以认为在应用软件上出现了性能瓶颈。
(3)应用程序上的性能瓶颈
一般指的是开发人员新开发出来的应用程序。例如,用Java或者C开发出来的部署在应用服务器上用于用户交易请求处理的应用程序。例如,某个开发员开发了一个缴费处理程序,在测试时发现,这个缴费处理程序在处理用户发过来的并发缴费请求时,只能串行处理,无法并行处理,导致缴费交易的处理响应时间非常长,这时可以认为在应用程序上出现了性能瓶颈。
(4)操作系统上的性能瓶颈
一般指的是Windows、Unix、 Linux 这些操作系统。例如,在windows系统中,虚拟内存设置的不合理,都指定为C驱提供虚拟内存,在测试时发现当出现物理内存不足时,虚拟内存的交换效果非常不理想,导致交易的响应时间大大增加。这时可以认为在操作系统上出现了性能瓶颈。
(5)网络设备上的性能瓶颈
一般指的是防火墙、动态负载均衡器、交换机等设备。例如,在动态负载均衡器上设置了动态分发负载的机制,当发现某个应用服务器上的硬件资源已经到达极限时,动态负载均衡器将后续的交易请求发送到其它负载较轻的应用服务器上。在测试时发现,动态负载均衡机制没有起到相应的作用,这时可以认为在网络设备上出现了性能瓶颈。
(2)
1、网络瓶颈,如带宽,流量等形成的网络环境
2、应用服务瓶颈,如中间件的基本配置,CACHE等
3、系统瓶颈,这个比较常用:应用服务器,数据库服务器以及客户机的CPU,内存,硬盘等配置
4、数据库瓶颈,以ORACLE为例,SYS中默认的一些参数设置
5、应用程序本身瓶颈,这个是测试过程中最需要去关注的,需要测试人员和开发人员配合执行,然后定位
逐步细化分析,先可以监控一些常见衡量CPU,内存,磁盘的性能指标,进行综合分析,然后根据所测系统具体情况,进行初步问题定位,然后确定更详细的监控指标来分析。
碰到过的性能问题:
1. 在高并发的情况下,产生的处理失败(比如:数据库连接池过低,服务器连接数超过上限,数据库锁控制考虑不足等)
2. 内存泄露(比如:在长时间运行下,内存没有正常释放,发生宕机等)
3. CPU使用偏离(比如:高并发导致CPU使用率过高)
4. 日志打印过多,服务器无硬盘空间
如何定位这些性能问题:
1. 查看系统日志,日志是定位问题的不二法宝,如果日志记录的全面,很容易通过日志发现问题。比如,系统宕机时,系统日志打印了某方法执行时抛出out of memory的错误,我们就可以顺藤摸瓜,很快定位到导致内存溢出的问题在哪里。
2. 利用性能监控工具,比如:JAVA开发B/S结构的项目,可以通过JDK自带的Jconsole,或者JProfiler,来监控服务器性能,Jconsole可以远程监控服务器的CPU,内存,线程等状态,并绘制变化曲线图。
利用Spotlight可以监控数据库使用情况。
我们需要关注的性能点有:CPU负载,内存使用率,网络I/O等
3. 工具和日志只是手段,除此之外,还需要设计合理的性能测试场景
具体场景有:性能测试,负载测试,压力测试,稳定性测试,浪涌测试等
好的测试场景,能更加快速的发现瓶颈,定位瓶颈
4. 了解系统参数配置,可以进行后期的性能调优
最后要说的是:做性能测试的时候,我们一定要确保瓶颈不要发生在我们自己的测试脚本和测试工具上。
一般性能问题调优的步骤:
步骤一:确定问题
应用程序代码:在通常情况下,很多程序的性能问题都是写出来的,因此对于发现瓶颈的模块,应该首先检查一下代码。
数据库配置:经常引起整个系统运行缓慢,一些诸如oracle 的大型数据库都是需要DBA进行正确的参数调整才能投产的。
操作系统配置:不合理就可能引起系统瓶颈。
硬件设置:硬盘速度、内存大小等都是容易引起瓶颈的原因,因此这些都是分析的重点。
网络:网络负载过重导致网络冲突和网络延迟。
步骤二:确定问题
当确定了问题之后,我们要明确这个问题影响的是响应时间吞吐量,还是其他问题?是多数用户还是少数用户遇到了问题?如果是少数用户,这几个用户与其它用户的操作有什么不用?系统资源监控的结果是否正常?CPU的使用是否到达极限?I/O 情况如何?问题是否集中在某一类模块中? 是客户端还是服务器出现问题? 系统硬件配置是否够用?实际负载是否超过了系统的负载能力? 是否未对系统进行优化?
通过这些分析及一些与系统相关的问题,可以对系统瓶颈有更深入的了解,进而分析出真正的原因。
步骤三: 确定调整目标和解决方案
得高系统吞吐理,缩短响应时间,更好地支持并发。
步骤四:测试解决方案
对通过解决方案调优后的系统进行基准测试。(基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试)
步骤五:分析调优结果
系统调优是否达到或者超出了预定目标?系统是整体性能得到了改善,还是以系统某部分性能来解决其他问题。调优是否可以结束了。
最后,如果达到了预期目标,调优工作就基本可以结束了。
转载于:https://blog.51cto.com/10541556/1846198