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