2019-07-24 实战火焰图分析CPU使用率解决JAVA应用线上性能问题

简介: 实战FlameGraph火焰图分析线上JAVA应用的CPU使用率异常

背景

业务上一个新业务上线,发现CPU使用率较高,我们的业务特点一般是IO密集型,所以一般呈现CPU使用率较低,但是QPS较高的特点,所以对这个特殊的服务进行性能分析,以下是分析过程。

网络性能分析

  • 新应用上线,发现CPU较高,如图所示
  • 从cpu使用率的细节发现%si中断使用率集中在cpu0上,查看中断类型
  • 发现硬中断的处理集中在CPU0上,推断网卡不支持多队列特性
  • 果然推断正确,然后决定找两台网卡支持多队列的机器对比性能
  • 从监控中可以看到,两种机型在P999的接口响应延迟上相差一倍

CPU使用率还没分析

跑题了,前面分析CPU的过程中无意间发现了中断不平均的问题,但并不是我们CPU使用率高的原因,CPU主要还是%us高,回来分析CPU使用率,由于代码不是本人所写,不会直接去分析代码,那样无异于大海捞针,拿出珍藏的perf大法,生成火焰图分析。

CPU火焰图的生成方法参考前面的文章:

生成的火焰图如下:
http://oss.zrbcool.top/picgo/ad-data-web03.svg

瓶颈点1

CoohuaAnalytics$KafkaConsumer:::send方法中Gzip压缩占比较高
已经定位到方法级别,再看代码就快速很多,直接找到具体位置,找到第一个消耗大户:Gzip压缩

瓶颈点2

展开2这个波峰,查看到这个getOurStackTrace方法占用了大比例的CPU,怀疑代码里面频繁用丢异常的方式获取当前代码栈

直接看代码

果然如推断,找到第二个CPU消耗大户:new Exception().getStackTrace()

瓶颈点3

展开波峰3,可以看到是这个Gzip解压缩

定位到具体的代码,可以看到对每个请求的参数进行了gzip解压缩

总结

到此我们就找到了这个应用的三个主要的CPU消耗点,通过火焰图,我们很方便的可以分析到具体代码级别的CPU使用情况,完全可以将应用当做一个黑盒来分析,分析性能之前,我对代码完全不了解的情况下分析到了CPU使用率的性能瓶颈。

后续: 等过几天优化完成后再行对比CPU使用率情况。

目录
相关文章
|
8天前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
37 1
|
9天前
|
消息中间件 Java 应用服务中间件
我是如何通过火焰图分析让应用CPU占用下降近20%的
分享作者在使用Arthas火焰图工具进行Java应用性能分析和优化的经验。
|
14天前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
41 0
|
18天前
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
26 0
|
8天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
9 1
|
8天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
21 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
11天前
|
Java
如何从Java字节码角度分析问题|8月更文挑战
如何从Java字节码角度分析问题|8月更文挑战
|
17天前
|
安全 网络协议 Java
Java反序列化漏洞与URLDNS利用链分析
Java反序列化漏洞与URLDNS利用链分析
35 3
|
20天前
|
存储 缓存 监控
如何提高服务器CPU性能?
如何提高服务器CPU性能?
61 3
|
1月前
|
Java
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
本文介绍了拼多多面试中的模拟拼团问题,通过使用 `CyclicBarrier` 实现了多人拼团成功后提交订单并支付的功能。与之前的 `CountDownLatch` 方法不同,`CyclicBarrier` 能够确保所有线程到达屏障点后继续执行,并且屏障可重复使用。文章详细解析了 `CyclicBarrier` 的核心原理及使用方法,并通过代码示例展示了其工作流程。最后,文章还提供了 `CyclicBarrier` 的源码分析,帮助读者深入理解其实现机制。