线上故障排查,主要包括CPU,磁盘,内存以及网络。基本上出问题就是 df、free、top 三连,然后依次 jstack、jmap
- df:用于显示文件系统的磁盘空间使用情况。
df -h:以人类可读的方式显示磁盘空间使用情况。
df -T:显示文件系统类型。
df -i:显示inode的使用情况。
- free:用于显示系统内存使用情况。
free -h:以人类可读的方式显示内存使用情况。
free -m:以 MB 为单位显示内存使用情况。
free -g:以 GB 为单位显示内存使用情况。
- top:用于实时监视系统进程的活动情况。
在 top 命令中,你可以看到 CPU 使用率、内存使用率、进程列表以及各个进程的详细信息。
按下 q 键可以退出 top 命令。
这些命令是在 Linux 系统中进行系统监控和性能调优时经常用到的工具,能够帮助你快速了解系统的运行状况。今天我们主要讲解CPU占用过高的处理步骤和方法,系好安全带发车~
一、CPU占用过高
-
通过top命令查看查看各个进程的使用情况,默认按照CPU的使用率排序
top 命令显示了各个进程 CPU 使用情况 , 一般 CPU 使用率从高到低排序展示输出。其中 Load Average 显示最近 1 分钟、5 分钟和 15 分钟的系统平均负载,上图各值为2.00,0.84,0.89
我们一般会关注 CPU 使用率最高的进程2634 -
使用top -H -p 2634找到该进程下占用CPU最高的线程
-
使用printf ‘%x\n’ pid将CPU使用率最高的线程号转化为16进制
得到pid
-
使用jstack排查问题
Pid得到nid
接着直接在 jstack 中找到相应的堆栈信息jstack pid |grep ‘nid’ -C5 –color,或者将该进程的thread dump文件保存
jstack: jstack一般用于查找业务逻辑死循环,频繁gc,上下文切换过多等问题
-
分析dump文件
jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈
在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x246c的线程调用栈中,发现该线程一直在执行JstackCase类第33行的calculate方法,得到这个信息,就可以检查对应的代码是否有问题。
thread dump分析线程的状态
在dump中,线程一般存在如下几种状态:
1、RUNNABLE,线程处于执行中
2、BLOCKED,线程被阻塞
3、WAITING,线程正在等待
一般情况下,我们会比较关注 WAITING 和 TIMED_WAITING 的部分,BLOCKED状态是一定有问题的,如果WAITING 和 TIMED_WAITING状态较多,也不正常
- 查看状态cat jstack.log | grep “java.lang.Thread.State” | sort -nr | uniq -c