后端系统性能优化(二)

今天,来说说 什么样的代码才是坏代码,怎么来找出这些坏代码。

不少猿在吐槽烂代码。但是我们今天说的不是烂代码,坏代码只需要改动很小的一部分,把它的坏的地方改掉,他依然是好代码 。而烂代码,只有重新写过了,才会让你觉得浑身轻松,压力瞬间释放,而且在写之前你还得花90%的时间去看懂它。所以我说改掉坏代码,因为只有坏代码才能改,而烂代码是用来看。我很庆幸我在的这个团队的代码驾驭能力都还不错,很少有烂代码。但为什么还会有坏代码?坏代码不是与生俱来的,他在刚上线的时候也许也是好代码,慢慢的变坏了,没关系,我们把它找出来。

找出坏代码,我们有两个阶段

第一个阶段是我们应用无法对自身的性能进行监控,只能通过DB提供性能较差以及执行频率过高的sql。DBA给你找出那些高峰期太过消耗资源的sql,这些sql可以大致的让你找出来是哪个功能再具体到哪个方法。博主负责的项目使用了mybatis框架(用hibernate的,我就只能 呵呵 了),如果有sql,我们能很快的定位到具体的方法,然后再进一步的查看代码,了解业务,并修改影响性能的代码。但是这种通过sql定位的方法并不全面,只能找出单条具有性能问题sql所在的方法, sql本身的性能是以条为单位,而我们的方法往往包含多个sql。如:2个每个只需要250ms的sql,在同一个方法里面,那就要消耗500ms,这种情况,sql性能上没有较大的问题,通过DB是很难找出来的。一些有性能问题的单条sql(查询比较多)以及执行频率较高的sql,DBA会比较容易提供。而且这种sql性能的问题,优化的手段非常有限,如增加一些条件或者hint的方式强制走索引,DBA绑定执行计划降低sql的消耗,比较复杂的查询的sql拆分成单表查询,增加字段进行关联属性的冗余,数据库中的字典值直接放入到内存中,尽量减少大表之间的关联查询......详细的优化手段的使用场景,我在下一节中再详细的介绍。

第二阶段是,建立应用内部的自我监控,我们使用spring的aop实现了一个简单高效的监控功能,这个监控功能可以切入到各个层,如service,manager,dao等等,切入之后,每一层中的方法所消耗的时间都会放入到内存中,方法调用结束后,如果超出预先设定的执行时间如 500ms 预警线,就会将各个调用执行的方法的时间打印在一个日志中,这非常有用,而且实现的简单优雅,基本能满足应用的自我性能监控所需要的数据。但它也是有缺点的,如果预警线设置的过低,对IO的消耗还是有点小严重。一般情况下,性能优化的预警线我们设置的时间为500ms。这样,执行时间超过500ms的方法都会收集在日志中。

使用应用内部的自我监控,还有一个非常明显的好处,在系统平均响应时间突然变慢的时候,我们打开这个日志可以很快定位出到底是什么问题。几个月前在我们的应用中,使用了一个叫 hazelcast的缓存组件,jvm毫无征兆的OOM,并由我们的运维系统自动重启,我们打开这个日志,定位到是hazelcast操作超时造成,很快,我们就有了下一步的动作。

有了性能监控的日志文件之后,我们就有了基础数据,通过脚本每天分析出来性能最差的top10和超过500ms执行次数的top10。得到类似如下的数据

请求次数、平均响应时间、请求方法名

238     1346.82     BServiceImpl.createA

184     6750.17     AServiceImpl.queryA

159     2620.29     CServiceImpl.getC

这个简单有效,能有如此多的好处的小东西,到底是怎么实现的?

它记录下来的文件的格式大概是:

2014-05-04 23:12:00 [550,100%,0] A.createA()

----------------------------[10,50%,5] B.queryB()

---------------------------------[5,50%,10] C.queryC()

----------------------------[20,100%,30] C.queryD();

前面的东西都很好理解,方括号的东西的意思是  第一个数字 方法执行的总时间,第二个百分比数字,方法执行占上一层方法调用总耗时百分比,第三个数字的意思是时间流,从0开始,执行到哪个方法的时候耗时多少。

这种记录的方式让我们很快的就能找到对应的坏代码的地方。

总之,只有对自身的应用有所了解,才能准确的找到那些坏的代码。找到了他们,性能优化就成功了一半。

还没有实现自己应用内部监控的,赶紧写一个,让坏代码无处可藏。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/project/

时间: 2025-01-20 22:24:05

后端系统性能优化(二)的相关文章

后端系统性能优化(三) sql优化

昨天我为大家介绍了如何去发现坏代码,如何优雅的去实现一个应用内的监控程序.当然发现了坏代码之后,我们还是要想办法来改掉它,也许它会很顽固.今天说说性能优化的一个非常重要的部分:sql的优化 今天要说的不是怎么来写优秀的,性能好的sql,这些DBA们会比我更加专业.在我们公司,凡是DBA能优化的sql,DBA都在内部消化了,需要反馈给我们的,说明他们可能也束手无策.也是我们该出手的时候了. insert,update这类型的sql,性能一般不会太慢,我把这其中可能出现的问题糅合在一个例子中,组成这

