后端系统性能优化(第一季 2 找出坏代码)

昨天开了个头

  博文链接:后端系统性能优化(第一季:改掉那些坏代码)

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

  不少猿在吐槽烂代码。但是我们今天说的不是烂代码,坏代码只需要改动很小的一部分,把它的坏的地方改掉,他依然是好代码
。而烂代码,只有重新写过了,才会让你觉得浑身轻松,压力瞬间释放,而且在写之前你还得花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

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

 我在之前的博文中有介绍  spring
AOP的方式监控方法的执行时间

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

 

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开始,执行到哪个方法的时候耗时多少。

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

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

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

时间: 2024-10-12 17:07:07

后端系统性能优化(第一季 2 找出坏代码)的相关文章

后端系统性能优化(第一季 3 sql优化)

昨天的博文介绍了如何去发现坏代码,如何优雅的去实现一个应用内的监控程序. 博文地址:后端系统性能优化(第一季 2 找出坏代码) 当然发现了坏代码之后,我们还是要想办法来改掉它,也许它会很顽固.今天说说性能优化的一个非常重要的部分:sql的优化 今天要说的不是怎么来写优秀的,性能好的sql,这些DBA们会比我更加专业.在我们公司,凡是DBA能优化的sql,DBA都在内部消化了,需要反馈给我们的,说明他们可能也束手无策.也是我们该出手的时候了. insert,update这类型的sql,性能一般不会

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

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

今年第一季全球PC出貨量同比下降5.2%

市場調研公司Gartner上周發佈報告稱,隨著企業支出的下滑,今年第一季全球PC出貨量同比下降5.2%.英特爾稱,第一季筆記本晶片出貨量同比增長3%,但是筆記本晶片的平均銷售價格下降了3%:臺式機芯片的出貨量同比下降16%,但平均銷售價格增長2%.英特爾在第一季財報中首次將陷入虧損的移動晶片業務併入主要PC處理器部門的業績.受到移動晶片業務的拖累,英特爾PC晶片部門的業績利潤不及伺服器晶片業務,後者的營收增至36.8億美元,營業利潤增至17億美元.英特爾稱,第一季平板電腦處理器出貨量為700萬顆

称3次,找出坏鸡蛋

有十二个鸡蛋,其中有一个是坏的(重量与其余鸡蛋不同),现要求用天平称三次,称出坏的那个鸡蛋 准备工作:将十二个鸡蛋编号,1.2.3......11.12.分为三组,1.2.3.4为第一组,5.6.7.8为第二组,9.10.11.12为第三组.其中,Time = ?表示这是第?次称. 分析:取第一组.第二组,分别放置在天平两端,两种情况:平衡,不平衡(Time = 1) ♦ if (平衡):这8个鸡蛋都是好的,取3个(1.2.3)出来,和剩下4个中的任意3个(假设是9.10.11),将这两组分别放

找出java代码中占用cpu过多问题

当有java进程占用过多CPU时,可能是逻辑出现的问题.如何排查问题所在呢? 1. 使用top工具列出所有进程,shitf + p 列出CPU占用率较高进程 2. 找到问题进程号,使用top -H -p pid列出进程的所有线程 3. 然后shift + p 按照CPU使用率排序 4. 找出问题进程号,使用python打印出其16进制值,print("0x" % ppid),比如是:76a3 5. jstack pid > t.dat 记录线程堆栈,vi 打开找到76a3的线程号

王家林谈Spark性能优化第一季!(DT大数据梦工厂)

内容: 1.Spark性能优化需要思考的基本问题: 2.CPU和Memory: 3.并行度和Task: 4.网络: ==========王家林每日大数据语录============ 王家林每日大数据语录Spark篇0080(2016.1.26于深圳):如果Spark中CPU的使用率不够高,可以考虑为当前的程序分配更多的Executor,或者增加更多的Worker实例来充分的使用多核的潜能. 王家林每日大数据语录Spark篇0079(2016.1.26于深圳):适当设置Partition分片数是非

JVM调优之jstack找出最耗cpu的线程并定位代码

一.jstack使用总结 分析java进程,cpu占用高的问题 { 1.找到cpu占用高的进程pid 在top中,按组合键: shift + h ,会按cpu使用从高到低排序2.找到cpu占用高的线程pid top -Hp cpu高的进程pid, shift +h 查找最高线程,显示线程3.jstack 进程的pid | grep -A 线程pid的十六进制 #分析Java应用程序线程堆栈dump出来 printf "%x\n" cpu高的线程pid ==> 得到十六进制 pyt

Windows找出占用端口的进程

第一步:找出监听指定端口的进程号: C:\> netstat -ao | findstr 443  TCP    0.0.0.0:443            Sean-NotePC:0          LISTENING       12776 最后一个就是进程号,12776. 第二步:找出进程号对应的进程: C:\> tasklist /fi "PID eq 3040" 映像名称 PID 会话名 会话# 内存使用 ========================= =

小球称重问题~通过三次称重找出十二个小球质量不一样的小球,并判断小球轻重

小球称重问题 一.问题描述 十二个小球进行称重,只能称三次,找出不一样的小球,并判断异球的轻重. 二.问题分析 将12个小球分成三组,将小球分别标号为1到12,分组情况如下: A组小球:1,2,3,4: B组小球:5,6,7,8: C组小球:9,10,11,12 情况分析:每个小球都有两种可能,一共会有24种判断结果. 三.算法分析 第一次,先将1-4号放在左边,5-8号放在右边. 1.如果右重则坏球在1-8号. 第二次将2-4号拿掉,将6-8号从右边移到左边,把9-11号放 在右边.就是说,把