大致思路:

一、导出thread dump、heap dump文件 (方式多种)

1.通过jvisualvm工具添加jmx连接(前提容器开启jmx),直接点击堆Dump、线程Dump操作。

2.通过连接服务器,通过命令jstack、jmap进行导出堆Dump、线程Dump文件。

二、分析thread dump:关注线程状态

  1. 死锁,Deadlock(重点关注) 
  2. 执行中,Runnable
  3. 等待资源,Waiting on condition(重点关注)
  4. 等待获取监视器,Waiting on monitor entry(重点关注)
  5. 暂停,Suspended
  6. 对象等待中,Object.wait() 或 TIMED_WAITING
  7. 阻塞,Blocked(重点关注)  
  8. 停止,Parked
  • Deadlock:死锁线程,一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
  • Runnable:一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换。
  • Waiting on condition:等待资源,或等待某个条件的发生。具体原因需结合 stacktrace来分析。
    • 如果堆栈信息明确是应用代码,则证明该线程正在等待资源。一般是大量读取某资源,且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取。
    • 又或者,正在等待其他线程的执行等。
    • 如果发现有大量的线程都在处在 Wait on condition,从线程 stack看,正等待网络读写,这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。
      • 一种情况是网络非常忙,几乎消耗了所有的带宽,仍然有大量数据等待网络读写;
      • 另一种情况也可能是网络空闲,但由于路由等问题,导致包无法正常的到达。
    • 另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒。
  • Blocked:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。

三、找到最耗时的CPU进程

1.执行top -c,显示进程运行信息列表,进程按照CPU使用率排序。

2.执行top -Hp ${pid},显示一个进程的线程运行信息列表,线程按照CPU使用率排序

3.将线程PID转化为16进制(printf "0x%x\n" ${pid})

4.查看堆栈,找到线程在干嘛(jstack ${pid}| grep 0x658 -A 20)

根据jstack的输出,结合源码很容易就可以发现问题:

[john@server-1 ~]$ jstack 1612 | grep 0x658 -A 20
"Thread-0" #8 prio=5 os_prio=0 tid=0x00007f164c0e8000 nid=0x658 runnable [0x00007f1636af1000]java.lang.Thread.State: RUNNABLEat java.io.FileOutputStream.writeBytes(Native Method)at java.io.FileOutputStream.write(FileOutputStream.java:326)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)- locked <0x00000000e3814d78> (a java.io.BufferedOutputStream)at java.io.PrintStream.write(PrintStream.java:482)- locked <0x00000000e3804d30> (a java.io.PrintStream)at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)- locked <0x00000000e3804cf0> (a java.io.OutputStreamWriter)at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)at java.io.PrintStream.newLine(PrintStream.java:546)- eliminated <0x00000000e3804d30> (a java.io.PrintStream)at java.io.PrintStream.println(PrintStream.java:807)- locked <0x00000000e3804d30> (a java.io.PrintStream)at Test$Thread1.run(Test.java:15)at java.lang.Thread.run(Thread.java:748)

线上服务CPU100%问题定位相关推荐

  1. 线上服务CPU100%问题快速定位实战--转

    来自微信公众号 架构师之路 功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58 ...

  2. 线上服务CPU100%问题快速定位实战(转载公众号:架构师之路)

    功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58速运技术部联合进行了一次线上 ...

  3. 线上服务CPU100%问题快速定位实战

    功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58速运技术部联合进行了一次线上 ...

  4. 线上服务CPU100%问题快速定位实战(58沈剑)

    功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58速运技术部联合进行了一次线上 ...

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

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

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

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

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

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

  8. 【转】线上服务的FGC问题排查,看这篇就够了!

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

  9. JVM:线上服务的FGC问题排查

    原文链接:https://blog.csdn.net/bestxianfeng163/article/details/107972060 线上服务的GC问题,是Java程序非常典型的一类问题,非常考验 ...

  10. 如何提高线上服务可用性

    上一篇文章中我简单介绍了一次线上服务的可用性下降追查过程,今天我们接着上次的内容来学习如何保证服务的高可用性. 具体分为开发阶段.测试阶段.上线阶段.监控阶段等几大项.这些内容就像是一套组合拳,练好了 ...

最新文章

  1. swift string转int_Swift进阶二:基本数据类型相关
  2. 日志平台(网关层) - 基于Openresty+ELKF+Kafka
  3. 高斯--塞德尔迭代法求方程组的解(Python实现)
  4. JdbcTmplate中的update方法(代码)基础操作
  5. 中心城镇问题(长链剖分优化树形dp)
  6. 还有另一个报告生成器?
  7. bootstrap-select动态生成数据,设置默认选项(默认值)
  8. php垂直居中代码_纯css实现水平和垂直居中
  9. Bailian2930 加减乘除【水题】
  10. 字典:python的基础数据类型
  11. Atitit.mssql 数据库表记录数and 表体积大小统计
  12. 物理用不用计算机,计算物理学到底是干什么的?
  13. MAC下配置 adb 环境变量
  14. 注册邮箱验证激活技术
  15. 设计模式-大话设计模式学习笔记
  16. java调用import了第三方库的python脚本为啥就是出不来结果嘞
  17. 小白学语句:省市区选择(带全国省市区数据)
  18. hostapd_cli 使用手册
  19. FacesServlet (Java EEWTP/JSF问题的解决--java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
  20. 手机通过adb工具安装应用

热门文章

  1. 物联网小课堂之NB-IoT黑科技——低功耗技术
  2. 国内电商行业-业务知识
  3. #BDA#笔记#业务知识:常见行业业务模式指标1国内电商行业
  4. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 D-psd面试(区间dp)
  5. java workbook 是什么_Java WorkBook对Excel的基本操作
  6. Linux学习之日志管理
  7. 2010年9月21日写给儿子的话
  8. iOS,侧滑(最简单效果却很好的侧滑功能实现
  9. 作为行星和世界的地球
  10. 至尊快速,国产语言RPP 1.83强势来袭