java线上问题排查基本命令

2023-11-05

1、jvm基本命令

1.1、java命令

1.1.1、简介

java命令启动java应用程序。它通过启动Java运行时环境(JRE)、加载指定的类并调用该类的main()方法来实现这一点。

1.1.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC

1.1.3、选项划分

  • 标准选项:以“-”开头,比如-help -version,Java 虚拟机 (JVM) 的所有实现都保证支持标准选项。
  • 非标准选项:以“-X”开头,特定于Java HotSpot 虚拟机的通用选项,因此不能保证所有 JVM 实现都支持它们,并且可能会发生变化。
  • 高级选项:以“-XX”开头,这些是用于调整 Java HotSpot 虚拟机操作的特定区域的开发人员选项,这些区域通常具有特定的系统要求,并且可能需要对系统配置参数的特权访问。也不能保证所有 JVM 实现都支持它们,并且可能会发生变化。
  • 布尔选项:用于启用默认禁用的功能或禁用默认启用的功能。此类选项不需要参数。布尔 -XX 选项使用加号 (-XX:+OptionName) 启用,使用减号 (-XX:-OptionName) 禁用。

1.2、javap命令

1.2.1、简介

javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码。用于分解class文件。

1.2.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javap.html#BEHHDJGA

1.2.3、javap主要参数的使用

  • javap -l :会输出行号和本地变量表信息;
  • javap -c :会对当前class字节码进行反编译生成汇编代码;
  • javap -v: class字节码文件中除了包-c参数包含的内容外,还会输出行号、局部变量表信息、常量池等信息;

1.3、javac命令

1.3.1、简介

javac 是java语言编程编译器。全称java compiler。javac工具读由java语言编写的类和接口的定义,并将它们编译成字节代码的class文件。javac 可以隐式编译一些没有在命令行中提及的源文件。用 -verbose 选项可跟踪自动编译。当编译源文件时,编译器常常需要它还没有识别出的类型的有关信息。对于源文件中使用、扩展或实现的每个类或接口,编译器都需要其类型信息。这包括在源文件中没有明确提及、但通过继承提供信息的类和接口。

1.3.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javac.html#BHCBDCJI

3.3.3、基本命令

用法: javac <options> <source files>
其中, 可能的选项包括:
  -g                         生成所有调试信息
  -g:none                    不生成任何调试信息
  -g:{lines,vars,source}     只生成某些调试信息
  -nowarn                    不生成任何警告
  -verbose                   输出有关编译器正在执行的操作的消息
  -deprecation               输出使用已过时的 API 的源位置
  -classpath <路径>            指定查找用户类文件和注释处理程序的位置
  -cp <路径>                   指定查找用户类文件和注释处理程序的位置
  -sourcepath <路径>           指定查找输入源文件的位置
  -bootclasspath <路径>        覆盖引导类文件的位置
  -extdirs <目录>              覆盖所安装扩展的位置
  -endorseddirs <目录>         覆盖签名的标准路径的位置
  -proc:{none,only}          控制是否执行注释处理和/或编译。
  -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
  -processorpath <路径>        指定查找注释处理程序的位置
  -d <目录>                    指定放置生成的类文件的位置
  -s <目录>                    指定放置生成的源文件的位置
  -implicit:{none,class}     指定是否为隐式引用文件生成类文件
  -encoding <编码>             指定源文件使用的字符编码
  -source <发行版>              提供与指定发行版的源兼容性
  -target <发行版>              生成特定 VM 版本的类文件
  -version                   版本信息
  -help                      输出标准选项的提要
  -A关键字[=值]                  传递给注释处理程序的选项
  -X                         输出非标准选项的提要
  -J<标记>                     直接将 <标记> 传递给运行时系统
  -Werror                    出现警告时终止编译
  @<文件名>                     从文件读取选项和文件名(多个Java文件写在此文件中)


1.4、jps命令

1.4.1、简介

jps(Java Virtual Machine Process Status Tool)是java提供的一个显示当前所有java进程pid的命令,适合在linux/unix平台上简单察看当前java进程的一些简单情况。

1.4.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html#CHDCGECD

