参考文章: https://mp.weixin.qq.com/s/OihP6sS1-HzyOP_H3odX8g
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访问日志、链路监控日志、接口访问日志等来判断系统异常,具体就要结合公司的系统架构了。