性能调优

转又一个大牛写的,都是testroad上看到的,感谢

问题描述:
  性能调优从哪些方面入手?
  精彩答案:
  会员 yzylion:
  我个人觉得现在大多数的性能测试工作人员分为以下三个阶段:
  1、出了问题就看资源,资源占用如果很高,报以窃喜的心态,恩,发现了,原理是资源瓶颈
  2、资源没有出现瓶颈,通过一些技术手段分析,发现是组件的配置文件有问题,例如:server的并发策略有问题,带宽有问题,找到了线路短板性能中的短板,到了这个阶段在我看来是比较牛的测试拉
  3、以上均无问题的情况下,考虑数据结构和算法
  就我个人接触到的来说,现在大多数的人员都是在仰望第二阶段,摸索第三阶段,希望从代码级就发现出性能的问题,进行问题的发现和解决,也符合我们的bug越早发现修复的成本越低的理论。同时,也是一名性能测试工程师高薪的象征。
  那么谈完了现状,回到我们的这个话题:性能调优从哪些方面入手,个人觉得有如下几点:
  1、对于所测系统所设计到的知识领域的了解。例如:所测系统开发语言,牵涉到的中间件,web,app 两大server等的配置参数是什么意思,如何监控,分析它们的哪些数据等
  2、注重基础知识的学习和积累。例如:对于web的性能测试,对于TCP/IP原理,基本知识,数据的转发实现,交换机和路由器的带宽设置策略对性能的影响等需要了解,掌握清楚,思路清晰
  3、确定性能测试本身的有效。例如:脚本的优化,场景的设置等。因为,有些本身脚本的优化带来的执行效率的问题,往往被我们忽略,而一股脑的在那里研究是我们本身哪里出了问题
  性能测试调优是一条说简单简单,要做好不是那么容易的路,共勉~~~

转一个大牛的写的                                       

