上一篇介绍了性能问题分析的诊断的基本过程,还没看过的可以先看下【性能测试】常见的性能问题分析思路-道与术,精炼总结下来就是,当遇到性能问题的时候,首先分析现场,然后根据现象去查找对应的可能原因,在通过对应的方法和工具去定位问题。

本篇来给出个具体实际工作中的案例,以及会简单说一下一种性能分析工具的使用技巧,加深这方面的认知和学习。

案例分析

背景

对某个项目(内部项目脱敏)进行压测的时候出现了内存泄漏的问题,经过发现问题-分析现象和过程-定位问题,排查出根因是定时任务引发的内存泄漏,因此把整个分析过程分享出来,做个类型性能缺陷的参考,也作为分析过程的一个实际操作案例。

问题现象

计税某接口/finance-xxxxx-center/xxxxx/incomeCalculate接口,压测过程中,通过监控发现,服务器的CPU每隔一段时间有规律波动,内存由60%上涨至85%,更奇怪的是当停止压测后,CPU依旧有规律的尖刺波动,服务器内存占用率一直居高在85%没有回收。

分析过程

从上述CPU占用图上看,一开始的思路是以为MQ消息消费导致的,去阿里云观察MQ消费情况。

从两个方面验证:第一让研发去review代码,是不是有定时任务在执行检查执行频率,第二,我通过打印CPU尖刺时间段线程dump,查看尖刺时CPU占用的线程,定位到引起CPU尖刺的就是定时任务线程和GC回收线程。

到这里之后还有一个点需要分析,那就是服务器的内存为什么会持续上升?上升之后为什么没回收?需要确认内存这个现象是不是导致CPU尖刺的定时任务引起。

首先,去应用服务器上看了GC情况,发现没有尖刺的时候YGC几乎没有,但是当CPU尖刺时间段,就有频繁的YGC,除了单次GC时间730ms不正常,其他的算正常。

所以需要进一步找内存上涨,内存不释放原因。

打印压测停止后存活对象的内存堆dump,通过mat工具分析。

从工具上看有三处疑似内存泄漏,主要关注suspect1,通过GCroot分析。

进一步确认是quartz引起的 对象不释放。

接下来,我们验证猜想,定时任务5分钟执行一次,而且执行完一次可能不只5分钟。

分两步走,第一去看服务器日志,当出现CPU尖刺的时候,观察job跑批的时间,发现单次job启动后,由于数据量大,在5分钟之内无法跑完,日志一直刷,出现任务浪打浪现象

到这里基本可以确定是定时任务造成的,那个数量是太大了,一次性捞出来的数据太多导致5分钟之内执行不完任务,然后5分钟后job又重新启动,形成job日志一直在刷,然后对象的引用无法清除,导致大对象占用内存不能释放。

接下来我们在通过再次压测验证,修改定时任务频率为1个小时,重启服务器,继续压测计税接口,发现CPU没有尖刺出现,内存也没有明显上升,然后把定时任务频率再改回5分钟,发现跑任务的时候,内存又继续上去了,而且一直维持在85%的高位,到此验证完毕。

ARTHAS

本工具是阿里开源的Java诊断工具,很多研发和性能分析同学使用,是一把通过探测系统深度问题的利器。由于本篇不是讲解此工具,安装,使用的就略了,敢兴趣的参考Arthas(阿尔萨斯)吧[参考-1],这里给一些交互截图和在性能测试问题分享一些使用技巧

如了解系统状态信息

如查看Profiler/FlameGraph/火焰图

性能分析案例一些使用方法技巧

  • 先用thread -n 10 找出线程堆栈中程序运行的类与方法

  • Thread –b 检测是否有线程锁

  • 接着sc -d com.poizon.infr.user.core.service.util.HttpUtil.doHttpPost,查找类

  • 然后 sm -d com.poizon.infr.user.core.service.util.HttpUtil包下的方法

  • 再然后trace com.poizon.infr.user.core.service.util.HttpUtil doHttpPost  '#cost > 10'方法耗时

  • trace com.poizon.infr.user.core.service.controller.UnionLoginController unionLogin  '#cost > 50' -n 3

  • jad --source-only com.poizon.infr.user.core.service.util.HttpUtil.doHttpPost ,反编译出怀疑的源代码进行分析

  • profiler -e cpu -d 300 --format svg start 火焰图

【注解&参考】

[参考-1] https://arthas.aliyun.com/doc/

原稿分享:禧子

优化编辑:大奇

