java线上问题排查基本命令

news2024/12/28 3:10:12

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

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、排查命令

在这里插入图片描述

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

electron 连接打印机打印pdf文件

electron 打印内容 区分系统 类似unix系统的使用 npm包&#xff1a;unix-printwindow系统使用&#xff1a; pdf-to-printer 运行线程 视图线程 函数参数 两个包都提供了print函数来打印文件&#xff0c;配置基本一致&#xff0c;只是参数形式有所不同&#xff0c;pdf-to-pr…

ESP32开发环境搭建Windows VSCode集成Espressif IDF插件ESP32_IDF_V5.0开发编译环境搭建

一、安装ESP32-IDF库 下载网址&#xff1a;https://dl.espressif.com/dl/esp-idf/ 打开上面的网页&#xff0c;选择单击页面中 ESP32-IDF v5.0.2 - Offine Installer&#xff0c;5.0.2是当前最新版本&#xff0c;如果没有ESP32-IDF v5.0.2 - Offine Installer&#xff0c;说明…

JS获取省市区/县,layui获取省市区,layui实现省市区联动,jquery实现省市区联动

前言 通过JS方式获取省市区数据&#xff0c;可自己手动更改JS文件数据 非常简单 效果 实现 百度网盘链接: https://pan.baidu.com/s/1RktJgXY0NP7Eq0ohvBPOEA 提取码: 477z gitee下载链接&#xff1a;https://gitee.com/yuanyongqiang/common-files/blob/master/area.js 下…

超高压系列IXBX50N360HV、IXBT14N300HV、IXBH32N300高压反向导通 (BiMOSFET™) IGBT器件

器件介绍&#xff1a; 超高压系列3000V - 3600V反向导通 (BiMOSFET™) IGBT将MOSFET和IGBT的优势相结合。这些高压器件的饱和电压和内置二极管的正向电压降均具有正电压温度系数&#xff0c;因此非常适合用于并联运行。“自由”内置体二极管用作保护二极管&#xff0c;为器件关…

LibOS Gramine安装

文章目录 参考资料Gramine安装运行helloworld升级kernel到5.15 参考资料 Gramine Quick start Gramine安装 Gramine安装要求&#xff1a; Linux 内核版本至少为 5.11&#xff08;启用 SGX 驱动程序&#xff09; 如果是5.4.0-150-generic版本&#xff0c;则可以参考《Install …

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像写入相机内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像写入相机内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和相机内存的技术背景Baumer工业相机通过BGAPISDK将相机图像写入相机内存功能1.引用合适的类文件2.通过BGAPISDK将相机图像写入相机内存功能…

ADManager Plus:提升企业管理效率的强大利器

导语&#xff1a; 在当今数字化时代&#xff0c;企业管理的重要性不言而喻。有效的企业管理可以提高生产力、优化业务流程&#xff0c;并促进组织的持续增长。而ADManager Plus作为一款功能强大的企业管理工具&#xff0c;为企业提供了全面的解决方案&#xff0c;帮助企业管理…

从0到1精通自动化测试,pytest自动化测试框架,Fixture之conftest.py与yield实现teardown(四)

目录 一、Fixture之conftest.py 1、Fixture优势 2、fixture参数传入&#xff08;scope”function”&#xff09; 3、conftest.py配置 二、Fixture之yield实现teardown 1、scope“module” 2、yield执行teardown 3、yield遇到异常 4、addfinalizer终结函数 一、Fixture…

【云原生•监控】基于Prometheus的云原生集群监控(理论+实践)-01

【云原生•监控】基于Prometheus的云原生集群监控(理论实践)-01 前言 「笔者已经在公有云上搭建了一套临时环境&#xff0c;可以先登录体验下&#xff1a;」 http://124.222.45.207:17000/login 账号&#xff1a;root/root.2020 云原生监控挑战 Prometheus 是用 Go 语言编写&am…

FreeRTOS实时操作系统(四)中断任务管理

系列文章目录 文章目录 系列文章目录前言中断优先级FreeRTOS中的中断管理一系列中断管理寄存器中断配置寄存器中断屏蔽寄存器 中断管理实战 前言 跟着正点原子学习一下中断管理&#xff0c;正好之间没有总结过&#xff0c;还有些地方不清楚。 中断优先级 中断的工作方式就不介…

