系列文章——
生产环境实践(一):保存运行时信息(堆栈、CPU、内存、IO等)
在《生产环境实践(一):保存JVM运行时信息(堆栈、CPU、GC等)》中提到了如何保持生产环境信息。
本章让我们看看生产环境需要关注那些指标以及一些运维工具的介绍。
考虑到大部分情况下生产使用的是Linux系统,本篇内容将采用Linux系统来讲述这些工具的使用说明。
毕竟——
工欲善其事必先利其器
CUP
TOP用于实时显示CPU各种指标的使用情况。等同于windows的任务管理器。
top
-
第一行(系统综合信息)
信息 说明 12:24:18 系统时间 up 66 days, 14:55 运行时间 3 users 当前登录用户 0.00, 0.00, 0.00 负载均衡(1min/5min/15min) -
第二行(任务信息)
信息 说明 210 total 进程总数 1 running 正在运行的进程数 195 sleeping 休眠的进程数 14 stopped 停止的进程数 0 zombie 僵尸进程数 -
第三行(CPU使用情况)
信息 说明 0.1 us 用户空间占用CPU百分比 0.0 sy 内核空间占用CPU百分比 0.0 ni 改变过优先级的进程占用CPU百分比 99.9 id 空闲CPU百分比 0.0 wa 等待IO占用CPU百分比 0.0 hi 硬中断占用CPU百分比 0.0 si 软中断占用CPU百分比 0.0 st 虚拟机占用百分比 -
第四行(内存使用情况)
信息 说明 16423720 物理内存总量(KB) 618952 空闲中的内存总量(KB) 8128964 使用中的内存总量(KB) 7675804 缓存的内存总量(KB) -
第五行(Swap分区使用情况)
信息 说明 8388604 交换区总量(KB) 8271280 空闲中的交换区总量(KB) 117324 使用中的交换区总量(KB) 7742344 可用于进程下一次分配的物理内存数量(KB) -
列表(进程信息)
列名 说明 PID 进程ID USER 进程所有者 PR 进程优先级 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 进程名称
TOP查看某一进程下各线程暂用资源
# -H:显示线程信息,-p:指定pid
top -Hp ${pid}
如上图所示查看JAVA进程的线程使用情况,此时的PID
表示线程ID,可以方便观察到占用CPU资源最大的线。结合我们之前所说的jstack
名称可以找到具体的线程,方便用于排查问题。
TOP结果存储到文件
# 线程资源占用(考虑CPU切换 保存3次 -n3)
top -Hp $pid -b -n3 >> $file_path/top.log
以上就是针对TOP命令的基本介绍。
内存
内存也是生产环境的重要参考指标,free命令用于查看系统内存的使用情况。
# -m:表示以MB为单位
free -m
Men:表示物理内存 / Swap:交换分区(类似Windows的虚拟内存)
total:内存总量 total ≈ userd + free + buff/cache
used:已经使用的内存总量
free:空闲的内存总量
shared:多个进程共享的内存总量
buff/cache:buff/cache暂用内存总量
available:可以被应用程序使用的内存总量 available ≈ free + buffer/cache
磁盘
-
磁盘空间
Linux一切皆文件,磁盘的重要性不言而喻。磁盘空间不足会引发各种程序不可用的问题。
# -h 以人们较易阅读的GB,MB,KB等格式自行显示 df -h
Filesystem:文件系统对应的设备文件的路径名
Size:分区的总大小
Used:已使用磁盘空间
Avail:可使用磁盘空间
Use%:已使用空间占比
Mounted On:磁盘挂载的目录
-
磁盘IO
iostat
# 如果没有可以安装(iostat属于sysstat软件包) yum install sysstat # -x:显示详细信息 iostat -x
CPU信息说明:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。
DISK属性说明:
rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
r/s: 每秒完成的读 I/O 设备次数。即 rio/s
w/s: 每秒完成的写 I/O 设备次数。即 wio/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
avgqu-sz: 平均I/O队列长度。
await: 平均每次设备I/O操作的等待时间 (毫秒)。
r_wait:每个读操作平均所需要的时间,不仅包括硬盘设备读操作的时间,也包括在内核队列中的时间。
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
w_wait: 每个写操平均所需要的时间,不仅包括硬盘设备写操作的时间,也包括在队列中等待的时间。
%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
网络
网络是需要关注的一个重点,特别是服务涉及高并发、消息发送、批量任务等。
dstat
dstat 命令是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具。
# 如果没有可以先安装此命令
yum install dstat
# pid:进程号
dstat $pid
分组 | 说明 |
---|---|
CPU统计 | CPU使用率:用户占比、系统占比、空闲占比、等待占比、硬中断以及软中断 |
磁盘统计 | 磁盘读写:读数据总量、写数据总量 |
网络统计 | 网络设备收发统计:接受数据大小,发送数据大小 |
分页统计 | 系统分页活动:显示换入(in)和换出(out) |
系统统计 | 系统统计:中断(int)和上下文切换(csw) |
JDK
JDK也提供了许多好用的工具来帮助我们诊断生产问题。接下来我将介绍几款JDK自带的工具。
-
jps
# 获取JAVA相关进程 jps
-
jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。
# 类加载统计 jstat -class ${pid}
# 编译统计 jstat -compiler ${pid}
# GC统计 jstat -gc ${pid}
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
# 保存GC信息信息 jstat -gc ${pid} >> ${file_path}/gc.log
-
jmap
# 查看堆内存使用情况 jmap -heap ${pid}
# 保存堆dump文件(live表示仅存活)到指定的路径 jmap -dump:live,format=b,file=${file_path}/heap.hprof ${pid}
提示:堆dump文件可以导入MAT工具中方便我们排查线上问题。后续的章节我会陆续推出JAVA堆栈dump的介绍。
-
jstack
# 查看栈信息 jstack ${pid}
提示:栈日志非常重要,是用于排查阻塞、死锁等问题的关键信息。后续章节在展开讨论。
# 保存栈日志 jstack ${pid} >> ${file_path}/stack.log
Docker
容器技术以及成为主流方向。让我们简单看看docker有哪些监控把。
# 容器占用资源情况
docker stats
CONTAINER ID:容器ID
NAME:容器名
CPU%:占用CPU百分比
MEM USAGE / LIMIT:当前使用内存/最大可用内存
MEM%:占用内存百分比
NET I/O:网络IO情况
BLOCK I/O:磁盘IO情况
PIDS:进程ID
# 查看容器日志,container:容器名或者ID
docker logs -f ${container}
# --tail:最近n行信息
docker logs -f --tail ${n} ${container}
本篇主要介绍了生产环境常用的性能监控工具。下一个篇章将带大家看看堆栈dump的解读。敬请期待!