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

我们核心业务系统的中心服务每天承载着上千万金额、几十万笔的订单量,在数据量高速增长,公司业务节节攀升的客观因素下,以及面对即将到来的6月份世界杯的流量\交易 高峰的压力,核心业务系统性能优化以及重构显得越发重要而又迫在眉睫。

时刻准备着

在进行性能优化之前,我们做了很多的准备工作,包括 压力测试,数据库sql提取,性能监控日志数据,请求量等数据的收集,分析整体的性能瓶颈,请求量的波动特点,数据库负载波动情况。

压力测试,几个部门通力的合作,把系统在极端并发的情况下所表现出来的性能瓶颈收集出来,分析出导致系统最终无法对外提供服务的根本原因,但是这种测试我们并不是非常的专业,人手以及环境种种的限制,根据压力测试所分析出来的结果并不理想,能提供的信息很有限。

收集分析生产环境的应用数据不仅仅让我们对系统的性能有个大概的了解,也可以让我们对优化的效果进行持续的观察,便于进行快速的迭代优化,我们把一些能反映系统性能的数据收集到zabbix上,它能直观的反应出波动情况以及数据的走势情况。如:某几条反馈系统业务量的sql的执行次数,某个对核心服务请求量较大的应用的请求数,或者是应用性能监控日志的输出条数(性能较差的方法会输出一条日志)、系统的平均响应时间...

经过大约2周时间的准备工作,是时候开始下一步行动了......

优化手段

根据之前我们收集的性能数据,整理出来了一些性能较差的方法,针对性的对这些方法来选择优化手段,进行优化方案的制定。具体的优化手段有:

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

1、单条性能较差sql优化-与DBA沟通是否具有优化空间。

2、减少sql的执行的次数(循环单次改成批量(查,插,更新);能使用缓存的地方加上缓存(主要是一些查询);使用频繁的但变动不频繁的数据,整表放入到缓存中;)

3、调用链优化:同一数据由于方法重用导致的重复多次查询更改为通过参数传递;通过调整代码执行的顺序来快速返回不符合条件的业务调用;不需要进入的业务方法,提前退出,不进入。

4、非强一致性要求的幂等判断去除,更改成性能更高的 memcached 简单幂等的方式。

5、减少悲观锁的使用,改乐观锁并通过重试机制来保证业务正常处理。

6、把需要对数据库轮询的业务异步化。

以上几个手段都是针对服务端的性能优化的手段,几乎每一个我们都有广泛的用到。根据不同的使用场景来针对性的使用优化手段,进行调整。

PS:优化和重构都不能影响正常的业务(保持原业务逻辑),强烈建议通过测试用例来进行回归。

效果跟踪

代码调整之后,我们需要对效果进行持续的跟踪,看看优化的效果是否达到预期,另外谁也不能保证改了之后的性能就一定会比改之前的性能更好,尤其是sql优化,改动之后可能改变了执行计划而性能变的更加糟糕。效果的跟踪就显得非常有必要。

在优化前做的那些准备工作就派上用场了,优化之前收集的数据与优化之后的数据在图表上很直观的可以看出走势情况,同一周同一天同一个时段的 某sql执行次数的对比,请求量的对比,数据库负载的对比,平均响应时间的对比,应用内性能监控的日志条数对比...根据不同的手段来进行一些不同的数据的对比,分析优化后的效果,得出的结论之后再进行下一步的行动。

也许我们本身的系统基础搭建的不错,结构清晰,这个时候,细节才决定成败,这也就是这次性能优化为什么先从应用内部找出那些坏代码的原因。应用内部的代码细节都处理好之后,才能放手从架构上,服务调用上做更加深入的优化。下一季,将着重说说在读写分离、边界缓存 上一些经验及体会。

时间: 2024-10-07 09:40:36

后端系统性能优化(一) 改掉那些坏代码的相关文章

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

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

后端系统性能优化(二)

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

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

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

bfo-细菌觅食优化算法迁徙操作的代码

问题描述 细菌觅食优化算法迁徙操作的代码 BFO算法在迁徙部分完成: 对每个细菌随机生成一个概率值,若该值<Ped,则该细菌消亡重新生成一个新的. 目前见到的经典BFO代码的迁徙部分都是这么写的: for m=1:s if Ped>rand % % Generate random number P(1,:,1,1,1)= 50*rand(s,1)'; P(2,:,1,1,1)= .2*rand(s,1)'; %P(3,:,1,1,1)= .2*rand(s,1)'; else P(:,m,1,

百度优化的好与坏直接决定着网站整体流量和转化率

摘要: 笔者所运用的几个网站主要的优化目标都是百度,主要原因是目前百度是国内使用频率最高的搜索引擎,带来的流量也是最高的,所以百度优化的好与坏直接决定着网站整体流量和转化 笔者所运用的几个网站主要的优化目标都是百度,主要原因是目前百度是国内使用频率最高的搜索引擎,带来的流量也是最高的,所以百度优化的好与坏直接决定着网站整体流量和转化率,笔者在优化自己西安蓝田玉网的过程中针对百度优化发现以下几个方面是做百度搜索引擎非常有必要了解和长期坚持去做的事情,做好这些后期你网站在搜索引擎中会获得非常不错的表

《Python高性能编程》——2.13 在优化期间进行单元测试保持代码的正确性

2.13 在优化期间进行单元测试保持代码的正确性 如果你不对你的代码进行单元测试,那么从长远来看你可能正在损害你的生产力.Ian(脸红)十分尴尬地提到有一次他花了一整天的时间优化他的代码,因为嫌麻烦所以他禁用了单元测试,最后却发现那个显著的速度提升只是因为他破坏了需要优化的那段算法.这样的错误你一次都不要犯. 除了单元测试,你还应该坚定地考虑使用coverage.py.它会检查有哪些代码行被你的测试所覆盖并找出那些没有被覆盖的代码.这可以让你迅速知道你是否测试了你想要优化的代码,那么在优化过程中

分享我优化 JavaScript 的方法及代码

作者: Gregory Baker, GMail 软件工程师 和 Erik Arvidsson, Google Chrome 软件工程师 需要的经验: JavaScript 相关工作知识 作者: Gregory Baker, GMail 软件工程师 和 Erik Arvidsson, Google Chrome 软件工程师 需要的经验: JavaScript 相关工作知识 客户端脚本能让你的应用更加地动态和活跃, 但是浏览器对代码的解析可能造成效率问题, 而这种性能差异在客户端之间也不尽相同.

优化YouTube视频播放页面:代码变少变轻

三年前,当我还在YouTube做一名web程序员时,有一位资深的工程师发了一通牢骚,说播放视频的页面体积太大.这个页面体积已经膨胀到了高达 1.2MB,包含有数十次的请求.这个工程师公开的宣称说,"如果他们Quake能在100KB的体积下克隆出我们的页面,我们没有理由达不到这个体积!"因为我同意他的观点,并且我正在找新的任务,于是就决定接受这个挑战,让YouTube的视频播放页面的体积减到100KB以下.那天晚上从旧金山回家的火车上,我编写了一个基本的原型.我决定限制页面上的功能数,只

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

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