qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

性能调优之我见

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

  一、软件层面

  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)最终用户:系统最终的使用者、应用效果的影响者。

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

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

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

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

posted on 2011-11-25 18:07 顺其自然EVO 阅读(167) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