一、故障说明

昨晚突然收到线上服务器cpu报警,登录监控平台看了下发现cpu瞬间飙升到60%。第一反应就是使用top命令去查看,发现是一个java进程。于是立刻使用jps -l命令定位到该java进程,发现是一个后台服务,按理说晚上没什么人去使用后台服务,而且它也没有定时任务,查看了服务的日志都没有发现异常情况。

二、故障排查

既然是java进程导致的cpu飙升,于是我使用jstat -gcutil [pid] 5000命令去查看GC情况,结果发现Eden区的垃圾回收非常频繁,然后使用jmap -heap [pid]查看了当前java进程内存配置,Eden区分配了600M的内存,什么样的操作导致600M的内存都不够使用呢?于是我把Eden升级到了800M,结果还是一样CPU并没有降下来。看来一味增加内存是无法解决问题了,只能乖乖的去定位故障了。

三、故障定位

我先是dump出当时的堆栈信息,然后使用MAT去分析,结果并没有发现什么有价值的信息。于是我就想还是要去查看堆栈内的实时数据来定位问题。
        这里使用的工具是Jprofiler,功能强大,界面友好,版本是9.2(大家可以去使用更新的版本,我这里使用9.2是因为网上找不到高版本的破解码,当前找不到破解码也可以试用)。我们都知道图表最能直观反映问题,而我们的线上服务器是linux,所以必须把指标抓取到本地的window服务器上这样才能用图表的形式直观展示。因此这里需要Jprofiler服务端(安装到linux)和Jprofiler客户端(安装在window),下面是对Jprofiler的安装、使用过程。

  1. Jprofiler下载
    Jprofiler9.2下载链接

  2. Jprofiler在window下安装
    window版本我们直接在本地安装即可

  3. Jprofiler在linux下的安装
    linux版上传到远程服务器/opt目录下,然后tar -zxvf 解压(上传目录不一定是/opt,大家可以自行更改)

  4. 收集服务端信息
    然后在想要监控的服务启动脚本中增加下面这段代码(代码中的路径需要结合自身情况做修改,端口随便指定一个即可)

    -agentpath:/opt/jprofiler9/bin/linux-x64/libjprofilerti.so=port=23498,nowait
    
    // 修改完启动脚本后启动服务,然后查看下上面的端口是否启动
    netstat -lnp|grep 23498
    // 我们的监控信息需要通过23498端口传到客户端,因此需要在防火墙中开启该端口
    firewall-cmd --zone=public --add-port=23498/tcp --permanent
    // 重启防火墙
    systemctl restart firewalld
    // 查看端口是否生效
    firewall-cmd --list-ports
    

    (如果大家使用的阿里云等第三方云服务,还需要自行修改安全组配置)

  5. 客户端展示





  1. 问题定位
    首先我们第一眼看到的就是下面的图片,图片中有Memory、GC、Classes、CPU这几个指标。其中我们重点关注Memory、GC、CPU。可以看到Memory几秒钟就下降一次,那么是什么东西能顾在几秒钟内占据几百兆的内存呢?

    我们知道Eden区属于新生代,新生代里存放的都是朝生夕死的对象,于是我们来监控下对象,看看哪些对象占用的内存最大,通过监控我发现占用内存最大的就是byte[],那么byte[]对象又是哪里来的呢?

    继续分析定位到一个方法:java.awt.image.RenderedImage.getData,看来byte[]就是这个方法生成的。

    打开方法的调用栈,发现原来了是我们的一个图片转webp的工具类用到了这个方法。

四、总结

综上,从发现问题到定位问题我们经过了下面的步骤

  1. 定位导致cpu飙升的服务
  2. 查看GC情况,判断是否是因为GC频繁导致的CPU飙升
  3. 查看服务内存配置,观察内存配置是否合理
  4. 升级服务内存配置看是否能够降低GC频率,进而降低CPU
  5. 借助工具分析内存实时情况
  6. 定位占用内存较大的对象
  7. 找到生成该对象的方法调用栈,进而定位具体有问题的代码

