线上CPU占用100%问题排查

872 阅读1分钟

参考

发现异常

在新版本发布后,需要关注CPU使用情况、GC情况。

  • top -c

    查看CPU、内存、系统负载等运行状态

  • jstat -gc pid 10000

    查看GC情况,每隔10S执行一次。

当发现CPU占用过高、系统负载过高、GC次数过多时,则认为当前存在异常

异常线程

  • 使用top -c,然后按P按照CPU使用率排序

  • 使用top -Hp pid,然后按P按照CPU使用率排序

    -H:显示线程信息

    -p:指定进程pid

  • 这里显示的线程ID是十进制,需要转换成十六进制

线程信息

  • 使用jstack -l pid > ./pid.stack把栈信息转换成文件

    可以使用jstack -l pid > ./pid.dump设置成dump文件,可以借助于笨马平台进行线程分析

  • 使用cat pid.stack |grep 'b26' -C 8查看栈信息

    过滤的线程ID使用的是十六进制

  • 也可以把dump文件上传到笨马平台上分析

  • cat的线程信息,举例:

    "my-thread-7" #18 prio=5 os_prio=0 tid=0x0000000020c69800 nid=0x3374 runnable [0x0000000021f5e000]
       java.lang.Thread.State: RUNNABLE
    	at java.io.FileOutputStream.writeBytes(Native Method)
    	at java.io.FileOutputStream.write(FileOutputStream.java:326)
    	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    	- locked <0x00000006c1c1bb90> (a java.io.BufferedOutputStream)
    	at java.io.PrintStream.write(PrintStream.java:482)
    	- locked <0x00000006c1c14170> (a java.io.PrintStream)
    	at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
    	at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
    	at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
    	- locked <0x00000006c1c1bba8> (a java.io.OutputStreamWriter)
    	at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
    	at java.io.PrintStream.newLine(PrintStream.java:546)
    	- eliminated <0x00000006c1c14170> (a java.io.PrintStream)
    	at java.io.PrintStream.println(PrintStream.java:807)
    	- locked <0x00000006c1c14170> (a java.io.PrintStream)
    	at com.security.im.controller.login.Test.lambda$main$0(Test.java:56)
    	at com.security.im.controller.login.Test?Lambda$1/1807837413.run(Unknown Source)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    	at java.lang.Thread.run(Thread.java:748)
    
       Locked ownable synchronizers:
    	- <0x00000006c1c1bbf0> (a java.util.concurrent.ThreadPoolExecutor$Worker)