Java线上系统排查的四大工具:
top:监控CPU信息
load average: 1min 5min 15min前到现在的平均值(不能持续大于cpu个数)
cpu percent:
us:用户空间占用CPU百分比(长期大于50%,需要考虑优化用户的程序)
sy:内核空间占用CPU百分比(us + sy 的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足)
id: 空闲CPU百分比(长期大于90%,说明资源浪费)
wa:IO等待所占用的CPU时间的百分比(磁盘或者网络繁忙,大量磁盘读写的应用如数据库)
技巧:输入大写P,则结果按CPU占用降序排序;输入大写M,结果按内存占用降序排序;输入H显示线程信息
free -m / top:查看内存信息
Mem: 物理内存
Swap: 交换区,也叫虚拟内存,使用磁盘替代内存(当内存不够用时,会将不常用的程序踢到swap区)
buffers:是指用来给块设备做的缓冲大小,主要记录文件系统的metadata,cached:是用来给文件做缓冲
实际程序可用内存 = free + (buffers + cached)
实际程序已用内存 = used – (buffers + cached)
iostat:监控磁盘信息
iostat -d -k 2 ( -d 显示设备(磁盘)使用状态;-k 磁盘读写速度单位为KB ;2 数据显示每隔2秒刷新一次)
iostat -d -m 2 (-m 表示磁盘读写速度单位为MB)
iostat -d -x -k 1 10 (查看设备使用率%util、响应时间await,10 显示10次退出,-x 扩展选项)
await:平均每次设备I/O操作的等待时间,单位毫秒,这个时间包括了队列时间和服务时间
svctm: 平均每次设备I/O操作的服务时间,单位毫秒
一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题
%util: 在统计时间内所有处理IO时间,除以总共统计时间,该参数暗示了设备的繁忙程度,数值约大,磁盘越繁忙
netstat:查看网络信息
-a: 获取当前所有连接
-t:指明显示 TCP 端口
-u:指明显示 UDP 端口
-l: 仅显示监听套接字
-p:显示进程标识符和程序名称,每一个套接字/端口都属于一个程序。
-n:不进行 DNS 轮询,显示 IP (可以加速操作)
netstat -an | grep :80 | sort (80 可以用来监控http web 服务,如果同一个 IP 有大量连接,则判定该 IP 疑似存在单点流量攻击行为)
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr (计算每个主机连接到本机的连接数)
netstat -nltu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr(检查 ESTABLISHED 连接并且列出每个 IP 地址的连接数量)
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -nr(TCP各种状态列表列表,并按照数量排序)
netstat -antp | grep 8007(查看端口占用的进程,程序启动时会遇到端口已经占用,则可以根据端口查进程然后kill掉)
netstat -antp | grep 13722 (查看进程占用的端口,了解当前进程所有开的端口号)
明天整理一下 jvm排查的7中命令:
jps(查看哪些java进程处于运行状态)、
jstack(查看某个进程的堆栈信息(常用命令:jstack pid))、
jinfo:输出JAVA系统参数及命令行参数,并修改运行时的java 进程的opts(常用命令:jinfo pid)、
jstat:主要是针对Heap size和垃圾回收状况的监控、
jmap:查看堆内存使用状况,dump堆内存,以及判断是哪个Object占用了堆内存、
jhat:JAVA heap离线分析的工具