谈到软件产品的性能调优,我认为可以从狭义和广义两个范围来理解。从狭义的范畴来看,性能调优主要是指通过修改软件程序逻辑、结构等技术手段提升软件产品的各项性能指标,如响应时间等等;而从广义的层面来看,就不仅限于程序内部了,因为造成系统性能问题的瓶颈很可能来源于方方面面,而这种情况往往是性能调优很普遍的情况,下面就从广义的范围细分成几个角度来进行阐述。

  一、软件层面

  a)首先要谈到的肯定是我们自己提供的软件产品,因为它的内部设计是我们最清楚的,用户在应用时遇到性能问题首先要质疑的也是我们的产品,因此这个层面的调优肯定是我们软件供应者的重中之重!举例来说:比较复杂的业务,通常会在程序中输出一些关键操作的执行时间,然后再分析哪些操作比较耗时,之后再找原因。具体分析原因就比较多了,比如多次循环查询数据库,复杂耗时的SQL语句,频繁的远程调用,复杂算法,等等。

  b)数据库层面:设计数据库时应考虑到在少访问和简化、优化访问的前提下实现产品功能,多用存储过程代替完整SQL,尽量用连接池使用户和服务的连接实现可复用,尽量不使用游标结构等,对基本表的设计进行优化如第三范式、引入“中间表”的技术思路,控制用户实际数据量的增长;对数据库进行索引优化,避免整表扫描;对数据库的事务处理进行调优(去除不必要的锁、将事务切分成小的粒度、适当降低隔离级别、减少访问热点等);SQL语句调优(尽量优化那些无意义的、拙劣的、复杂的SQL)等等。这方面主要就是本着一个通过尽可能少的磁盘访问而获得所需要的数据这么一个基本原则。

  c)中间件软件:某些软件产品为数据库、中间件、客户端的三层架构设计,此时为系统运行提供服务的中间件软件也将成为制约性能的一个瓶颈。因此在这个层面上也是有很大调优空间的,比如各种相关参数的设置优化,使用性能包、性能监控分析工具等,避免竞争线程资源,批处理,堆大小的设置,为溢出条件设置执行队列,后备缓冲,减少非重要应用的资源占用,使用集群等。举个简单的实例,我曾经遇到一个产品的性能问题,当查询数据大到一定程度时,系统一直灰屏死机状态,结果只是通过把JVM内存参数设置从默认值的128调为256就轻松解决了,只是参数值的一个小变动,反映到具体的用户面前就是出的来和出不来数据的本质差别!

  d)操作系统:无论是服务器还是用户终端,都脱离不了操作系统这个基础的应用平台的支持,因此这个层面的性能调优工作也千万不能遗漏。例如同厂商的不同版本(如WINDOWS各系列)、不同厂商(MS/HP/SUN等)不同的操作系统(WINDOWS/LINUX/UNIX等),这些操作系统的性能表现本身就有所差异,如内存的分配、虚拟内存的处理、数据的读写交换、兼容稳定抗压性等等方面,利用相应的调优方法和工具,可以对此环节进行优化。

  二、硬件层面

  a)CPU:中央处理器,决定数据处理速度的核心部件,与性能表现的相关度可想而知,硬件方面具体调优方法及工具本文中不再赘述,下同!

  b)内存、缓存:数据交换的临时存储空间,它的大小形象的说就像是火车站候车室的面积,与性能的关系可想而知。比如有些程序设计的操作对内存回收设计有漏洞,导致频繁操作时内存泄漏越来越多,系统就会越来越慢。

  c)硬盘、I/O:数据存储、调用的载体,如果存储器像候车室,那这些就像是车箱的大小与节数等。

  d)网络:如果还是用坐火车为例,网络的差别就像是普通、快速、动车、磁浮等各种等级的差别,如果一个“系统”频繁需要通过火运完成,那它的性能表现和网络的相关性就不言而喻了。比如某些软件功能设计时没有考虑网络流量方面的风险,导致每次操作时网络连接次数很多,频繁调用或是数据包过大,这些都会导致在一定网络条件下产生性能问题。

  e)显卡等特殊硬件:不同软件产品应用的业务可能用到不同的专用硬件或外设,比如一个很炫的游戏对显卡的要求就会很高,当显示成为短板时死机、跳帧等异常;一个收款台的扫描、信用卡POS机如果质量或兼容性、稳定性不佳时,也可能会造成性能表现的不理想,等待诸如此类问题。

  三、业务层面

  a)业务流程重组:项目甲方在购买软件产品或系统服务前,一般会找相关专家、售前人员作一些相关的评估或“体检”,找出现有运作模式下的一些存在优化空间的错误环节或繁冗流程、制度体系等。因此在这个阶段是否对项目应用方作了足够的优化,也对未来产品上线后的应用性能表现在宏观上起着决定作用。取例来说:如果一个系统设计前没有作过这方面的优化,最后应用时需要100人操作10个步骤才能完成,通过流程重组后,从业务上只需要40个人干5个步骤就搞定了,那么没上软件前我们就能从理论上把性能表现优化80%!

  b)需求定位:与上一条阐述的类似,只是介入的阶段和角色有所区别。需求人员有时是从项目乙方发起的,主动地、有策略性的去选择一些有代表性的单位去调研软件产品的概要或详细需求,为后续的产品开发设计提供依据。在这一阶段是否有效的考虑了未来产品的性能表现,对其提出相关的设计目标,也对后续的性能表现有一定的影响。

  c)实施方案:一般当大型一些的项目合同签订完毕后,就会分期安排实施人员负现场牵头并组织双方成立实施小组团队,共同制订系统的上线、操作培训、应用方案等,并执行方案直至系统正常上线运行,项目交付。因此,这个方案制定的是否精简、高效,也直接关系了用户应用系统的性能表现。

 四、意识层面

  当今社会万事讲求以人为本,如果从软件应用系统涉及的各级人员角色的内心没有把性能表现当回事,那么一切调优最多也都是亡羊补牢而已。比如:

  a)产品经理:项目乙方产品总负责人,产品目标、市场定位、基本框架的制定者。

  b)一线人员:售前咨询、实施顾问等。

  c)需求设计:对产品具体功能设计提出明确要求的角色。

  d)代码实现:按需求定义进行产品的具体实现的角色。

  e)测试人员:对产品质量进行检测、对开发过程进行监管的角色。

  f)最终用户:系统最终的使用者、应用效果的影响者。

  对于一个软件产品来讲,只有以上这些环节的角色人等在各自的工作岗位上,真正的在意识层面上提高优化系统性能的地位,而不是把它作为功能优先实现之外的附属品,才能把系统性能优化的工作最大程度的作在前面、作的全面、作得到位!

  综上所述,我们看到了各类导致性能瓶颈的可能原因(也可以说是性能调优的入手点),下面我们用一个比较常用的鱼骨图分析法来展示一下,可能会更为清晰:

  然后我们再把这些原因按一定的规则进行分门别类,一般采用如下的二维矩阵分析的方法,按可推行的难易度和收效的影响度高低来形成四个象限,把这些问题按具体情况分布在这四个象限中,看到这些问题中哪些是我们要优先解决的,哪些是可以暂时放一放的,调优时可以借鉴这个顺序来进行。

  当然在不同的企业这四个象限中的原因分布是会相互转化的,比如在一个预算有限的私企中可能额外的硬件投资对其来说就是应该放入暂时搁置的象限,而对于财大气粗的单位中可能费用预算不是问题但是想改变他的办事流程和组织架构将是非常困难的,这时解决的优先次序也就要相应调整了。

  以上就是我对性能调优方面的一些浅见,在此声明:本人并非技术人员出身,只是在测试管理岗位上多多少少会接触到一些这方面的事情,因此本文尽量避免引述一些很专、很深的技术名词以免贻笑大方,只希望更多的测试人员都能看的明白一些,获取一些对自己有价值的东西罢了。

 
 
 
 

 

 