【性能测试】常见的性能问题分析思路(二)案例&技巧的更多相关文章

  1. TVM性能评估分析(二)

    TVM性能评估分析(二) Figure 1.  A bird's eye view of the µTVM + AutoTVM infrastructure Figure 2.  A standard ...

  2. jmeter性能测试重要指标以及性能结果分析

    一.Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告 如果大家都是做Web应用的性能测试,例如只有一个登录的请求,那么在Aggregate Re ...

  3. 性能测试——记XX银行保全项目性能问题分析优化

    记XX银行保全项目性能问题分析优化 数据库问题也许是大部分性能问题的关注点,但是JAVA应用与数据库交互的关节,JDBC 就像是我们人体的上半身跟下半身的腰椎,支持上半身,协调下半身运动的重要支撑点. ...

  4. Linux性能监控分析命令(二)—sar命令介绍

    性能监控分析的命令包括如下: 1.vmstat 2.sar 3.iostat 4.top 5.free 6.uptime 7.netstat 8.ps 9.strace 10.lsof ======= ...

  5. 【转】postgreSQL​之autovacuum性能问题分析(二)

    如上篇文章提到,如果出现了autovacuum的问题,那么这可能是个悲伤的故事.怎么解决? 笔者觉得可以从如下几个方面着手去考虑解决问题,可以避免一些坑.1) 持续观察,是不是autovacuum问题 ...

  6. Android App性能评测分析-流畅度篇

    1.前言 在手机App竞争越来越激烈的今天,Android App的各项性能特别是流畅度不如IOS,安卓基于java虚拟机运行,触控响应的延迟和卡顿比IOS系统严重得多.一些下拉上滑.双指缩放快速打字 ...

  7. Java应用性能瓶颈分析思路

    1 问题描述 因产品架构的复杂性,可能会导致性能问题的因素有很多.根据部署架构,大致的可以分为应用端瓶颈.数据库端瓶颈.环境瓶颈三大类.可以根据瓶颈的不同部位,选择相应的跟踪工具进行跟踪分析. 应用层 ...

  8. list 、set 、map 粗浅性能对比分析

    list .set .map 粗浅性能对比分析   不知道有多少同学和我一样,工作五年了还没有仔细看过list.set的源码,一直停留在老师教导的:"LinkedList插入性能比Array ...

  9. enode框架step by step之框架要实现的目标的分析思路剖析1

    enode框架step by step之框架要实现的目标的分析思路剖析1 enode框架系列step by step文章系列索引: 分享一个基于DDD以及事件驱动架构(EDA)的应用开发框架enode ...

随机推荐

  1. TP5更新数据成功,但判断结果不符

    thinkphp的CURD中,使用save方法时会出现一个奇怪的问题,即如果数据没有更新(与原数据相同),返回值判断为false.其实很久之前就发现了这个问题,一度以为是官方代码的问题,但是一直拖延到 ...

  2. Shell系列(20)- 字符截取命令cut

    前言 grep是按行提取:cut默认是通过制表符,按列提取,不能识别用空格作为分隔符 语法 cut [选项] [文件] 选项 -f :列号,截取哪几列数据,多个列号用逗号隔开:列与列之间默认用TAB制 ...

  3. python线程threading

    线程示例: import threading import time # 唱歌任务 def sing(): # 扩展: 获取当前线程 # print("sing当前执行的线程为:" ...

  4. 『GoLang』函数

    函数介绍 Go语言函数基本组成包括: 关键字func 函数名 参数列表 返回值 函数体 返回语句 语法如下: func 函数名(参数列表) (返回值列表) { // 函数体 return } 除了ma ...

  5. 系统设计实践(03)- Instagram社交服务

    前言 系统设计实践篇的文章将会根据<系统设计面试的万金油>为前置模板,讲解数十个常见系统的设计思路. 前置阅读: <系统设计面试的万金油> 系统设计实践(01) - 短链服务 ...

  6. P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

    正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 \(T\)组询问,给出\(n,k\)求 \[\sum_{i=0}^{k}\binom{n}{i} ...

  7. Notepad++离线安装使用Markdown插件

    1.介绍 MarkdownViewerPlusPlus是Notepad++的Markdown插件, 这个Markdown插件可以在Notepad++中实时动态渲染, 可以同步查看使用Markdown的 ...

  8. 联表多字段update更新语句

    前言 最近需要写联表多字段update更新语句,发现不同的数据库,SQL语法也不一样,正好我这里有MySQL.Oracle.PgSQL三种数据库环境,分别练习.实操这三种数据库的联表update语句 ...

  9. 腾讯首个CNCF沙箱开源项目

    作者 SuperEdge开发者.腾讯云容器产品中心边缘计算团队.腾讯开源生态管理协会 SuperEdge 进入 CNCF 沙箱 2021 年 9 月 14 日,云原生分布式边缘容器系统 SuperEd ...

  10. Linux命令行:free

                  total        used        free      shared  buff/cache   availableMem:           251G   ...