模拟liunx排查CPU过高的问题

491 阅读2分钟

我正在参加「掘金·启航计划」

在服务器报cpu过高时,你会使用哪些命令排查问题?

阅读本文章,你会学会使用一些简单的命令去排查这些问题,此文只作为入门了解,深入请移步官网学习。

一:准备工作

  1. 新建java文件模拟无限循环 image.png

  2. 编译class 执行java文件 image.png

二:使用top排查问题

  1. 使用top命令定位异常进程 image.png

  2. 此时可以再执行ps -ef | grep java,查看所有的java进程,在结果中找到进程号为12836的进程,即可查看是哪个应用占用的该进程。 image.png

3.使用top -H -p 进程号查看异常线程 image.png

4.使用printf "%x\n" 线程号将异常线程号转化为16进制 image.png

5.使用jstack 进程号 | grep 16进制异常线程号 -A90 来定位异常代码的位置(最后的-A90是日志行数,也可以输出为文本文件或使用其他数字)。可以看到异常代码的位置 image.png

image.png

  1. 也可以输出到具体文件

jstack l pid >>文件名 image.png

三: 使用 arthas 排查问题

  1. arthas一个jar包, 使用java -jar 启动arthas,未下载arthas先下载jar包

curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar image.png

  1. 输入对应的应用进程服务标号,进入到对应Java进程 image.png

  2. 如果不知道占用CPU过高的线程PID,可使用top命令查看占用最高的pid image.png

  3. 输入dashboard 按回车、enter 会展示当前进程的信息, ctrl + c 中断执行 image.png

  4. thread id, 显示指定线程的运行堆栈 image.png

  5. 反编译文件输出显示 jad,进一步排查代码问题 image.png

  6. quit 退出!

thread 命令详解

参数名称参数说明
id线程id
[n:]指定最忙的前N个线程并打印堆栈
[b]找出当前阻塞其他线程的线程
[i ]指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200
[--all]显示所有匹配的线程
  1. thread id, 显示指定线程的运行堆栈 image.png

  2. thread -i, 指定采样时间间隔

  • thread -n 3 -i 1000 : 列出1000ms内最忙的3个线程栈 image.png

主线程 main 最忙

  1. thread –state ,查看指定状态的线程 image.png