线上cpu过载问题
2021-04-27 本文已影响0人
Figo_OU
线上性能调优:
问题:某个接口A,查询要很慢,但没有报错。那要怎么去分析问题到底在哪里呢?
-
top指令,首先看看cpu占用率和内存使用率。如果是由于内存溢出导致的问题,内存占用和cpu负载都会很高。因为该过程伴随着不断的gc。可以参照上一篇文章。 线上发生内存爆满问题处理
-
非内存问题,
先用top指令
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22276 root 20 0 6313408 509152 14108 S 189.0 3.1 1:37.89 java
22329 root 20 0 6330880 526296 14120 S 1.0 3.2 1:43.78 java
29462 root 20 0 7070076 767584 14208 S 1.0 4.7 2:24.71 java
root@RobotDispatch-Nginx-S-PRD ~]# jcmd
22276 /var/lib/xxx1.jar
29462 /var/lib/xxx2.jar
22329 /var/lib/xxx3.jar
jstack 29462 > a.log,然后就在a.log中看相关的堆栈信息。
-
发生死锁,一般都会检测出来
-
死循环,
-
使用
top -H -p 29462
看29462对应的进程中具体的线程运行状况。假设线程29491的cpu占用率很高,那么我们就看看里面详情。打开计算器,计算29491对应的16进制值。7333
那么我们就知道这个nid是7333了。然后打开刚刚的a.log堆栈信息。vi a.log
然后shilt+:,进入查找模式,输入/7333
,就会定位到对应的堆栈信息。问题位置
-
如果上述的问题都没有找到原因,可以多用几次jstack命令。然后对比几次的日志文件。看程序运行到那行代码停顿时间比较久。
例如你10个用户线程,日志输出都堆积在这个方法的第24行。那么可能第24行有点问题。
卡顿行