Oracle的DCL、DDL、DML语言学习使用——oracle入门学习(一)

Oracle的DCL、DDL、DML语言学习使用 前言1.SQL Plus1.1 命令行SQL PLUS使用sqlplus /nologsqlplus / as sysdba 1.2 oracle自带SQL PLUS使用1.3 sys和system用户的区别 2. Oracle的体系结构3.DCL语言什么是DCL语言3.1 查看数据文件位置和表空间3.2 创建表空间3.3 删除表空间3.4…

鉴源实验室丨TBOX通讯模组AT指令测试

作者 | 李伟 上海控安安全测评部总监 来源 | 鉴源实验室 引言&#xff1a;上一篇文章我们讲了整车的OTA升级测试(详解车载设备FOTA测试&#xff09;&#xff0c;本篇我们介绍在车载零配件上比较少见却很实用的测试&#xff1a;通讯模组的AT&#xff08;Attention&#xff09;指…

总结Nginx的安装、配置与设置开机自启

在Ubuntu下安装Nginx有以下方法&#xff0c;但是如果想要安装最新版本的就必须下载源码包编译安装。 一、Nginx安装 1、基于APT源安装 sudo apt-get install nginx 安装好的文件位置&#xff1a; /usr/sbin/nginx&#xff1a;主程序 /etc/nginx&#xff1a;存放配置文件 /us…

高压放大器可以驱动电机吗

高压放大器可以驱动电机。事实上&#xff0c;高压放大器在许多应用中都是电机控制的核心部件之一。高压放大器可以将输入信号转换为高电压和高电流&#xff0c;从而驱动电动机。 一、高压放大器的原理 高压放大器是一种电子设备&#xff0c;用于将低功率信号转换为高功率信号。…

云原生之深入解析如何在Kubernetes下快速构建企业级云原生日志系统

一、概述 ELK 是三个开源软件的缩写&#xff0c;分别表示 Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个 FileBeat&#xff0c;它是一个轻量级的日志收集处理工具 (Agent)&#xff0c;Filebeat 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输…

Lombok你不知道的用法

Lombok是大家经常用的一款工具&#xff0c;它可以帮我们减少很多重复代码的书写&#xff0c;但是我们对它的使用&#xff0c;可能更多局限于实体类的编写&#xff0c;比如说通过Data注解实现减少getter/setter/toString等方法的编写&#xff0c;其实它还有更多的注解功能&#…

美依礼芽破圈!小红书数据解读,如何拨动二次元心弦?

今年&#xff0c;二次元存在感爆棚。新世代下二次元群体愈发壮大&#xff0c;不少博主发布二次元内容、品牌也试图融入二次元圈。那么&#xff0c;如何与之打成一片呢&#xff1f;今天&#xff0c;通过小红书数据&#xff0c;我们来解读二次元的内容方向。 点赞破8亿&#xff0…

【每日一题】1595. 连通两组点的最小成本

【每日一题】1595. 连通两组点的最小成本 1595. 连通两组点的最小成本题目描述解题思路 1595. 连通两组点的最小成本 题目描述 给你两组点&#xff0c;其中第一组中有 size1 个点&#xff0c;第二组中有 size2 个点&#xff0c;且 size1 > size2 。 任意两点间的连接成本…

对象的构造

问题 对象中成员变量的初始值是多少&#xff1f; 成员变量的初始值 #include <stdio.h>class Test { private:int i;int j; public:int getI() { return i; }int getJ() { return j; } };Test gt;int main() {printf("gt.i %d\n", gt.getI());printf("…

UE中使用Editor Utility Widget创建编辑器工具

在UE中可以使用EditorUtilityWidget创建编辑器面板工具&#xff0c;方便平时的开发。在UE4中使用编辑器UI需要开启对应插件&#xff0c;而UE5中则默认启用&#xff0c;下面就来学习一下。 1.UI创建 1.1.在Content Browser中右键&#xff0c;找到Editor Utilities即可创建编辑…