系统性能检测--磁盘io

 

先罗列一些工作中用得比较多的系统检测工具吧,top、ps、iostat、vmstat、free (-m)、tcpdump...

1.磁盘io相对于内存读写是巨慢无比的,数据库操作也是,所以在一些io密集的程序里面可以用内存映射、memcached来进行优化

2.就个人理解来描述一下磁盘访问

    cpu访问文件数据时,先在cpu cache和memory查找,没找到就通知io子系统去磁盘加载(数据以内存内的形式加载,一个内存页一般是4kb)(MPF,major page fault)

    如果在内存(写缓存buffer,读缓存cached)中可以找到就不用有磁盘操作了(MnPF,minor page fault)

    后者速度快多了,所以在频繁的io操作后内存中有很多空间用于缓存磁盘数据,这时候如果看到free的空间不足并不表示机器真的内存不足,当有内存需求时内核会释放这些用于磁盘缓存的内存空间,下图中cached就是缓存所占的空间,内存实际剩余是free+buffers+cached = 117+10+508。但是如果Swap used很多就表示系统内存真的很紧张,使用交换分区的速度很慢,因为它是保存在磁盘上的。

  1. www.linuxidc.com@linuxidc:~$ free -m  
  2.              total       used       free     shared    buffers     cached  
  3. Mem:          1889       1771        117          0         10        508  
  4. -/+ buffers/cache:       1252        636  
  5. Swap:         4766        282       4484  

 

3.内存页类型:

     read page:只读,包括库文件之类的

     dirty page(write page):写过需要同步到磁盘的数据,我想在fprintf之后紧接着调用fflush()之类的函数应该可以从这里写回磁盘

     anonymous page:跟磁盘文件无关,归某些进程所有,内存不足时这些数据可能掉入Swap

4.计算IOPS(每秒响应的磁盘io次数):

   假如磁盘的RPM是10000(RPM,Revolutions Per Minute,每分钟旋转圈数)

   则,磁盘的RD(Rotational Delay,旋转半圈的毫秒数)是(1/(10000/(60*1000)))/2=3

           加上磁头的DS(Disk Seek,磁头寻道的毫秒数)平均是3MS

          加上2MS延迟

    最终的IOPS是8ms,内核每次的io请求磁盘需要8ms来完成,就是10000RPM的磁盘每秒可以提供大约125次IOPS

    根据

5.实际io情况要根据程序来考量,邮件服io数据小而请求频繁,属于Random IO,流媒体服务io数据大而请求频度低,属于Sequential IO

   前者对iops要求比较高,后者对读写大量数据能力(KB per request, (rkB/s)/(r/s)或者(wkB/s)/(w/s))要求比较高

   当用top或者iostat查看发现iowait比较高时说明有io瓶颈

  1. www.linuxidc.com@linuxidc:~$ iostat -kdx 2  
  2. Linux 3.0.0-14-generic (HP)     2012年01月08日     _x86_64_    (4 CPU)  
  3.   
  4. Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util  
  5. sda               0.60     2.08    2.86    1.20    65.79    37.79    51.09     0.37   91.11   34.56  225.77  14.59   5.92  
  6.   
  7. Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util  
  8. sda               0.00     0.00    2.00    0.00    64.00     0.00    64.00     0.02    9.00    9.00    0.00   5.00   1.00  
  9.   
  10. Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util  
  11. sda               0.00     0.50    0.50    1.00     2.00     6.00    10.67     0.01    9.33    8.00   10.00   9.33   1.40  
