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使用率情况。

目录
相关文章
|
17天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
13天前
|
Java 调度
Java中常见锁的分类及概念分析
Java中常见锁的分类及概念分析
15 0
|
13天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
12 0
|
18小时前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
6 0
|
4天前
|
存储 Java 数据库连接
java DDD 领域驱动设计思想的概念与实战
【4月更文挑战第19天】在Java开发中,领域驱动设计(Domain-Driven Design, DDD) 是一种软件设计方法论,强调以领域模型为中心的软件开发。这种方法通过丰富的领域模型来捕捉业务领域的复杂性,并通过软件满足核心业务需求。领域驱动设计不仅是一种技术策略,而且还是一种与业务专家紧密合作的思维方式
21 2
|
5天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
5天前
|
设计模式 算法 Java
Java中的设计模式及其应用
【4月更文挑战第18天】本文介绍了Java设计模式的重要性及分类,包括创建型、结构型和行为型模式。创建型模式如单例、工厂方法用于对象创建;结构型模式如适配器、组合关注对象组合;行为型模式如策略、观察者关注对象交互。文中还举例说明了单例模式在配置管理器中的应用,工厂方法在图形编辑器中的使用,以及策略模式在电商折扣计算中的实践。设计模式能提升代码可读性、可维护性和可扩展性,是Java开发者的必备知识。
|
5天前
|
安全 Java API
函数式编程在Java中的应用
【4月更文挑战第18天】本文介绍了函数式编程的核心概念,包括不可变性、纯函数、高阶函数和函数组合,并展示了Java 8如何通过Lambda表达式、Stream API、Optional类和函数式接口支持函数式编程。通过实际应用案例,阐述了函数式编程在集合处理、并发编程和错误处理中的应用。结论指出,函数式编程能提升Java代码的质量和可维护性,随着Java语言的演进,函数式特性将更加丰富。
|
6天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
11天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
17 1
探秘jstack:解决Java应用线程问题的利器