来源:r6d.cn/ZazN

上周五,发布前一周的服务器小动荡????

事情回顾

上周五,通过Grafana监控,线上环境突然出现CPU和内存飙升的情况:

但是看到网络输入和输入流量都不是很高,所以网站被别人攻击的概率不高,后来服务器负荷居高不下,只能保存dump文件进行分析,并一台一台服务器进行重新启动(还好大家周五下班了)

通过日志分析

既然服务器在某个时间点出现了高负荷,于是就先去找一开始出现问题的服务器,去找耗时的服务,例如我当时去找数据库耗时的服务,由于上周的日志已经被刷掉,于是我大致描述一下:

[admin@xxx xxxyyyy]$ grep '15:14:' common-dal-digest.log |  grep -E '[0-9]{4,}ms'
2018-08-25 15:14:21,656 - [(xxxxMapper,getXXXListByParams,Y,1089ms)](traceId=5da451277e14418abf5eea18fd2b61bf)

上述语句是查询在15:14那一分钟内,在common-dal-digest.log文件中,耗时超过1000ms的SQL服务(我上周查的是耗时超过10秒的服务)。

通过traceId去查Nginx保存的访问日志,定位在该时间点内,分发到该服务器上的用户请求。还有根据该traceId,定位到整个调用流程所使用到的服务,发现的确十分耗时…

于是拿到了该请求具体信息,包括用户的登录手机号码,因为这个时候,其它几台服务器也出现了CPU和内存负载升高,于是根据手机号查询了其它几台服务器的访问日志,发现同一个请求,该用户也调用了很多次…

使用mat进行dump文件分析

通过mat工具对dump文件进行分析,调查是什么请求占用了大内存:

观察了该对象的引用树,右键选择【class_ reference】,查看对象列表,和观察GC日志,定位到具体的对象信息。

通过日志以及dump文件,都指向了某个文件导出接口,接着在代码中分析该接口具体调用链路,发现导出的数据很多,而且老代码进行计算的逻辑嵌套了很多for循环,计算效率低。

查询了该用户在这个接口的所调用的数据量,需要查询三个表,然后for循环中大概会计算个100w+次,导致阻塞了其它请求,线上的服务器CPU和内存使用情况一直飙升。


代码进行性能优化

在看到该业务在git提交记录是我上一年实习期写的时候,我的内心是崩溃的,当时对业务不熟悉,直接循环调用了老代码,而且也没有测试过这么大的数据量,所以GG了。

然后我就开始做代码性能优化,首先仔细梳理了一下整个业务流程,通过增加SQL查询条件,减少数据库IO和查询数据量,优化判断条件,减少for嵌套、循环次数和计算量。

通过jvisualVM进行对比

对比新老代码所占用的CPU和内存状态

优化前:

优化后:

通过上述优化之后,计算1w条数据量进行导出,在老代码需要48s,新代码也要8s,不过这是大数据量的情况下,实际用户的数据没有这么多,所以基本上满足了线上99%的用户使用。

当然,由于这些数据是本地开发环境新增加的,与出现OOM问题的用户数据量还有些差别,但通过优化后的代码,已经在数据库查询的时候就过滤掉很多无效的数据,在for循环计算前也加了过滤条件,所以真正计算起来起来就降低了很多计算量。

恩,自己优化好了,还要等测试爸爸们测试后才敢上线,这次要疯狂造数据


开发注意点

在开发一开始的时候,都没有考虑到性能问题,想着满足需求就完成任务,但数据量一大起来,就有可能出现这些OOM问题,所以以后开发时,需要考虑一下几点:

  • 梳理设计流程

  • 考虑是否有性能问题

  • 与产品经理商量控制查询条件,减少查询的范围

  • 与数据库交互时,减少无效的查询,合并查询和合并更新操作

  • 减少for循环,尤其注意for循环嵌套问题!

  • 调用老代码要看注意=-=


吐槽

果然每次看之前写的代码,都有种要si要si的感觉.


往期推荐

不要再用main方法测试代码性能了,用这款JDK自带工具

Socket粘包问题的3种解决方案,最后一种最完美!

MySQL为Null会导致5个问题,个个致命!

关注我,每天陪你进步一点点!

