zoukankan      html  css  js  c++  java
  • 一个线上JVM的CPU资源占用过高问题的排查

    原文:https://www.iteye.com/blog/tyrion-2293369

    上午线上某应用的一台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进程:



     




     

     

     

     

  • 相关阅读:
    路由基础、多app共存,路由分配、路由分发(将app自己的路由分发给应用自身管理)、反解
    Django项目的创建与介绍,三件套,静态文件,配置Mysql完成数据迁移,单表ORM记录的增删改查
    Django框架导读
    Flask简易版本、Ajax、DOM操作,表单操作
    JQuery
    0820-信心赛
    codeforces比赛总(吐)结(嘈)
    洛谷P3403 跳楼机(最短路)
    求逆序对的三种方法
    NKOJ 3751 扫雷游戏
  • 原文地址:https://www.cnblogs.com/shihaiming/p/11424100.html
Copyright © 2011-2022 走看看