Java 服务的线上问题从系统表象来看大致可分成两大类: 系统环境异常、业务服务异常。
(1)CPU 性能分析:使用 top
命令,能够实时显示系统中各个进程的资源占用状况。
相关参数说明:
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 : 进程名称
(2)内存使用情况分析:使用 free
命令,来显示的当前内存的使用情况。
相关参数说明:
total:内存总数
used:已经使用的内存数
free:空闲的内存数
shared:当前已经废弃不用, 总是 0
buff/cache:缓存内存数
available:可用的内存数
(3)磁盘使用情况分析:使用 df
或者 du
命令,查看磁盘使用情况。
相关参数说明:
Filesystem:文件系统位于哪个分区
1K-blocks:文件系统的总大小,默认以 KB 为单位
Used:用掉的硬盘空间大小
Available:剩余的硬盘空间大小
Use%:硬盘空间使用率
Mounted on:文件系统的挂载点,也就是硬盘挂载的目录位置
(4)网络连接状态分析:使用 netstat
命令,查看系统中网络连接状态信息。
常用参数:
-a:显示本机所有连接和监听的端口
-n:不解析域名
-t:显示tcp协议连接
-u:显示udp协议连接
-p:显示连接对应的PID与程序名
相关参数说明:
Proto:连接协议的种类
Recv-Q:接收到字节数
Send-Q:从本服务器,发出去的字节数
Local Address:本地的IP地址,可以是IP,也可以是主机名
Foreign Address:远程主机的IP 地址
State:网络连接状态
PID/Program name:进程id以及进程名称
网络连接状态各值的含义:
CLOSED(关闭):指网络连接尚未建立,也没有终止。
LISTEN(监听):指服务器在等待客户端发起连接请求。
ESTABLISHED:表示连接已经建立,数据可以通过该连接传输。
CLOSE_WAIT:表示连接已关闭,但是连接方还没有释放资源,需要等待连接方释放资源后才会进入CLOSED状态。
TIME_WAIT:表示连接在建立之后,发送端发送数据包后等待接收端响应的时间。如果接收端没有响应,发送端会进入TIME_WAIT状态,等待一段时间后才会进入CLOSED状态。
DESTROY:表示连接已经被销毁,无法进行任何数据传输。
(5)vmstat:是 Virtual Meomory Statistics(虚拟内存统计)的缩写 , 是实时系统监控工具。
参数详解:
vmstat 后面第一个参数是采样的时间间隔数单位是秒,第二个参数是采样的次数。
-- procs
r:表示处于运行队列中(正在运行或等待运行)的进程数。
b:表示处于不可中断睡眠状态的进程数。
-- memory
swpd:表示被换出到交换空间的内存大小(单位:KB)。
free:表示空闲内存大小(单位:KB)。
buff:表示用作缓冲区的内存大小(单位:KB)。
cache:表示用作缓存的内存大小(单位:KB)。
-- swap
si:表示每秒从磁盘读入交换区的数据量(单位:KB)。
so:表示每秒写入到磁盘的交换区数据量(单位:KB)。
-- I/O
bi:表示每秒从块设备读入的数据量(单位:块,一般为 512 字节)。
bo:表示每秒向块设备写入的数据量(单位:块,一般为 512 字节)。
-- system
in:表示每秒产生的中断数。
cs:表示每秒上下文切换的次数。
-- CPU
us:表示用户空间占用 CPU 时间的百分比。
sy:表示内核空间占用 CPU 时间的百分比。
id:表示空闲 CPU 时间的百分比。
wa:表示等待 I/O 的 CPU 时间百分比。
st:表示被虚拟机偷走的 CPU 时间的百分比。
(1)jps:查询当前机器所有 JAVA 进程信息;
jps [ options ] [ hostid ]
options是命令行参数,hostid指特定主机,可以是ip地址、域名, 也可以指定具体协议和端口
options参数说明:
-q:只输出PID。
-m:输出传递给 main 方法的参数。对于嵌入式 JVM,输出可能为空。
-l:输出应用程序主类的完整包名或应用程序 JAR 文件的完整路径名。
-v:输出传递给 JVM 的参数。
(2)jmap:输出某个 java 进程内存情况;
jmap [options] pid
options参数说明:
-heap:查看Java堆的详细信息,包括堆的总大小、已用大小、空闲大小、对象数量等。
-histo:查看Java堆中各个类的实例数量、内存占用大小等信息,可用于查找内存泄漏等问题。
-permstat:查看永久代内存的使用情况。
-F:无法连接Java进程时强制执行,但可能会导致进程暂停。
(3)jstack:打印某个 Java 线程的线程栈信息;
jstack [ options ] pid
options参数说明:
-F:没有响应时,强制打印一个堆栈转储
-l:打印关于锁的其他信息,比如拥有的java.util.concurrent ownable同步器的列表
-m:打印包含Java和本机C/ C++帧的混合模式堆栈跟踪
-h:打印帮助信息
(4)jstat:查看堆内存各部分的使用量,以及加载类的数量;
jstat [option vmid [interval[s|ms] [count]] ]
参数说明:
option:需要监控的数据类型。如:-gc表示监控垃圾收集相关的统计信息;-gccapacity:监控各个区域的大小。
vmid:Java虚拟机的标识符,通常是进程ID。
interval:采样间隔,单位可以是秒(s)或毫秒(ms)。
count:采样次数。
(5)jinfo:用于查看 jvm 的配置参数;
jinfo [option] pid
参数说明:
-flags:显示全部的配置参数
-flag name:输出对应名称的参数
-flag [+|-]name:开启或者关闭对应名称的参数
-sysprops:输出系统属性
GC 日志是用于定位问题重要的日志信息,在 java 应用的启动参数中增加-XX:+PrintGCDetails
可以输出 GC 的详细日志,根据GC日志可以看出jvm垃圾回收的相关信息。无论是 minor GC 或者是 Full GC,我们主要关注 GC 回收的耗时以及频率。
可以根据系统出错的大概时间,找到服务器上该时间段的日志,再根据日志去分析具体出错的位置。业务日志除了关注系统异常与业务异常之外,还要关注服务执行耗时情况,耗时过长的服务调用如果没有熔断等机制,很容易导致应用性能下降或服务不可用。