复盘线上的一次OOM和性能优化!相关推荐

  1. 线上CPU100%及应用OOM的排查和解决过程

    点击上方☝,轻松关注! 及时获取有趣有料的技术文章 " 最近工作又遇到几次线上告警的问题,排查基本上就是cup100%以及内存OOM问题,再分享一下之前遇到这类问题排查的一些思路和过程,希望 ...

  2. 线上应用遇到了oom killer

    概述 在2019年10月21日,公司的一个后台应用中[生成营销活动数据]的操作,执行到一半突然不执行了,导致部分活动数据没生成,运营人员对此怨声载道的,因为影响了他们的运营效率了,要求我们技术人员尽快 ...

  3. 【线上分享】高性能视频推理引擎优化

    深度学习算法处理的中间数据量都非常庞大,有关分析工具表明,推理引擎的运行时间中,90%的消耗都是在做数据访问.内存总线带宽和cache效率成为了影响引擎的主要因素. 3月7日 19:30,我们邀请到了 ...

  4. 线上故障等级和处理规范,看阿里测试工程师如何拿捏

    一.前言 对于每一个测试人员来说,软件测试过程中有一个四字成语,真的是如噩梦一般的存在,会在你不注意的时候,就突然蹦出来,劳你筋骨.空乏你身.乱你心神.行拂乱你所为,那就是--线上故障. 线上故障顾名 ...

  5. 帮我写一篇,3000字的关于对外汉语线上教学平台的论文

    我很高兴为您提供帮助,这是一篇关于对外汉语线上教学平台的论文,以下是3000字的文章内容:随着社会的发展,人们越来越多地通过线上教学来学习语言.在这种情况下,线上汉语教学平台受到了越来越多的关注.本文 ...

  6. 线上房源推荐在房地产行业的应用实践

    采用协同过滤,进行客户线上房源的推荐,算法的核心是根据用户-物品矩阵,进行交叉推荐,其目的根据客户行为的数据,把客户最感兴趣但未访问过的房源推荐给客户. 1.1     ALS算法原理 注:参考文献: ...

  7. 沐歌保健院线上预约按摩系统的设计与实现(论文+源码)_kaic

    目    录 摘  要 第一章  绪论 1.1项目研究的背景 1.2开发意义 1.3项目研究现状及内容 1.4论文结构 第二章  开发技术介绍 2.1JSP技术 2.2Eclipse环境配置 2.3M ...

  8. SSM摄影服务线上选购预约系统 计算机毕设源码83784

    摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理.在现实运用中,应用软件的工作规则和开发步骤,采用SSM技术建设摄影服务线 ...

  9. iOS性能优化实践:头条抖音如何实现OOM崩溃率下降50%+

    iOS OOM 崩溃在生产环境中的归因一直是困扰业界已久的疑难问题,字节跳动旗下的头条.抖音等产品也面临同样的问题. 在字节跳动性能与稳定性保障团队的研发实践中,我们自研了一款基于内存快照技术并且可应 ...

最新文章

  1. HTML:减少页面加载时间的方法
  2. 每日一皮:没想到现实比赛里也能和拳皇一样蓄力攻击...
  3. OpenGL编程指南5:学习绘制不同风格的曲线
  4. Shrio 自定义算法登录认证
  5. MyBatis查询结果resultType返回值类型详细介绍
  6. python统计学书籍推荐_一位90后统计学硕士的深悟:统计其实有门道!AI还能这样学!(精荐40本书+20视频资源...
  7. 基于DDD的.NET开发框架 - ABP依赖注入
  8. 关于如何学好前端开发,你需要知道的事!
  9. 【渝粤教育】国家开放大学2018年春季 0161-21T教师职业道德 参考试题
  10. ssh 多台服务器之间连接(linux)
  11. MATLAB绘制折线图和散点图
  12. 海康摄像头车牌识别和顶拍同步抓拍图片
  13. html表格制作练习
  14. 视频的传输方式【转】
  15. 方维直播源码无BUG修复最新版!
  16. QQ认证空间已升级QQ公众空间,申请地址是?
  17. linux拷贝文件夹内所有,linux拷贝文件夹下所有文件
  18. 『DL笔记』预训练(pre-training/trained)与微调(fine tuning)
  19. G1D5-Intriguing properties of neural networks
  20. packet tracer 学习ARP报文请求

热门文章

  1. python读取字典元素笔记_Python 学习笔记 - 字典
  2. 运行shell脚本报错:“syntax error near unexpected token fi 的解决方法
  3. 用户权限sudo、suid、sgid以及facl等
  4. Docker使用-构建MySQL
  5. 广度优先搜索练习之神奇的电梯
  6. Android_内存泄露
  7. Java 使用 POI 操作 Excel
  8. 网页中查看pdf文档
  9. JavaSE基础知识学习-----泛型
  10. 【BO】WEBI文件打开时提示Illegal access错误