1.4.3、基本命令

  • -q:只显示pid,不显示class名称,jar文件名和传递给main方法的参数
  • -m:输出传递给main方法的参数,在嵌入式jvm上可能是null
  • -l:输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
  • -v:输出传递给JVM的参数
  • -V:隐藏输出传递给JVM的参数

1.5、jinfo命令

1.5.1、简介

jinfo是java虚拟机自带的Java配置信息工具,可以实时地查看和调整虚拟机的各项参数。

在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了 jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。

jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值, 甚至可以在运行时修改部分参 数,并使之立即生效。 但是,并非所有参数都支持动态修改。参数只有被标记 manageable的flag可以被实时修改。其实,这个修改能力是 极其有限的。

1.5.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD

1.5.3、基本命令

  • jinfo -sysprops pid :查看该进程的全部配置信息
  • jinfo -flags pid: 查看曾经赋过值的参数值
  • jinfo -flag <具体参数> pid: 查看具体参数的值
  • 使用jinfo进行参数修改-布尔值:jinfo -flag ±参数 pid
  • 使用jinfo进行参数修改-非布尔值:jinfo -flag 参数名=参数值 pid
  • java -XX: -PrintFlagslnitial 查看所有JVM参数启动的初始值
  • java -XX: +PrintFlagsFinal 查看所有JVM参数的最终值
  • java -XX: +PrintCommandLineflags 查看那些已经被用户或者JVM设置过的详细的XX参数的名称和值

1.6、jstat命令

1.6.1、简介

Jstat是java虚拟机统计信息工具,利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控。
主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size垃圾回收状况的监控。

1.6.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE

1.6.3、基本命令

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

option:参数选项

  • -t:可以在打印的列加上Timestamp列,用于显示系统运行的时间
  • -h:可以在周期性数据输出的时候,指定输出多少行以后输出一次表头
  • vmid:Virtual Machine ID( 进程的 pid)
  • interval:执行每次的间隔时间,单位为毫秒
  • count:用于指定输出多少次记录,缺省则会一直打印

-<option> jstat -options

  • -class 用于查看类加载情况的统计
  • -compiler 用于查看HotSpot中即时编译器编译情况的统计
  • -gc 用于查看JVM中堆的垃圾收集情况的统计
  • -gccapacity 用于查看新生代、老生代及持久代的存储容量情况
  • -gcmetacapacity 显示metaspace的大小
  • -gcnew 用于查看新生代垃圾收集的情况
  • -gcnewcapacity 用于查看新生代存储容量的情况
  • -gcold 用于查看老生代及持久代垃圾收集的情况
  • -gcoldcapacity 用于查看老生代的容量
  • -gcutil 显示垃圾收集信息
  • -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次仅当前正在发生的垃圾收集的原因
  • -printcompilation 输出JIT编译的方法信息

1.7、jstack命令

1.7.1、简介

jstack是java虚拟机自带的一种堆栈跟踪工具,它用于打印出给定的java进程ID、core file、远程调试服务的Java堆栈信息。

  • jstack命令用于生成虚拟机当前时刻的线程快照
  • 线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。
  • 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源
  • 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题
  • 另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

1.7.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html#BABGJDIF

1.7.3、基本命令

 jstack [ option ] pid // 打印某个进程的堆栈信息 (最常用)
 jstack [ option ] executable core
 jstack [ option ] [server-id@]remote-hostname-or-IP 
  • executable Java executable from which the core dump was produced.(可能是产生core dump的java可执行程序)
  • core 将被打印信息的core dump文件
  • remote-hostname-or-IP 远程debug服务的主机名或ip
  • server-id 唯一id,假如一台主机上多个远程debug服务

option参数如下:

  • -F:当正常输出的请求不被响应时,强制输出线程堆栈
  • -m:如果调用到本地方法的话,可以显示C/C++的堆栈
  • -l:除堆栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

使用jstack排查死锁问题

jstack -l pid | grep "deadlock"

1.8、jmap命令

1.8.1、简介

主要是生成java进程当前(当前指的是执行命令的时刻)内存堆转储快照,生成的快照经常用于分析内存溢出或者内存泄漏相关的问题。
除了生成内存快照,还可以有如下作用:

  • Java堆和方法区的详细信息
  • 内存空间使用率
  • 当前用的是哪种收集器

1.8.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB

1.8.3、基本命令

jmap [option] <pid> (最常用)
    (to connect to running process)