线上服务导致cpu飙升问题排查相关推荐

  1. 分页缓冲池占用很高怎么解决_一次线上服务高 CPU 占用优化实践

    线上有一个非常繁忙的服务的 JVM 进程 CPU 经常跑到 100% 以上,下面写了一下排查的过程.通过阅读这篇文章你会了解到下面这些知识. Java 程序 CPU 占用高的排查思路 可能造成线上服务 ...

  2. JVM:线上服务CPU爆满,如何排查(三)

    0. 引言 前一段时间出现了一个正则表达式引起的线上CPU爆满的问题,一开始没有在第一时间定位到问题,这里也特此记录一下,同时也系统的梳理下CPU爆满问题的排查思路和方法,为后续的同学提供参考. 1. ...

  3. window服务器cpu过高的排查_线上服务器发生CPU占用率过高应该如何排查并定位问题?...

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  4. 一次线上服务CPU100%的排查过程

    前言 突然收到线上服务cpu达到100%的报警短信,于是立即展开排查. 排查过程 理论步骤 一.找到最耗CPU的进程 工具:top 方法: 执行top -c ,显示进程运行信息列表 键入P (大写p) ...

  5. 线上服务Java进程假死快速排查、分析

    线上服务Java进程假死快速排查.分析 最近我们有一台服务器上的Java进程总是在运行个两三天后就无法响应请求了,具体现象如下: 请求业务返回状态码502,查看进程还在,意味着Java进程假死,无法响 ...

  6. springboot怎么杀进程_线上服务平均响应时间太长,怎么排查?

    线上服务平均响应时间太长,怎么排查? https://xie.infoq.cn/article/914b5c56000a3880016abd8d6 前言: 最近线上环境某个接口服务响应时间偏长,导致用 ...

  7. jmeter查看平均响应时间_线上服务平均响应时间太长,怎么排查?

    最困难的事情就是认识自己! 个人网站 ,欢迎访问! 前言:最近线上环境某个接口服务响应时间偏长,导致用户体验超差,那平时该怎么快速的排查这类问题呢? ①.为代码添加上详细的打印日志: 不建议 ,一是线 ...

  8. java - JVM 线上服务的FGC问题排查

    线上服务的GC问题,是Java程序非常典型的一类问题,非常考验工程师排查问题的能力.同时,几乎是面试必考题,但是能真正答好此题的人并不多,要么原理没吃透,要么缺乏实战经验. 过去半年时间里,我们的广告 ...

  9. 线上服务的FGC问题排查,看这篇就够了!

    线上服务的GC问题,是Java程序非常典型的一类问题,非常考验工程师排查问题的能力.同时,几乎是面试必考题,但是能真正答好此题的人并不多,要么原理没吃透,要么缺乏实战经验. 过去半年时间里,我们的广告 ...

最新文章

  1. 5年5亿美金,华为昇腾如何构建全行业AI生态?
  2. 参加LinuxCon Japan 2012
  3. solr查询特殊字符的处理
  4. react native基本调试技巧
  5. linux distribution timeline
  6. k8s设置pod privileged权限(特权):securityContext.privileged=true
  7. QML和C ++之间的数据类型转换
  8. 在C#代码中应用Log4Net 中配置文件的解释
  9. 判断出栈序列是否合法(c语言实现)
  10. FTP的连接方式(防火墙的配置)
  11. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程
  12. 2-3树与2-3-4树【转载】
  13. Dapper基础用法
  14. python图片识别训练汽车_python实现图片识别汽车功能
  15. java读取文件 路径_Java中的获取文件的物理绝对路径,和读取文件
  16. map、mapPartitions、mapValues、mapWith、flatMap、flatMapWith、flatMapValues
  17. 枚举题——四大明湖排序(本菜优化了一下)
  18. 轻松绕过PayPal双重认证
  19. iMeta | ggClusterNet微生物网络分析和可视化保姆级教程
  20. matlab画图不想显示x轴数据,Matlab - 情节; 修改X轴值而不修改图形

热门文章

  1. 动态规划--01背包问题详解
  2. B. 三维空间的点(继承)
  3. mysql中insert into语句
  4. 小话HTTP Authentication
  5. LDA模型中需要输入的数据格式
  6. 什么是死锁?如何避免死锁?
  7. vue-cli3 在qq浏览器不兼容
  8. HTML5系列代码:设置滚动条
  9. 带头结点单链表的基本使用
  10. GitHub原生AI代码生成工具Copilot,官方支持Visual Studio 2022