Linux排查问题工具汇总

一、Linux问题排查命令

uptime

top

free

vmstat

iostat

ifstat

geektime专栏《linux性能优化实战》笔记

二、Sun JDK自带工具

1.jps(虚拟机进程状况工具)

[peng@manjaro java]$ jps -l
5524 SynAddRunnable
5800 sun.tools.jps.Jps
[peng@manjaro ~]$ jps -l
10872 sun.tools.jps.Jps
[peng@manjaro ~]$ jps -v
10898 Jps -Denv.class.path=.:/opt/jdk1.8.0_212lib:/opt/jdk1.8.0_212/jre/lib -Dapplication.home=/opt/jdk1.8.0_212 -Xms8m

2.jstat(虚拟机统计信息工具)

例如,查询虚拟机的运行状态信息,每隔1000ms,总共5次

[peng@manjaro ~]$ jstat -gc 5524 1000 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
5120.0 5120.0  0.0   352.0  31744.0  21905.2   84992.0      8.0     4864.0 2467.5 512.0  264.6       1    0.001   0      0.000    0.001
5120.0 5120.0  0.0   352.0  31744.0  21905.2   84992.0      8.0     4864.0 2467.5 512.0  264.6       1    0.001   0      0.000    0.001
5120.0 5120.0  0.0   352.0  31744.0  21905.2   84992.0      8.0     4864.0 2467.5 512.0  264.6       1    0.001   0      0.000    0.001
5120.0 5120.0  0.0   352.0  31744.0  21905.2   84992.0      8.0     4864.0 2467.5 512.0  264.6       1    0.001   0      0.000    0.001
5120.0 5120.0  0.0   352.0  31744.0  21905.2   84992.0      8.0     4864.0 2467.5 512.0  264.6       1    0.001   0      0.000    0.001

3.jmap(Java内存映射工具)

可以生成堆转储快照(一般称为heapdump或dump文件)。获取Java堆转储快照的方式有以下几种:

①(自动生成)使用-XX:+HeapDumpOnOutOfMemoryError参数,让虚拟机在OOM后自动生成dump文件

②(手动生成)使用-XX:+HeapDumpOnCtrlBreak参数,在Windows下可以使用Ctrl+Break键让虚拟机生成dump文件,

Linux下通过kill  -3命令发送进程退出信号“吓唬”一下虚拟机,也能拿到dump文件。

③使用jmap命令

4.jhat(虚拟机堆转储快照分析工具)

目前已经有更好的工具,比如MAT,jhat在JDK9中已正式被移除

5.jinfo(Java配置信息工具)

可以实时的查看当前 jvm 使用了哪些参数,并且也可以在不停机的情况下修改参数。

6.jstack(java堆栈跟踪工具)

7.替代品jcmd

官网:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

jcmd是jdk7中引入的,可以代替jstack。

jstat

该工具比较常用,可以查看GC 的详细信息,比如eden ,from,to,old 等区域的内存使用情况。

三、可视化分析工具

JConsole

Java Visual VM

Java Visual VM (JVisualVM) 自JDK6u23开始到JDK8为止为Oracle JDK的一部分, JDK9及之后作为独立项目。

四、其它工具

Btrace

官网:https://github.com/btraceio/btrace 

Arthas

阿里重磅开源在线分析诊断工具,官网地址:https://alibaba.github.io/arthas/

MAT(Memory Analyzer Tool)

官网:https://www.eclipse.org/mat/downloads.php

主要用于诊断内存泄漏和高内存占用问题。

Jprofiler

官网:https://www.ej-technologies.com/products/jprofiler/overview.html

JProfiler是用于分析Java软件性能瓶颈并能准确定位到类或者方法有效解决性能问题的主流工具,它通常需要与性能测试工具(如LoadRunner)配合使用,因为往往只有当系统处于压力状态下才能反映出性能问题。Jprofiler是收费的。

四、常见问题排查思路

1.CPU彪高

思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程。然后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码。最后对代码进行排查。

具体步骤:

  1. 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID
  2. 再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.
  3. 通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。
  4. 由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。使用 printf "%x\n" [十进制数字] ,可以将10进制转换成16进制。
  5. 通过刚刚转换的16进制数字从堆栈信息里找到对应的线程堆栈。就可以从该堆栈中看出端倪。

分析 dump 文件的可视化工具,MAT,Jprofile,jvisualvm 等,这些工具可以分析 jmap dump 下来的文件,看看哪个对象使用的内存较多,通常是能够查出问题的。

出现问题的常见场景:

①一般是某个业务死循环没有出口,这种情况可以根据业务进行修复。

②还有 C2 编译器执行编译时也会抢占 CPU,什么是 C2编译器呢?当 Java 某一段代码执行次数超过10000次(默认)后,就会将该段代码从解释执行改为编译执行,也就是编译成机器码以提高速度。而这个 C2编译器就是做这个的。如何解决呢?项目上线后,可以先通过压测工具进行预热,这样,等用户真正访问的时候,C2编译器就不会干扰应用程序了。如果是 GC 线程导致的,那么极有可能是 Full GC ,那么就要进行 GC 的优化。

2.内存问题排查

一种是内存泄露,一种是未泄露。

内存溢出的情况可以通过加上 -XX:+HeapDumpOnOutOfMemoryError 参数,该参数作用是在程序内存溢出时输出 dump 文件。有了 dump 文件,就可以通过 dump 分析工具进行分析了,比如常用的MAT,Jprofile,jvisualvm 等工具都可以分析,这些工具都能够看出到底是哪里溢出,哪里创建了大量的对象等等信息。

参考:Java虚拟机线上问题排查的2个基本操作,你知不知道?

总结:

GC

①gc的状况:jmap ,jcmd(oracle 官方推荐使用 jcmd 代替 jmap,因为 jcmd 确实能代替 jmap 很多功能。jmap 可以打印对象的分布信息,可以 dump 文件,注意,jmap 和 jcmd dump 文件的时候会触发 FGC ,使用的时候注意场景。)

②还有一个比较常用的工具是 jstat,该工具可以查看GC 的详细信息,比如eden ,from,to,old 等区域的内存使用情况。

③还有一个工具是 jinfo,该工具可以查看当前 jvm 使用了哪些参数,并且也可以在不停机的情况下修改参数。

分析 dump 文件的可视化工具

①MAT

②Jprofile

③jvisualvm 

猜你喜欢

转载自www.cnblogs.com/rouqinglangzi/p/11911040.html