2019-07-24 实战火焰图分析CPU使用率解决JAVA应用线上性能问题
背景
业务上一个新业务上线,发现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使用率情况。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Giraph源码分析(四)—— Master 如何检查Worker启动成功
本文的目的 说明Giraph如何借助ZooKeeper来实现Master与Workers间的同步(不太确定)。 环境 在单机上(机器名:giraphx)启动了2个workers。 Giraph遵从单Master多Workers结构,BSPServiceMaster使用MasterThread线程来进行全局的同步。每个Worker启动成功后,会向Master汇报自身的健康状况,那么Master是如何检测Workers是否都成功启动了? Master在ZooKeeper上创两个目录,_workerHealthyDir和 _workerUnhealthyDir,分别用来记录Healthy Workers和UnHealthy Workers。 主要在BspServiceMaster类中的getAllWorkerInfos()方法来完成,其调用关系如下,注意下getAllWorkerInfos()到MasterThread.run()方法调用关系,比较难找。 创建的两个目录如下: /_hadoopBsp/job_201404102333_0002/_applicationAttemptsDir/...
- 下一篇
什么是云服务器?云服务器与vps的区别
云计算的到来能给站长及创业者带来直接帮忙的莫过于IaaS、PaaS服务商提供的云服务器。对广大已经习惯于传统主机托管租用、虚拟主机服务的用户来说,云服务器是模糊。什么是云服务器?与服务器租用托管,VPS的区别在哪里? 如果将VPS比作一个水龙头,服务器的计算和存储资源则是一根水管,水管上有很多水龙头。你需要付出租用这个水龙头的费用,而它的水流量是有限的。如果你想获得更大的水流,那么你需要租用更多的龙头,同时,如果所有的龙头都在流水,那么每个龙头的水流量都会降低。 而云计算下的主机(云服务器),你所获得的是一个流量可大可小的龙头,服务器由一台变成一组,就像一个水管变成很多条水管组成的大水管。当你需要更大的水流时。 可以直接控制你的龙头加大水流,同时即便所有的水管都在流水,也不会影响你的水流。更有甚者,你需要付出的费用,不再是租用水管产生的
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题