后端系统性能优化(一) 改掉那些坏代码

我们核心业务系统的中心服务每天承载着上千万金额.几十万笔的订单量,在数据量高速增长,公司业务节节攀升的客观因素下,以及面对即将到来的6月份世界杯的流量\交易 高峰的压力,核心业务系统性能优化以及重构显得越发重要而又迫在眉睫. 时刻准备着 在进行性能优化之前,我们做了很多的准备工作,包括 压力测试,数据库sql提取,性能监控日志数据,请求量等数据的收集,分析整体的性能瓶颈,请求量的波动特点,数据库负载波动情况. 压力测试,几个部门通力的合作,把系统在极端并发的情况下所表现出来的性能瓶颈收集出来,分

Buffer cache 的调整与优化(二)

--******************************** -- Buffer cache 的调整与优化(二) --********************************         Buffer cache 实际上细分为多个不同的Buffer cache,如keep pool,recycle pool,default pool,下面描述不同buffer cache的使用.     有关Buffer cache 的总体描述,请参考:Buffer cache 的调整与优化(

DB2数据库应用系统性能优化深入探究

DB2是一种高性能的大型关系数据库管理系统,广泛的应用在客户/服务器体系结构中.评价系统性能优化的标准有:吞吐量.响应时间.并行能力等. 设计数据库 1.熟悉业务系统 对业务系统的熟悉程度对整个数据库系统的性能有很大影响,一个对业务不熟悉的设计人员,尽管有丰富的数据库知识,也很难设计出性能最佳的数据库应用系统. 2.规范化与非规范化 数据库被规范化后,减少了数据冗余,数据量变小,数据行变窄.这样DB2的每一页可以包括更多行,那么每一区里的数据量更多,从而加速表的扫描,改进了单个表的查询性能.但是

用XML优化二次检索

xml|优化 在搜索引擎的设计以及类似的软件功能设计中,一个必不可少的功能就是:对已有搜索结果的二次检索.如果检索的数据集是静态数据(例如存放在数据库中),通常的做法是在已有的检索条件的基础上,动态加入新的约束条件.但是重新构造数据检索的约束条件,往往需要用户同服务器再次交互,重新下载所需数据集合并输出.如果能在客户端对已经下载的数据集合进行二次检索,将极大地减轻Web服务器以及数据库服务器的负担. XML能够很大程度地满足以上需求.它将数据内容本身与数据显示格式独立开来,分别处理.这样,如果需

【阿里在线技术峰会】郭东白:基于大数据的全球电商系统性能优化

本文根据郭东白在首届阿里巴巴在线技术峰会上的分享整理而成.他首先介绍了AliExpress电商系统的理论基础,通过页面间跳出率的计算引出了全栈优化的思路.然后,他介绍了AliExpress平台的设计思路和性能优化过程.紧接着,他分享了AliExpress使用过的几个有效的优化策略:动态加速.静态化+ESI.元素合并请求.CDN调度优化等.最后,他用实例展示了性能优化带来的结果,并对架构设计的过程提出了几点思考和总结. 直播视频:点此进入 PDF下载:点此进入 以下为整理内容. 整个系统的理论基础

中文锐推榜优化·二

郑昀@玩聚RT 20090812   一.Twitter 搜索索引的问题     由于锐推榜利用的是 Twitter Search API 入口,所以是否能足够全地找到所有中文 Retweets(又名:锐推/RT/转推) ,很多时候取决于 twitter 自己的索引是否能正确地识别 tweet 所采用的语言.     今年曾经有一度,长达一个月的时间,Twitter 的亚洲语言索引全部乱掉,日文.泰语.韩文.中文等语言写就的 Tweets 混乱地分布在不同国家语言的索引中,而日文和中文的索引几乎

怎么做系统性能优化?

问题描述 大家好,我现在遇到了一个关于优化性能的问题,希望大家能帮帮忙.我做了一个派单管理方面的系统,现在系统基本上是做完了,只是性能有点不敢恭维...我也不晓得是我程序的原因,还是服务器太差的原因...一般的一个操作,瞬间能使CPU达到80%,而且只是我一个人测试...要是出现并发我都不晓得该出现什么情况了...我自己是才出学校不久,这个算是第一个商业性的开发吧,最开始,公司的人就给了我一个需求,让我自己做数据库,设计,界面...反正是走通,虽然在学校也做过,但是在设计方面现在觉得有好多地方是

阿里资深技术总监:基于大数据的全球电商系统性能优化

本文首先介绍AliExpress电商系统的理论基础,通过页面间跳出率的计算引出全栈优化的思路.然后,介绍AliExpress平台的设计思路和性能优化过程,以及AliExpress使用过的几个有效的优化策略:动态加速.静态化+ESI.元素合并请求.CDN调度优化等.最后,用实例展示了性能优化带来的结果,并对架构设计的过程提出了几点思考和总结. 1整个系统的理论基础 这张图代表流量分布和跳出率的关系.一个用户放弃使用一个网站或者APP的行为叫做跳出.上图中,横轴代表延迟区间,纵轴代表流量分布.绿色的