线上系统异常linux跟踪命令大致流程(JVM)

 
1 如果不知道CPU核数,可以先看CPU核数
mpstat -P ALL 2 1     //每2秒打印一次,并且只打印一次
其他:如何要看详细请用sar -P ALL
 
 
 
参数
释义
从/proc/stat获得数据
CPU
处理器ID
 
%usr
在internal时间段里,用户态的CPU时间(%),不包含 nice值为负进程
usr/total*100
%nice
在internal时间段里,nice值为负进程的CPU时间(%)
nice/total*100
%sys
在internal时间段里,核心时间(%)
system/total*100
%iowait 
在internal时间段里,硬盘IO等待时间(%)
iowait/total*100
%irq
在internal时间段里,硬中断时间(%)
irq/total*100
%soft
在internal时间段里,软中断时间(%)
softirq/total*100
%steal
显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比
steal/total*100
%guest
显示运行虚拟处理器时CPU花费时间的百分比
guest/total*100
%gnice
 
gnice/total*100
%idle
在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%)
idle/total*100
 
      
2 使用top查看系统状态
top
其中 M 内存排序,P cpu排序
top -p pid 指定某个进程id
 
 
 
可用free -h 查看内存
 
 
 
也可用df -h查看当前磁盘空间,du -h --max-depth=1 查看当前目录下的各个目录使用空间
 
3 上面top如果有异常,我们可以取top有异常的进程ID pid来分析
1 首先查看java GC状态(定位JVM内存状态)
jstat -gc 23042 5 5             //公式:jstat -gc pid [interval]
说明:主要看他的full gc老年代次数(看新生代GC也行),如果GC次数过多,可能就是内存泄漏问题了
 
 
 
4 定位JVM内存状态发现GC异常,我们这时需要保存栈、堆的现在信息来分析
保存线程栈现场:jstack 23042 > jstack.log                            // 得到jstack.log文件
保存堆现场:jmap -dump:format=b,file=heap.log 23042                  // 得到heap.log文件
 
5 分析栈现场的日志
统计线程数:grep 'java.lang.Thread.State' jstack.log  | wc -l
521       // 会输出一个行数
看线程状态是否正常: grep -A 1 'java.lang.Thread.State' jstack.log  | grep -v 'java.lang.Thread.State' | sort | uniq -c |sort -n
 
 
备注:如果对应等待或休眠过大那就可能是异常了
 
6 MAT分析堆现场日志(由于这个日志是二进制,所以无法直接用linux命令分析)
1 先将heap.log 日志改为 heap.hprof
然后使用MAT打开heap.hprof文件,选择如下,在A点 通过报名进行过滤,比如公司项目报名前缀为 com.lisam.xxxx,输入"com.lisam.*" 就可以过滤出这些对象的使用频率了。
 
 
 
7 当然还需要结合线上错误日志、nginx访问日志、链路监控日志、接口访问日志等来判断系统异常,具体就要结合公司的系统架构了。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章