0%

jvm04_性能监控&故障处理

JDK的命令工具

jps:虚拟机进程状况工具

命令格式:

jps [options] [hostid]

jps 工具主要选项

选项 作用
-q 只输出LVMID 省略主类名称
-m 输出虚拟机经常启动时传递给主类main() 函数的参数
-l 输出主类的全名
-v 输出虚拟机进程启动时JVM参数

jps还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态。hostid为RMI注册表中注册的主机名。

jstat:虚拟机统计信息监视工具

主要用来查看内存使用情况,和GC情况。

jstat命令格式为:

jstat [opention vimid [ interval [ s|ms ] ] [count] ]

interval和count参数代表查询间隔和次数,如果省略表示只查一次。如果需要每个250毫秒查询一次进程2764垃圾收集情况,一共查询20次:

jstat -gc 2764 250 20

选项 作用
-class 监视类装载、卸载数量、总空间以及类装载所消耗的时间
-gc 监视java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、医用空间、GC时间合计等信息
-gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间在总空间的百分比。
-gccause 与gcutil功能一样,但是会二外输出导致上一次GC产生的原因
-gcnew 监视新生代GC状况
-gcnewcapacity 功能与gcnew相同,输出主要关使用到的最大、最小空间
-gcold 监视老年代GC状况
-gcoldcapacity 功能与gcold相同,输出主要关使用到的最大、最小空间
-gcpermcapacity 输出永久代用到的最大、最小空间
-compiler 输出JIT编译期编译过的方法、耗时等信息
-printcompilation 输出已经被JIT编译的方法

jmap:java内存映象工具

jmap主要用于生成堆转储快照(heapdump)。
获取java堆转储快照的方式有三种

  1. -XX:+HeapDumpOnOutOfMemoryError :虚拟机出现OOM异常后自动生成dump文件
  2. -XX:+HeapDumpOnCtrlBreak : 使用Ctel+break键让虚拟机生成dump文件
  3. jmap

jmap命令格式:

jmap [option] vmid

选项 作用
-dump 生成堆转储快照。格式为 -dump:[live,]format=b,file=<filename>
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。(只在Linux、Solaris平台下有效)
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat 以ClassLoader为口径显示永久代内存状态。(只在Linux、Solaris平台下有效)
-F 当虚拟机堆-dump命令没有响应时,可用和这个选项强制生成dump快照。(只在Linux、Solaris平台下有效)

jstack:Java堆栈跟踪工具

jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者jvavacore文件)。

主要目的是定位线程出现长时间停顿的原因,如线程间死锁死循环请求外部资源导致长时间等待等都是导致线程长时间停顿的常见原因。

jstack命令格式:

jstack [option] vmid

选项 作用
-F 正常输出请求不被响应时,强制输出线程堆栈。
-l 除堆栈外,显示关于锁的附加信息
-m 如果调用到本地方法的话,可以显示C/C++的堆栈

jhat:虚拟机堆转储快照分析工具

一般不用和这个,直接用visualVM

VisualVM:多合一故障处理工具

即jvisualvm,用于分析dump文件等。

第三方排查工具

Arthas

Arthas 是Alibaba开源的Java诊断工具,功能比较强大,支持直接反编译查看代码。

https://alibaba.github.io/arthas/

Linux常见故障排查命令

netstat

找出运行在指定端口的进程

netstat -tunlp | grep 80

-t或–tcp 显示TCP传输协议的连线状况。
-u或–udp 显示UDP传输协议的连线状况。
-n或–numeric 直接使用IP地址,而不通过域名服务器。
-l或–listening 显示监控中的服务器的Socket。
-p或–programs 显示正在使用Socket的程序识别码和程序名称。

1
2
3
4
5
[root@kudu4 admin]# netstat -tunlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7313/nginx: worker
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 31017/java
tcp 0 0 0.0.0.0:8084 0.0.0.0:* LISTEN 5449/java
tcp 0 0 0.0.0.0:8090 0.0.0.0:* LISTEN 25025/java

每天一个linux命令(56):netstat命令

磁盘管理

df

df -h

1
2
3
4
5
6
7
8
9
10
11
[root@kudu4 admin]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 36G 30G 5.5G 85% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 25M 7.8G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/vdb1 99G 5.0G 89G 6% /data
/dev/vda1 1014M 145M 870M 15% /boot
tmpfs 1.6G 0 1.6G 0% /run/user/0
tmpfs 1.6G 0 1.6G 0% /run/user/1000

du

统计目录(或文件)所占磁盘空间的大小。该命令的功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出指定目录,则对当前目录进行统计。

du -h ./ -d 1

1
2
3
4
5
6
7
8
9
10
11
[root@kudu4 admin]# du -h ./ -d 1
58M ./.arthas
4.0K ./.oracle_jre_usage
0 ./.pki
4.0K ./.vim
16K ./.ssh
7.2G ./app
900M ./temp
620M ./home
92K ./logs
8.8G ./

free

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一。

free -h

1
2
3
4
[root@kudu4 admin]# free -h
total used free shared buff/cache available
Mem: 15G 9.2G 1.6G 23M 4.8G 5.9G
Swap: 3.9G 860M 3.0G

第一列

Mem 内存的使用信息
Swap 交换空间的使用信息

第一行
total 系统总的可用物理内存大小
used 已被使用的物理内存大小
free 还有多少物理内存可用
shared 被共享使用的物理内存大小
buff/cache 被 buffer 和 cache 使用的物理内存大小
available 还可以被 应用程序 使用的物理内存大小

free 与 available 的区别
free 是真正尚未被使用的物理内存数量。

available 是应用程序认为可用内存数量,available = free + buffer + cache (注:只是大概的计算方法)

Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。

TOP

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

top

PS

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。

ps -ef | grep 进程号

tail

tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.

tail -fn 2000 aa.log

可以结合grep命令一起使用

常用Linux日志查看命令

iostat

Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat属于sysstat软件包。可以用yum install sysstat 直接安装。

每天一个linux命令(47):iostat命令

线上问题定位

CPU使用率过高(java进程,定位到哪一段代码)

  1. 在Lmⅸ命合行下使用TOP命查看每个进程的情况

  2. 再使用top的交互命令数字1查看每个CPU的性能数据。(如果
    这里显示CPU利用率100%,则很有可能程序里写了一个死循环。)

  3. 使用top的交互命令H查看每个线程的性能信息。

    • 某个线程CPU利用率一直100%,则说明是这个线程有可能有死循环,那么请记住这个PID。(也可能是Full GC造成,jstat查看GC情况)
    • 某个线程一直在TOP10的位置,这说明这个线程可能有性能问题
    • CPU利用率高的几个线程在不停变化,说明并不是由某一个线程导致CPU偏高。
  4. jstack dump线程信息,看下是哪个线程、执行哪一行代码造成CPU利用率高。

dump出来的线程ID(nid)是十六进制的,而我们用TOP命命看到的线程ID是十进制的,所以要用pin倫命合转换一下进制。然后用十六进制的ID去dump里找到对应的线程。

OOM异常排查(经常Full GC)

用jmap dump jvm堆数据,通过jvisualvm进行分析,看是哪一个类创建过多,一直追溯到上游。