`
Tyrion
  • 浏览: 261041 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

一个线上JVM的CPU资源占用过高问题的排查

    博客分类:
  • Java
 
阅读更多

上午线上某应用的一台JVM的CPU占比突然飙高到192%,并且一直下不来,导致监控一直告警,好久没处理这种问题了,现在将问题排查步骤总结记录一下。

 

1.通过top命令查看当前机器的CPU使用情况


此时发现如果是Java的进程占用过高,并且一直下不来,则排查是什么线程导致占比过高。以图中进程举例,假如发现PID为31357的Java进程占CPU比一直很高,则记录下它的PID

 

2.查看Java进程里面的线程的占用情况

top -H -p 31357

说明:-H 指显示线程,-p 是指定进程


可以看到CPU占用较高的线程,记下他们的PID,假设这里31357的CPU占比一直是50%

 

3.通过jstack命令获取占用资源异常的线程栈,可暂时保存到一个文件中查看

jstack 31357 > jstack.31357.log


以上能看到指定线程的堆栈信息。

如果想看到关于线程中的锁的附加信息,可以加一个-l参数



4.上面方法用于进程正常情况下的堆栈打印,今天碰到的是用jstack -l命令没有响应,估计是CPU一直站着不能执行正常的命令,根据提示[The -F option can be used when the target process is not responding]只能放大招了。

jstack -F “PID” > jstack.“PID”.txt

吐出的实际日志结果如下:


发现一大坨线程阻塞了,有用的结果在这里:

显然一直在跑的是19576这个线程,一直在执行EXCEL导出的相关方法,问题就出在这里,下面的任务就是排查这个地方的代码逻辑了。

jstack命令格式:

jstack [ option ] pid

 

参数说明:

-F jstack [-l] pid无法响应时,强制打印堆栈

-l l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m 混合模式输出(包括java和本地c/c++片段)堆栈。

pid: java应用程序的进程号

 

记得没错的话这几个参数是互斥的,不能联合使用。

 

5.后来搜资料发现用jps命令查看java进程的pid更实用:


 

命令格式

jps [ options ] [ hostid ]

 

参数说明

-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。

-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。

-v 输出传给JVM的参数。

 

三个参数加在一起显示更详细的信息:


发现这些Java进程的启动参数中开放了JMX的远程端口,正常情况下可以通过jconsole远程连接过去看到JVM的日常参数。比如本地访问上图中的pay.war进程:



 




 

 

  • 大小: 213.3 KB
  • 大小: 259 KB
  • 大小: 354.6 KB
  • 大小: 379 KB
  • 大小: 156.5 KB
  • 大小: 399.7 KB
  • 大小: 64.5 KB
  • 大小: 331.6 KB
  • 大小: 19.2 KB
  • 大小: 118.5 KB
  • 大小: 194.6 KB
2
3
分享到:
评论
1 楼 cshuig 2016-04-24  
    

相关推荐

    Java线上故障排查方案(2).pdf

    系统异常通常指的是CPU占用率过高、磁盘使用率100%、系统可用内存低等情况;而业务异常则可能包括服务运行一段时间自动退出、服务间调用时间过长、多线程并发异常、死锁等问题。在进行故障排查时,第一步便是问题的...

    线上问题调查常用命令

    - P: 按CPU占用排序。 - M: 按内存占用排序。 - 1: 显示每个CPU的信息。 - **mpstat -P ALL 1**:显示多处理器统计数据。 - **sar**:用于收集、报告和保存系统活动信息,可以查看历史数据和实时数据。例如: - ...

    Java线上故障排查方案.rar

    1. CPU分析:使用jstack分析线程状态,找出CPU占用高的原因。 2. 内存分析:使用jmap、jhat或MAT(Memory Analyzer Tool)进行堆内存分析,定位内存泄漏。 3. 响应时间:监控请求响应时间,结合调用链路分析,找出...

    Java线上故障排查方案.pdf

    1. **系统异常**:例如CPU占用率过高、磁盘空间100%满、系统可用内存过低等。 2. **业务异常**:如服务运行一段时间后自动退出、服务间调用耗时过长、多线程并发处理时出现问题、线程死锁等。 #### 三、如何定位...

    线上故障排查全套路,总有一款适合你1

    可以使用`ps`找到目标进程的PID,然后使用`top -H -p pid`找出CPU占用高的线程。将PID转换为16进制后,通过`jstack pid | grep 'nid' -C5 --color`查看堆栈详情。重点关注`WAITING`和`TIMED_WAITING`状态的线程,...

    Arthas - Java 诊断利器.docx

    这个工具的主要目的是帮助开发者在遇到线上问题时能够迅速定位并解决,它提供了丰富的功能,包括动态跟踪代码、实时监控JVM状态以及在线查看和分析Java应用的运行情况。 ### 安装与启动Arthas 安装Arthas非常简单,...

    线上故障定位分析全套方案

    针对CPU问题,我们可以使用`jstack`命令来分析线程堆栈,查看哪些线程占用了大量的CPU资源。`jstack`能够输出Java应用中所有线程的当前堆栈跟踪,帮助我们找出可能导致CPU过载的代码段。在分析结果中,查找执行时间...

    记一次公司JVM堆溢出抽丝剥茧定位的过程解析

    在本篇《记一次公司JVM堆溢出抽丝剥茧定位的过程解析》中,作者详细阐述了一次处理公司线上JVM堆溢出问题的排查和解决过程。问题发生在线上Tomcat服务中,该服务合并部署了8个微服务,以节省服务器资源。在上线后...

    以线上实例来看,内存泄漏的图文解决方案.docx

    本文将以一个具体的线上实例为背景,介绍如何逐步排查并解决内存泄漏问题。通过图文并茂的方式,帮助读者更好地理解内存泄漏的诊断方法。 #### 二、问题背景 在一个项目中,开发团队新上线了一个API接口,并选择了...

    arthas311.zip

    通过命令行界面,开发者可以查看和分析JVM的内存状况、线程状态、类加载情况等,快速定位内存泄漏、CPU高占用等问题。这对于线上环境的问题排查尤其重要,因为它能避免对业务造成过多的中断。 再者,Arthas支持...

    arthas培训文档arthas培训文档

    7. **CPU过高排查**:Arthas提供CPU快照分析,协助定位CPU占用高的原因。 8. **日志级别动态调整**:在线更新日志等级为debug,获取更详细的问题排查信息。 【Arthas常用命令详解】 - **jad命令**:反编译JVM中的...

    async-profiler性能分析

    async-profiler能够记录每个对象的创建和销毁,帮助找到内存占用过高的根源。 JIT编译分析则展示了JVM即时编译器的工作情况,帮助开发者理解哪些代码被编译为本机代码,以及编译过程的性能影响。 使用async-...

    唯品会java分析工具vjtop

    3. **CPU使用率监控**:VJTop可以实时监控Java应用的CPU使用率,帮助找出CPU占用过高的线程,分析其执行的代码,从而优化性能。 4. **方法耗时统计**:通过追踪方法调用耗时,VJTop能帮助开发者识别出性能瓶颈,...

    Linux中使用Shell脚本查看Java线程的CPU使用情况

    线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名。 一、首先获得jvm的进程...

    Java 运行时监控

    - **JConsole**: JConsole是JDK自带的一个图形化管理工具,它可以连接到本地或远程的JVM,展示内存、线程、类加载、CPU使用率等各项指标。 2. **内存监控** - **垃圾收集与内存泄漏**:Java的自动内存管理机制...

    云原生微服务下混沌工程实践.pdf

    ChaosBlade支持多种技术栈和资源类型,如操作系统的CPU负载、内存占用、网络延迟等,以及容器服务、微服务、云平台等。 混沌实验工具可以用来进行各种故障注入测试,比如: - CPU负载:模拟CPU使用率上升导致的...

    java动态日志注入工具anylog.zip

    anylog 是一个可以在代码的任意区域无入侵地加入日志的工具,适用于线上问题排查。 anylog 为开发人员提供一个易于使用的平台,帮助开发人员在正在运行的系统中随时加入自己想要的日志,而免于修改代码和重启。 ...

Global site tag (gtag.js) - Google Analytics