jmap [option] <executable <core>
    (to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
    (to connect to remote debug server)

在这里插入图片描述
生成内存快照:

jmap -dump:live,format=b,file=/path-you-want-to-save/java-heap-dump.hprof  pid

Java堆和方法区的详细信息、内存空间使用率、当前用的是哪种收集器:

jmap -heap pid

查看对象占用最大的,并按降序排序输出

jmap -histo <pid> | grep "xxx" | less
或者
jmap -histo <pid> | grep "xxx" | sort -k 3 -g -r | less

查看对象数最多的对象,并按降序排序输出

jmap -histo <pid> | grep "xxx" | sort -k 2 -g -r | less

1.9、jhat命令

1.9.1、简介

jhat命令与jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器,对生成的dump文件分析后,可以在浏览器中查看分析结果。
注:jhat命令在JDK9、JDK10中已经被删除,官方建议用VisualVM代替。

1.9.2、命令链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jhat.html#CIHHJAGE

1.9.3、基本命令

jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
  • -stack false|true:关闭跟踪对象分配调用堆栈。如果堆dump中没有分配站点信息,则必须将此标志设置为false。默认值为true。
  • -refs false|true:关闭对对象的引用跟踪。默认是true,默认情况下,将为堆中的所有对象计算回指针,回指针是指向指定对象(如引用者或传入引用)的对象。
  • -port port-number:设置jhat HTTP服务器的端口。默认是7000。
  • -exclude exclude-file:指定一个文件,该文件列出应该从可达对象查询中排除的数据成员。例如:如果指定了java.lang.String.value,那么会排除该属性。
  • -baseline exclude-file:指定baseline堆dump文件,具有相同对象ID的两个堆转储中的对象被标记为非新对象。其他对象被标记为new。这对于比较两个不同的堆转储非常有用。
  • -debug int:设置工具的调试级别,级别0表示没有调试输出,值越高越详细。
  • -version:显示版本号
  • -h:显示帮助信息
  • -help:显示帮助信息
  • -Jflag:将标志传递给运行jhat命令的Java虚拟机。例如,-J-Xmx512m表示使用最大堆大小512 MB。

2、性能排查

2.1、定位线上最耗CPU的线程

2.1.1、通过top命令找到最耗时的进程

top // 假设找到进程号是98344

2.1.2、找到进程中最耗CPU的线程

方案1

ps -Lp #pid cu // ps -Lp 98344 cu
ps -Lp #pid cu --sort -pcpu // 按CPU倒序排序 +pcpu(按cpu升序排序)
ps -Lp #pid cu --sort -pmem // 按内存倒序排序
ps -Lp #pid cu | sort -rnk 3 // 按照第三列倒序排序
ps -Lp #pid cu | sort -rnk 3 | head -n 1 // 排序展示第一条
  • -r:表示倒序排列
  • -n:表示按照数值排序
  • -k:3表示按照第3个字段排序
  • head -n 1:取第1条数据

方案2

top -Hp pid // top -Hp 98344

2.1.3、获取线程id的十六进制码

printf '%x\n' #threadId // printf '%x\n' 98345 -> 18029

2.1.4、查看线程堆栈信息

jstack #pid | grep -A 10 "nid=0x<十六进制码>" // jstack 10 | grep -A 10 "nid=0x18029"
  • -C:显示查找到内容的上下5行
  • -A:显示查找到内容的前5行
  • -B:显示查找到内容的后5行

3、free命令

free是查看内存使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。
free -h -s 3表示每隔三秒输出一次内存情况,命令如下:
在这里插入图片描述

  • Mem:是内存的使用情况。
  • Swap:是交换空间的使用情况。
  • total:系统总的可用物理内存和交换空间大小。
  • used:已经被使用的物理内存和交换空间。
  • free:还有多少物理内存和交换空间可用使用,是真正尚未被使用的物理内存数量
  • shared:被共享使用的物理内存大小。
  • buff/cache:被 buffer(缓冲区) 和 cache(缓存) 使用的物理内存大小。
  • available:还可以被应用程序使用的物理内存大小,它是从应用程序的角度看到的可用内存数量,available ≈ free + buffer + cache

交换空间(swap space)

swap space 是磁盘上的一块区域,当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。
交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。


4、vmstat命令 (推荐)

vmstat(VirtualMeomoryStatistics,虚拟内存统计)是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视,推荐使用。

vmstat 5 3表示每隔5秒统计一次,一共统计三次。
在这里插入图片描述

procs模块

  • r:表示运行和等待CPU时间片的进程数(就是说多少个进程真的分配到CPU),这个值如果长期大于系统CPU个数,说明CPU不足,需要增加CPU。
  • b:表示在等待资源的进程数,比如正在等待I/O或者内存交换等。

memory模块

  • swpd:表示切换到内存交换区的内存大小,即虚拟内存已使用的大小(单位KB),如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
  • free:表示当前空闲的物理内存
  • buff:表示缓冲大小,一般对块设备的读写才需要缓冲
  • Cache:表示缓存大小,一般作为文件系统进行缓冲,频繁访问的文件都会被缓存,如果cache值非常大说明缓存文件比较多,如果此时io中的bi比较小,说明文件系统效率比较好

swap模块

  • si:表示数据由磁盘读入内存;通俗的讲就是每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉
  • so:表示由内存写入磁盘,也就是由内存交换区进入内存的数据大小。

注意:一般情况下si、so的值都为0,如果si、so的值长期不为0,则说明系统内存不足,需要增加系统内存

io模块

  • bi:表示由块设备读入数据的总量,即读磁盘,单位kb/s
  • bo:表示写到块设备数据的总量,即写磁盘,单位kb/s

注意:如果bi+bo的值过大,且wa值较大,则表示系统磁盘IO瓶颈。

system 模块

  • in:表示某一时间间隔内观测到的每秒设备终端数。
  • cs:表示每秒产生的上下文切换次数,这个值要越小越好,太大了,要考虑调低线程或者进程的数目

例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。
系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。
上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

注意:这两个值越大,则由内核消耗的CPU就越多。

CPU模块

  • us:表示用户进程消耗的CPU时间百分比,us值越高,说明用户进程消耗CPU时间越多,如果长期大于50%,则需要考虑优化程序或者算法
  • sy:表示系统内核进程消耗的CPU时间百分比,一般来说us+sy应该小于80%,如果大于80%,说明可能存在CPU瓶颈
  • id:表示CPU处在空间状态的时间百分比。
  • wa:表示IP等待所占用的CPU时间百分比,wa值越高,说明I/O等待越严重,根据经验wa的参考值为20%,如果超过20%,说明I/O等待严重,引起I/O等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者监控器的贷款瓶颈(主要是块操作)造成的

5、sar命令

sar和free类似sar -r 3每隔三秒输出一次内存信息:
在这里插入图片描述
通过sar -u 3可以查看CUP总体消耗占比:

在这里插入图片描述

  • %user:用户空间的CPU使用。
  • %nice:改变过优先级的进程的CPU使用率。
  • %system:内核空间的CPU使用率。
  • %iowait:CPU等待IO的百分比 。
  • %steal:虚拟机的虚拟机CPU使用的CPU。
  • %idle:空闲的CPU。

在以上的显示当中,主要看%iowait和%idle:

  • 若 %iowait的值过高,表示硬盘存在I/O瓶颈;
  • 若 %idle的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量;
  • 若 %idle的值持续低于 10,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU;

6、top命令

在Linux内核的操作系统中,进程是根据虚拟运行时间(由进程优先级、nice值加上实际占用的CPU时间进行动态计算得出)进行动态调度的。
在执行进程时,需要从用户态转换到内核态,用户空间不能直接操作内核空间的函数。
通常要利用系统调用来完成进程调度,而用户空间到内核空间的转换通常是通过软中断来完成的。例如要进行磁盘操作,用户态需要通过系统调用内核的磁盘操作指令,所以CPU消耗的时间被切分成用户态CPU消耗、系统(内核) CPU 消耗,以及磁盘操作 CPU 消耗。
执行进程时,需要经过一系列的操作,进程首先在用户态执行,在执行过程中会进行进程优先级的调整(nice),通过系统调用到内核,再通过内核调用,硬中断、软中断,让硬件执行任务。
执行完成之后,再从内核态返回给系统调用,最后系统调用将结果返回给用户态的进程。

top可以查看CPU总体消耗,包括分项消耗,如User,System,Idle,nice等。

  • Shift + H显示java线程;Shift + M按照内存使用排序;
  • Shift + P按照CPU使用时间(使用率)排序;
  • Shift + T按照CPU累积使用时间排序;

多核CPU,进入top视图1,可以看到各CPU的负载情况。

在这里插入图片描述

第一行:15:24:11 up 8 days, 7:52, 1 user, load average: 5.73, 6.85, 7.33:

  • 15:24:11 系统时间
  • up 8 days 运行时间
  • 1 user 当前登录用户数
  • load average 负载均衡情况,分别表示1分钟,5分钟,15分钟负载情况

第二行:Tasks: 17 total, 1 running, 16 sleeping, 0 stopped, 0 zombie:

  • 总进程数17
  • 运行数1
  • 休眠 16
  • 停止0
  • 僵尸进程0

第三行:%Cpu(s): 13.9 us, 9.2 sy, 0.0 ni, 76.1 id, 0.1 wa, 0.0 hi, 0.1 si, 0.7 st:

  • 用户空间CPU占比13.9%
  • 内核空间CPU占比9.2%
  • 改变过优先级的进程CPU占比0%
  • 空闲CPU占比76.1
  • IO等待占用CPU占比0.1%
  • 硬中断占用CPU占比0%
  • 软中断占用CPU占比0.1%
  • 当前VM中的cpu 时钟被虚拟化偷走的比例0.7%

第四和第五行表示内存和swap区域的使用情况

第七行

  • PID: 进程id
  • USER:进程所有者
  • PR:进程优先级
  • NI:nice值。负值表示高优先级,正值表示低优先级
  • VIRT:虚拟内存,进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
  • RES:常驻内存,进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
  • SHR:共享内存,共享内存大小,单位kb
  • S:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
  • %CPU:上次更新到现在的CPU时间占用百分比
  • %MEM:进程使用的物理内存百分比
  • TIME+:进程使用的CPU时间总计,单位1/100秒
  • COMMAND:进程名称(命令名/命令行)

7、磁盘

7.1、查看磁盘剩余空间

查看磁盘剩余空间使用df -hl命令:
在这里插入图片描述

7.2、查看磁盘已使用空间

du -sh命令是查看磁盘已使用空间的情况,这里的“已使用的磁盘空间”意思是指定的文件下的整个文件层次结构所使用的空间,在没给定参数的情况下,du报告当前目录所使用的磁盘空间。
其实就是显示文件或目录所占用的磁盘空间的情况:

在这里插入图片描述

  • -h:输出文件系统分区使用的情况,例如:10KB,10MB,10GB等。
  • -s:显示文件或整个目录的大小,默认单位是KB。

du的详细信息可以通过 man du查看。

7.3、查看磁盘读写情况

通iostat查看磁盘总体的读写情况:
在这里插入图片描述

  • tps:该设备每秒的传输次数。
  • kB_read/s:每秒从设备(drive expressed)读取的数据量;
  • kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
  • kB_read:读取的总数据量;
  • kB_wrtn:写入的总数量数据量;

7.4、查看磁盘详细读写情况

通过iostat -x 1 3可以看到磁盘详细读写情况,没隔一秒输出一次一共输出3次,当看到I/O等待时间所占CPU时间的比重很高的时候,首先要检查的就是机器是否正在大量使用交换空间,同时关注iowait占比cpu的消耗是否很大,如果大说明磁盘存在大的瓶颈,同时关注await,表示磁盘的响应时间以便小于5ms:
在这里插入图片描述

avg-cpu表示总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值:

  • %user:CPU处在用户模式下的时间百分比。
  • %nice:CPU处在带NICE值的用户模式下的时间百分比。
  • %system:CPU处在系统模式下的时间百分比。
  • %iowait:CPU等待输入输出完成时间的百分比,如果%iowait的值过高,表示硬盘存在I/O瓶颈。
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
  • %idle:CPU空闲时间百分比
    1、如果%idle值高,表示CPU较空闲
    2、如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量
    3、如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。

Device表示设备信息

  • rrqm/s:每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
  • wrqm/s:每秒对该设备的写请求被合并次数
  • r/s:每秒完成的读次数
  • w/s:每秒完成的写次数
  • rkB/s:每秒读数据量(kB为单位)
  • wkB/s:每秒写数据量(kB为单位)
  • avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
  • avgqu-sz:平均等待处理的IO请求队列长度
  • await:平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
  • svctm:平均每次IO请求的处理时间(毫秒为单位)
  • %util:一秒中有百分之多少的时间用于 I/O如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷。idle小于70% IO压力就较大了,一般读取速度有较多的wait。

!! iostat -xmd 1 3:新增m选项可以在输出是使用M为单位。


8、查看最耗IO的进程

一般先通过iostat查看是否存在io瓶颈,再使用iotop命令来定位那个进程最耗费IO:
在这里插入图片描述
通过iotop -p pid可以查看单个进程的IO情况:

在这里插入图片描述


9、其它命令

9.1、查看某个进程的PID

如查看java的进程的pid,ps -ef | grep java:

在这里插入图片描述

9.2、查看特定进程的数量

如查看java进程的数量,ps -ef | grep java| wc -l:

在这里插入图片描述

9.3、查看线程是否存在死锁

查看线程是否存在死锁,jstack -l pid:

在这里插入图片描述

9.4、查看某个进程的线程数

ps -efL | grep [PID] | wc -l,如:
在这里插入图片描述
查看具体有哪些线程用ps -Lp [pid] cu:

在这里插入图片描述

9.5、统计所有的log文件中,包含Error字符的行

find / -type f -name “*.log” | xargs grep “ERROR”,这个在排查问题过程中比较有用:

在这里插入图片描述

9.6、应用启动时指定JVM参数

java -jar -Xms128m -Xmx1024m -Xss512k -XX:PermSize=128m -XX:MaxPermSize=64m -XX:NewSize=64m -XX:MaxNewSize=256m arthas-demo.jar,如:

在这里插入图片描述

9.7、排查命令

其它命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


10、arthas (推荐)

10.1、简介

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到 JVM 的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从 JVM 内查找某个类的实例?

10.2、官网

https://arthas.aliyun.com/

10.3、方案

  • Dashboard:实时查看系统的运行状况
  • 查看入参/返回值/异常:查看函数调用的参数,返回值和异常
  • 在线热更新:jad/sc/redefine 一条龙热更新代码
  • 类冲突:秒解类冲突问题,定位类加载路径
  • 性能热点:快速定位应用的热点,生成火焰图
  • WebConsole:在线诊断,点开网页诊断线上应用

10.4、基本命令

参考附件 Arthas.xmind.tar.gz


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java线上问题排查基本命令 的相关文章

随机推荐

  • React 合成事件

    文章借鉴 pingan8787 React合成事件 和 React合成事件官方文档 React 合成事件 一 概念介绍 React合成事件是React 模拟原生DOM事件所有能力 的一个事件对象 根据 W3C规范 来定义合成事件 兼容所有浏
  • UE4大数据可视化教程(21)——大屏云渲染通用像素流解决方案

    目录 项目打包前操作 复制信令服务器文件 快捷打开信令服务和启动项目 替换项目
  • 虚拟机中的Windows重置系统密码

    概述 相信大家不管是在企业还是个人都或多或少接触过虚拟机 在安装操作系统的时候 有的需要密码 而且默认有时总是提示需要更改密码 导致忘记密码 但又不能重装操作系统也不能回退就很烦 这里本博主今天突然想到这个问题就出一篇文章 虽然我没有忘记过
  • 软件工程基础知识复习宝典

    前言 此文档为个人大学时期应付期末考试时自行总结 用于理解并背诵相应的基本概念 一些计算和画图之类的内容需要结合书本例题进行复习 多做习题深刻掌握 中间大标题为老师给出的考纲中建议每一章需要掌握的一些知识点 如若需要doc文档版打印复习 请
  • [C++11]弱引用智能指针weak_ptr初始化和相关的操作函数

    弱引用智能指针 std weak ptr 可以看做是 shared ptr 的助手 它不管理 shared ptr 内部的指针 std weak ptr 没有重载操作符 和 gt 因为它不共享指针 不能操作资源 所以它的构造不会增加引用计数
  • 【YOLOv5】1.搭建Pycharm+Python+yolov5环境

    目录 一 安装Python 二 安装PyCharm 三 创建项目和虚拟环境 四 下载YOLOv5和依赖库 五 配置Pytorch 六 检验YOLOv5环境 一 安装Python 1 Python官方下载网址 Download Python
  • 解决echarts报错Cannot read properties of null (reading ‘getAttribute‘)

    前言 最近在写 echarts 的时候碰到了这么一个报错 如下图 造成报错的原因是因为 echarts 的图形容器还未生成就对其进行了初始化 下面几种方法是经本人自测最有效的解决方案 报错截图 解决方案 1 this nextTick 该方
  • c++ primer 中的文本查询示例

    前言 有个牛人叫bnu chenshuo 发微博说 回复 TheRealBo 学生编程练习 把 Unix 的命令行小工具用C C 实现一遍 wc cat ls cp grep sort uniq nc head tail hexdump 把
  • 电源正负极防反接保护的几种实现方案!

    电源防反接 应该是很多电路场景下都会采取到此系列得设计 前几日 小白在做单板验证时 在接上假电池然后电源供电时 一不小心将假电池的正负极与供电电源的输入输出接反了 导致单板烧坏 瞬间一缕青烟飘荡在我的座位上 由于我们的产品用的是真电池 所以
  • Ubuntu设置定时重启

    1 安装 更新 cron 安装crontab sudo apt get install cron 更新命令 sudo apt get update 2 配置cron定时任务 sudo nano etc crontab root reboot
  • c语言汇编混合编译不了,是用c语言和汇编混合编的程序,在keil里编译时出现C51 FATAL-ERROR -...

    满意答案 qun260 推荐于 2018 05 13 采纳率 59 等级 8 已帮助 312人 程序问题 LL SEGMENT CODE 在程序存储区中定义段 PUBLIC LED 声明函数 FLAG DATA 20H DPFLAG DAT
  • 几十行代码 轻松实现人脸识别、人脸检测

    人脸识别最近几年变得很火 技术也已经相对成熟 应用场景也很多 下面将介绍简单几种实现人脸检测 人脸识别的简单方法 我博客中也写了几篇有人脸识别应用的文章 现在分类总结下 人脸识别技术介绍已经近况以及应用 https blog csdn ne
  • Java8 利用Lambda处理List集合循环给另外一个List赋值过滤处理

    1 利用stream forEach 循环处理List List
  • mysql查询作为是否有连续以及是否有人

    有张表t1 表结构如图 0 表示座位没人 1表示座位有人 查询出座位是连续的且没有人的seat id SELECT DISTINCT a seat id from t1 as a t1 AS b WHERE a free 1 AND b f
  • golang base64解码编码实现

    golang base64解码编码实现 golang base64解码编码实现 go实现base64解码编码非常简单 知道调用go安装时自带的encoding base64就可以了 package main import encoding
  • ByteHouse 与 Apache Airflow 的数据管理流程

    动手点关注 干货不迷路 Apache Airflow 与 ByteHouse 相结合 为管理和执行数据流程提供了强大而高效的解决方案 本文突出了使用 Apache Airflow 与 ByteHouse 的主要优势和特点 展示如何简化数据工
  • 哈希表冲突及处理冲突的方法(含例子)

    一 哈希函数和哈希冲突的基本概念 1 哈希函数 哈希法又称散列法 杂凑法以及关键字地址计算法等 相应的表成为哈希表 基本思想 首先在元素的关键字K和元素的位置P之间建立一个对应关系f 使得P f K 其中f成为哈希函数 创建哈希表时 把关键
  • Pinpoint--基础--3.1--安装部署--环境准备

    Pinpoint 基础 3 1 安装部署 环境准备 前提 使用hd用户登陆 完成基础环境搭建 https blog csdn net zhou920786312 article details 118212302 代码位置 https gi
  • Java学习笔记

    Java学习笔记 1 知识点 1 0Hello World 1 1Java的枚举 1 2类的构造函数 初始化对象 1 3访问实例变量 调用成员方法 1 4一个源文件只能有一个public类 且与源文件名称保持一致 可以有多个非public类
  • java线上问题排查基本命令

    1 jvm基本命令 1 1 java命令 1 1 1 简介 java命令启动java应用程序 它通过启动Java运行时环境 JRE 加载指定的类并调用该类的main 方法来实现这一点 1 1 2 命令链接 https docs oracle