知识点总结

-------------------------------------------------------------------------------------------------------------------

步骤一:找到最耗cpu的进程

  工具:top

  方法:

    执行top -c,显示进程运行信息列表

    键入P(大写),进程按cpu使用率排序

步骤二: 找到最耗CPU的线程

  工具:top

  方法:

    top -Hp 20136,显示一个进程的线程信息列表

    键入P,线程按CPU使用率排序

  由此找到最耗CPU的线程PID

步骤三:将线程PID转化为16进制:

  工具:printf

  方法:printf "%x\n" 10804

  如图,转化为16进制0x2a58  

  之所以要转换为16进制,是因为堆栈里,线程id是用16进制表示的。

步骤四:查看堆栈,找到线程在干嘛:

  工具:pstack/jstack/grep

  方法:jstack 20136 | grep '0x2a34' -C5 -color

    打印进程堆栈

    通过线程id,过滤得到线程堆栈

-------------------------------------------------------------------------------------------------------------------

引言

不知道在大家面试中,有没有遇到这个问题

生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢?

这个问题分为两版回答!
高调版
对不起,我是做研发的,这个问题在生产上是不可能遇见的!因为研发是不可能直接操作生产服务器,如果贵公司研发能遇到这个问题,应该要反思一下自己的权限控制是否合理!

面试官心里活动:装13是不是,赶紧走!

低调版
这个问题我在生产上没碰到过,因为我们是没法直接操作生产环境的。只能说,在测试环境曾经遇见过。操作步骤如下,balabala...

面试官心里活动:权限控制的不错,应该是在大厂呆过。

下面开始我们的正文

正文

下面给出两种系统环节下的排查步骤,都是一模一样的,只是命令稍有区别!

  • 查消耗cpu最高的进程Pid
  • 根据Pid查出消耗cpu最高的线程号
  • 根据线程号查出对应的java线程,进行处理。

准备一行死循环代码

public class TestFor {
public static void main(String[] args) {
int random = 0;
while (random < 100) {
random = random * 10;
}
}
}

怎么跑,应该不用我说了,直接教大家怎么查!

Windows版

可能有人有疑问,我为什么要说Windows版的!因为,我曾经给很多政府部门做过系统。我发现他们用的是Windows Server,不是Linux系统。所有必要说一下!

查消耗Cpu最高的进程PID

手边没有Windows Server机器,我以Win 10为例,截图给大家看一下,先调出PID显示项!

然后发现进程PID如下图所示,为10856

接下来呢

根据PID查出消耗Cpu最高的线程号

这里用到微软的工具Process Explorer v16.22,地址如下
https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
如图所示

发现最耗Cpu的线程的TID6616
这是十进制的数据,转成十六进制为0x19d8

根据线程号查出对应的java线程,进行处理

执行命令

jstack -l 10856 > c:/10856.stack

打开文件c:/10856.stack,搜索19d8,如下图所示

根据文件就可以看出,我们的TestFor.java文件第七行一直在跑,至此定位到问题

Linux版

Linux版本,步骤是一模一样的,就是命令换了一下

查消耗Cpu最高的进程PID

执行命令

  • 执行top -c ,显示进程运行信息列表。按下P,进程按照Cpu使用率排序

如下图所示,PID3033的进程耗费Cpu最高

根据Pid查出消耗Cpu最高的线程号

执行命令

  • top -Hp 3033 ,显示一个进程的线程运行信息列表。按下P,进程按照Cpu使用率排序

如下图所示,PID3034的线程耗费Cpu最高

这是十进制的数据,转成十六进制为0Xbda

根据线程号查出对应的java线程,进行处理

jstack -l 3033 > ./3033.stack

然后执行,grep命令,看线程0xbda做了什么

cat 3033.stack |grep 'bda' -C 8

输出如下

至此定位到问题

总结

大家记得一定要去实际操作一次!

谈谈线上CPU100%排查套路的更多相关文章

  1. 【原创】谈谈线上CPU100%排查套路

    引言 不知道在大家面试中,有没有遇到这个问题 生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢? 这个问题分为两版回答! 高调版 对不起,我是做研发的,这个问 ...

  2. JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!

    线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍. 同时例如jstack.jmap等工具也是不囿于一个方面的问题的, ...

  3. 线上CPU100%排查

    生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题? 这个问题分为两版回答!高调版对不起,我是做研发的,这个问题在生产上是不可能遇见的!因为研发是不可能直接操作生 ...

  4. 告诉你如何回答"线上CPU100%排查"面试问题

    不知道在大家面试中,有没有遇到这个问题: 生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢? 这个问题分为两版回答!高调版对不起,我是做研发的,这个问题在生产 ...

  5. 性能分析 | 线上CPU100%排查

    不知道在大家面试中,有没有遇到这个问题: 生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢? 这个问题分为两版回答! 高调版 对不起,我是做研发的,这个问题在 ...

  6. 线上 CPU100% 排查方案

    问题:生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢? 下面给出两种系统下的排查步骤,都是一模一样的,只是命令稍有区别! 查消耗cpu最高的进程PID 根据 ...

  7. 如何回答“线上CPU100%排查”面试问题

    案例: public class App { public static void main( String[] args ) { int a = 0; while (a < 100) { a ...

  8. BTrace:线上问题排查工具

    BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...

  9. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

随机推荐

  1. Saiku相关异常处理(十五)

    Saiku大概是我的第一个持续更博的技术点,希望自己能在这条研究saiku的道路上越走越远嘻嘻 这里我们来记录一下研究saiku时遇到的异常信息,这篇博客会保持持续更新的. 1. Java heap ...

  2. 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象

    学生类 package com.lanxi.demo1; public class Student { //创建属性 姓名,学校,年龄 private String name; private Str ...

  3. Core 配置文件Json

    appsettings.json 文件属性 -复制到输出目录-始终复制.

  4. Spring手动提交事务

    // name的值根据spring配置文件的事物管理器的id而定 @Resource(name="transactionManager") private DataSourceTr ...

  5. 还是畅通工程,最小生成树kruskal

    题目描述:     某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...

  6. 关于maven环境变量的配置问题

    开始使用“MAVEN_HOME”配置完环境变量后,在cmd中输入mvn -v提示不是内部命令,后直接在PATH 路径里面添加maven所在的位置+\bin,比如,maven的路径为E:\maven\a ...

  7. day 07 元组,字典和集合等数据类型介绍

    元组:就是一个不可变的列表 1.用途,当我们需要记录多个值,并且没有更改的需求的时候,应该使用元组 2定义方式:使用,在 ( ) 中分隔开多个任意类型的值 注:t=("egg",) ...

  8. 位运算 - a^b

    求 a 的 b 次方对 p 取模的值. 输入格式 三个整数 a,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数据范围 1≤a,b,p≤109 输入样例: 3 ...

  9. The Tower of Babylon(UVa 437)

    题意:有n种立方体,每种都有无穷多个.选一些正方体摞成一根尽量高的柱子(可以选择任意一条边做高),使得每个立方体的底面长宽分别严格小于它下方的立方柱的底面长宽. 题解:可以套用DAG最长路算法,可以使 ...

  10. : LDAP & Implementation

    LDAP LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了并且可以根据需要 ...