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

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

案例分析

背景

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

问题现象

计税某接口/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. Shell系列(27)- 条件判断之两个整数比较

    两个整数之间比较 Liunx中,都是字符型,但是加了数值比较的选项,所以自动将他们转换成了整数型进行比较,不需要对这些参数进行变量转换或者重新声明 测试选项 作用 整数1 -eq 整数2 判断整数1是 ...

  2. iPhone发布内测程序的方法

    iPhone是封闭系统,不像android手机可以自行安装apk,所以iPhone手机发布内测程序相对来说复杂一些. 越狱安装 如果测试用户的机器已经越狱,那就简单了,直接打包成ipa,用户直接通过9 ...

  3. nginx负载轮询

    下面是一个可以使用nginx负载轮询,如果有一台服务器连接不通,返404,500,502,503,504,会自动切换到下一台服务器 upstream www { server 111.111.111. ...

  4. bzoj4589-Hard Nim【FWT】

    正题 题目链接:https://darkbzoj.tk/problem/4589 题目大意 求有多少个长度为\(n\)的数列满足它们都是不大于\(m\)的质数且异或和为\(0\). 解题思路 两个初始 ...

  5. 面试官问:App测试和Web测试有什么区别?

    WEB 测试和 App 测试从流程上来说,没有区别.都需要经历测试计划方案,用例设计,测试执行,缺陷管理,测试报告等相关活动. 从技术上来说,WEB 测试和 APP 测试其测试类型也基本相似,都需要进 ...

  6. yolov5实战之二维码检测

    目录 1.前沿 2.二维码数据 3.训练配置 3.1数据集设置 3.2训练参数的配置 3.3网络结构设置 3.4训练 3.5结果示例 附录:数据集下载 1.前沿 之前总结过yolov5来做皮卡丘的检测 ...

  7. 洛谷2543AHOI2005]航线规划 (树剖+线段树+割边思路)

    这个题的思路还是比较巧妙的. 首先,我们发现操作只有删除和询问两种,而删除并不好维护连通性和割边之类的信息. 所以我们不妨像WC2006水管局长那样,将询问离线,然后把操作转化成加边和询问. 然后,我 ...

  8. Golang/Java 实现无重复字符的最长子串 - LeetCode 算法

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-subs ...

  9. Python&Selenium 数据驱动测试【unittest+ddt+xml】

    一.摘要 本博文将介绍Python和Selenium做自动化测试时,基于unittest框架,借助ddt模块,使用xml文件作为测试输入. 二.xml文件 保存路径:D:\\Programs\\Pyt ...

  10. Probius+Prometheus通过API集成POD监控

    上一篇文章Probius+Kubernetes任务系统如虎添翼讲了我们把Kubernetes集成进了任务系统Probius,上线后小伙伴反馈虽然摆脱了Kubernetes-Dashboard,但还是得 ...