【性能定位】cpu占用率过高问题排查

问题:公司一个系统在测试单个功能登录上,并发才5个用户时,CPU使用率就瞬间飙升到100%

 

排查过程:

1、首先查看系统资源占用信息,使用top命令,查看那个进程占用CPU高

发现正在运行的JAVA项目CPU占用率很高,百分之364.2了,那么问题一定出在这个程序中

2、通过 top -H -p pid 找到导致cpu高的线程

备注:也可以通过Ps -mp pid -o THREAD,tid,time查看

在这里可能会出现三种情况:

  1. 第一种情况,某个线程一直CPU利用率100%,则说明是这个线程有可能有死循环,那么请记住这个PID。
  2. 第二种情况,某个线程一直在TOP十的位置,这说明这个线程可能有性能问题。
  3. 第三种情况,CPU利用率TOP几的线程在不停变化,说明并不是由某一个线程导致CPU偏高。

如果是第一种情况,也有可能是GC造成,我们可以用jstat命令看下GC情况,看看是不是因为持久代或年老代满了,产生Full GC,导致CPU利用率持续飙高,命令如下。


[test@iZ8vb8rrw7wiwqwx22tcsrZ log]$ jstat -gcutil 377 1000 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  26.33  11.63  11.99  97.36  93.41     63    2.600     5    2.399    4.998
  0.00  26.33  25.30  11.99  97.36  93.41     63    2.600     5    2.399    4.998
  0.00  26.33  40.19  11.99  97.36  93.41     63    2.600     5    2.399    4.998
  0.00  26.33  53.16  11.99  97.36  93.41     63    2.600     5    2.399    4.998
  0.00  26.33  65.35  11.99  97.36  93.41     63    2.600     5    2.399    4.998

3、定位线程具体问题,将TID转换成16进制,通过printf '0x%x' tid 命令,因为线程堆栈情况记录的是线程的16进制id: 

[test@iZ8vb8rrw7wiwqwx22tcsrZ log]$ /usr/bin/printf   '0%x\n'   12095
02f3f

4、jstack pid | grep tid  找到线程堆栈

jstack 11572 | grep 02f3f -A 30

 

分析:

(1)查看下TCP连接状态

[test@iZ8vb8rrw7wiwqwx22tcsrZ log]$ netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
      1 established)
      1 Foreign
      7 LISTEN
    111 ESTABLISHED

(2)用jstack dump看看这些线程都在做什么

也可以将线程dump出来,看看究竟是哪个线程,执行什么代码造成的CPU利用率高。执行以下命令,把线程dump到文件dump01里。

jstack  11572 > dump01

(3)统计下所有线程分别处于什么状态

[test@iZ8 ~]$ grep java.lang.Thread.State dump01 | awk '{print $2$3$4$5}' | sort | uniq -c
      8 RUNNABLE
     26 TIMED_WAITING(onobjectmonitor)
     40 TIMED_WAITING(parking)
      4 WAITING(onobjectmonitor)
     52 WAITING(parking)

(4)查看处于WAITING(parking)的线程信息

后续待定。。。。。

 

 

  • 查看Java线程数 ps -eLf | grep java -c
 
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值