文章目录
CPU问题
cpu问题是比较常见的问题,cpu负载过高会导致系统接口卡顿,响应变慢,对于造成cpu过高的大致有以下几种情况。
- JVM频繁GC导致cpu高。
- 存在死循环,导致cpu负载过高。
- 执行其他消耗cpu多的操作,比如打印过多的debug日志,循环过多。
在实际开发中,遇到比较多的是频繁gc,尤其是频繁Full GC导致cpu过高。频繁Full GC主要由以下几种情况。
- 老年代空间不足
- metaspace方法区空间不足
- System.gc()
针对cpu过高的常用排查方法由:
- 使用arthas 查看占比cpu高的线程 thread -n 3 -i 1000
- Github开源脚本show-busy-java-threads显示占用cpu高的线程。
- ps -mp pid -o THREAD,tid,time | sort -k2r 查看进程占用cpu高的线程。该命令消耗cpu少。
- ps -mp pid -o THREAD,tid,time | head -n 40 查看进程占用cpu高的前几个线程。
- top定位cpu高的线程,top -Hp -p pid 定位使用 CPU 最高的线程,线程 id 转化 16 进制 printf ‘%x\n’ pid 得到 nid ,jstack pid |grep ‘nid’ 注意nid前面一般要加0x找到线程堆栈。步骤多,grep的时候可能匹配到很多,不方便查找。jstack pid 打印线程堆栈,分析日志。
- cat jstack.log | grep “java.lang.Thread.State” | sort -nr | uniq -c 分析线程状态,如果WAITING BLOCKED 过多则很可能代码有问题。
- arthas profiler生成火焰图 火焰图主要看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
内存问题
内存问题也是比较常见的问题,内存问题主要是包含OOM问题,GC问题和堆外内存,StackOverflow等常见问题。
针对内存问题主要的排查方法:
- top free 可以查看实时的内存使用情况 。
- jmap -heap pid 输出当前进程 JVM 堆新生代、老年代、持久代等请情况,GC 使用的算法等信息。
- arthas dashboard 查看JVM内存占用情况。
- jmap -J-d64 -dump:format=b,file=dumpfile.hprof [pid],打印内存快照 然后利用MAT工具分析,64位机器加-J-d64,否则生成的dump文件会打开不了。
- jstat -gc pid 查看内存gc情况。
- jmap -histo pid | sort -n -r -k 3 | head -20 查看内存占用前20的对象。
对于堆内存问题,需要开启gc日志,查看gc情况。对于堆外内存溢出一般我们先通过pmap来查看下进程占用的内存情况pmap -x pid | sort -rn -k3 | head -30,这段意思是查看对应pid倒序前30大的内存段。
网络问题
经常遇到cpu跟内存都正常,但是应用程序假死,没有响应。这个时候很可能是网络问题,比如阻塞住,线程大量处于WAITING 状态。tcp连接超时,连接溢出等问题。
常见排查网络问题方法:
- netstat -n|awk ‘/^tcp/{++S[$NF]}END{for (key in S) print key,S[key]}’ 查看当前系统下所有连接状态的数。
- netstat -s | egrep “listen|LISTEN”。
- jstack pid >> jstack.log 打印线程堆栈排查问题。
网络问题主要是查看tcp连接状态,应用线程堆栈线程状态,从而进一步确定问题。
参考资料:https://blog.csdn.net/itfly8/article/details/118865589