另外一篇性能调优的,写了一点技巧

性能调优无疑是个庞大的话题,也是很多项目中非常重要的一环,性能调优的难做是众所周知的,毕竟性能调优涵盖的面实在是太多了,看看性能调优这项庞大的工程都有些什么过程,同时也看看这些过程中常见的一些做法。 (图)性能调优性能调优 性能调优 - 目标 性能调优,首先是要确定性能调优的目标是什么,如果现在应用已经满足了需求,就没必要去做性能调优了,毕竟不经过一个系统的过程,其实是无法确定你所做的性能调整是否真的调优了性能,是否没有造成应用中其他的问题,所以确定性能目标是非常重要的,在定义性能目标的时候通常这么定义的呢: 1、最大并发数 2、Quality of Service 服务的质量,在软件系统方面我们认为主要表现在请求的出错率,系统的load等。 3、最长响应时间 对于任何请求所能承受的最大响应时间。 4、TPS 每秒需要支持的最大事务数,最典型的指标是:“某页面最高需要支撑每秒7000次的访问次数”。 例如一个web系统,需要定义出来的目标是: 并发目标:最高支撑200并发; QoS:出错率须控制在万分之一,系统的load最高只能到达10; TPS:每秒完成7000次请求的处理; 最大响应时间:最长允许的响应时间为5秒。 至于请求的平均响应时间这些就不在性能调优目标中定义,因为要达到TPS的要求,响应时间是必须要达到一个级别的,而且响应时间随着高并发是会出现劣化的。 当然,还可以把性能指标定到更为细节,例如某个方法的TPS在100并发时需要达到多少。 在确定好了性能目标后,重要的就是如何来测量系统的性能了。 性能调优 - 测量系统性能 对于新系统而言,需要评估出其正式运行时的数据量的增长情况;而对于已运行的系统,则需要根据监控获取到系统的运行数据(例如高峰并发数、系统的响应速度情况、系统的load、网络流量、每类请求在总的请求中所占的百分比等)。 (图)性能调优性能调优 对于新系统而言,要评估出具体的性能相对来说稍微好做一点,因为此时系统通常较为单纯,数据量的增长也不可能是一夜之间增长的,因此基本可以按照一种正常的方法在测试环境评估出其正式运行的性能。 而对于已运行的系统而言,则较为麻烦,因为通常来讲要在测试环境中模拟正式运行环境基本是不太可能的,因此这个时候通常要采取一些模拟的方法或更高压力的方法来尽量更为准确的评估出系统的性能。 在测试系统性能时,通常可采用的方法有: 1、单元测试; 可借助单元测试来测试某个请求的性能; 2、压力测试; 压力测试无疑是测量系统性能中最常采用的方式,根据定义的性能目标对系统进行压力测试,以确定系统是否满足性能要求,同时也可以根据压力测试的结果来分析系统的瓶颈,进而进行对应的调优,可用于做压力测试的工具还是不少的,像loadrunner、jmeter等等,不过压力测试这个话题实在太大了,不在这里展开去讲了,不过我也不怎么懂就是,呵呵。 分析系统性能瓶颈 根据测量系统性能的结果,多数是可以分析出系统性能瓶颈,同时还可以结合像jvm堆栈、jprofiler、系统日志等来进行进一步的确定,另外也可以根据性能调优人员的经验,例如可以去了解开发人员是否采用了不适合的数据结构等。 简单说一个线程分析的例子: 借助kill -3 pid来获取到目前jvm的线程堆栈信息,特别需要关注的是里面wait for monitor这样的线程,这种线程是指在等待锁的线程,等待一两分钟后再次kill -3 pid,看看这些wait for monitor的线程的变化情况,这对于分析线程中是否存在不合理的竞争过高的锁的分析是非常重要的。 这一步无疑也是性能调优过程中最难的一步了,分析系统性能瓶颈这种基本只能结合实际例子来讲了,正确在后续抽取一两个例子来进行讲解。

 

个人的经验总结:

响应时间过长的解决办法:

1 清理流水表;

2 通过AWR报告找出时间占用过长的SQL;

3 判断SQL是否有索引;

4 考虑数据问题;

posted on 2014-03-22 18:15  麦兜布熊  阅读(419)  评论(0)    收藏  举报