• 【场景题】如何排查CPU偏高的问题


    为了解决CPU偏高的问题,我们首先看一下每一个进程的CPU占用情况,使用命令Top

    可以看见是进程id为2266的进程里面的java程序,占用了CPU90%使用情况 

    所以我们需要找到是哪一个代码导致的这样的情况,由于代码是线程执行的,而线程是进程的执行的最小单元,所以我们需要在当前的进程找到哪一个线程执行的代码,来定位这个问题2

    我们可以根据ps命令+grep命令来查看和定位当前进程下的所有线程

    ps -eH -o pid,tid,%cpu | grep 2266

    这里是对命令的解释:

    • ps: 是一个显示进程信息的命令。
    • -e: 表示列出所有进程。
    • -H: 表示显示进程中的线程(轻量级进程LWP)。如果你只对主进程信息感兴趣,可以省略此选项。
    • -o pid,tid,%cpu: 表示输出格式,显示进程ID(pid)、线程ID(tid)和CPU使用率(%cpu)。
    • |: 是管道符号,用于将前一个命令的输出作为后一个命令的输入。
    • grep 2266: 是搜索工具,用于在ps命令的输出中搜索包含“2266”的行。

    由此可以看到是2266进程下的2276线程占用的CPU

    然后我们可以通过jstack命令,可以获得 Java 虚拟机(JVM)中所有线程的堆栈跟踪信息。这些信息对于调试多线程应用程序中的问题至关重要。

    jstack+进程id就可以查看当前进程下的所有线程信息

    但是 jstack中显示的线程和进程id是十六进制的,所以我们需要将十六进制转换为十进制

    可以通过命令

    printf "%x\n" 2276

    由此可以找8e4的线程来进行查看

     

    由此可以看见是这个线程下的代码第九行报错了,所以我们需要在Application.java文件中找一下第九行代码看一下

     由此我们就可以排查出问题的原因

  • 相关阅读:
    9.23/24数电
    实现分布式锁SchedulerLock
    遗传算法GA求解非连续函数问题
    LeetCode-热题100-笔记-day27
    基于istio实现单集群地域故障转移
    CS5268完美代替AG9321MCQ Typec多合一扩展坞方案
    【前端设计模式】之责任链模式
    PHP的四层架构
    广告学概论--名词解释
    java执行shell命令,Runtime.exec()和jsch谁更有优势?
  • 原文地址:https://blog.csdn.net/loss_rose777/article/details/139452755