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

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

案例分析

背景

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

问题现象

计税某接口/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. Java基础系列(38)- 数组的使用

    数组的使用 For-Each循环 数组作方法入参 数组作返回值 For-Each循环 普通型 package array; import sun.security.util.Length; publi ...

  2. Java学习之随堂笔记系列——day04

    今日内容1.break和continue关键字以及循环嵌套    1.1 break和continue的区别?        continue表示跳过当前循环,继续执行下一次循环break表示结束整个 ...

  3. P4258-[WC2016]挑战NPC【带花树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4258 题目大意 给出\(n\)个球,\(m\)个篮筐,每个球都可以被放入一些特定的篮筐,每个球都要放,要求球的个 ...

  4. VMware vSphere 7 Update 3 下载

    请访问原文链接:https://sysin.org/blog/vmware-vsphere-7-u3/,查看最新版.原创作品,转载请保留出处. vSphere 7 Update 3 已经宣布可用,即将 ...

  5. 反调试——7——CRC检测

    反调试--7--CRC检测 CRC32: CRC的全称是循环冗余校验,作用是为了检测数据的完整性. CRC32的检测原理: 程序被编译后,代码段是固定的,因为已经被写死了. 我们在调试程序的时候,打断 ...

  6. 题解「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

    题目传送门 题目大意 给出一个长度为 \(n\) 的数组,选出一些数异或之和为 \(s1\),其余数异或之和为 \(s2\),求 \(s1+s2\) 最大时 \(s1\) 的最小值. 思路 你发现如果 ...

  7. Tomcat 源码环境搭建

    Tomcat 源码搭建 下载源码 下载地址 :https://tomcat.apache.org/download-80.cgi#8.5.35 下载之后解压缩 导入Idea 添加pom.xml文件 & ...

  8. PTA实验11-1-7 藏头诗 (15分)

    实验11-1-7 藏头诗 (15分) 本题要求编写一个解密藏头诗的程序. 输入格式: 输入为一首中文藏头诗,一共四句,每句一行.注意:一个汉字占两个字节. 输出格式: 取出每句的第一个汉字并连接在一起 ...

  9. 利用python爬取全国水雨情信息

    分析 我们没有找到接口,所以打算利用selenium来爬取. 代码 import datetime import pandas as pd from bs4 import BeautifulSoup ...

  10. Java项目中常用的的五大设计原则

    今天我们一起来聊聊关于设计原则相关的知识点. SOLID五大原则是什么 SRP 单一责任原则 单一责任原则,从名字上我们就能比较好的去理解它.这项原则主张一个对象只专注于单个方面的逻辑,强调了职责的专 ...