Linux CPU占用率过高时问题排查

参考:

https://blog.csdn.net/yunzhonghefei/article/details/89207243

https://blog.csdn.net/u013467442/article/details/88957485

1、jstack需要使用与进程一致的用户才能执行

2、查看CPU占用率高的进程:top

Linux CPU占用率过高时问题排查

cpu高达100.0us , 确定 pid 为 110199 的进程导致。

3、查看进程下占用CPU较高的线程:ps p 进程号 -L -o pcpu,pid,tid,time

ps p 110199 -L -o pcpu,pid,tid,time

%CPU   PID    TID    TIME
18.7 110199  42096 14:42:30
41.7 110199  66438 14:39:08
41.8 110199  66440 14:39:55
42.8 110199  66491 14:38:57
41.3 110199  66515 14:27:08
41.3 110199  66611 14:23:05
41.3 110199  66612 14:22:59
41.5 110199  66638 14:24:53
41.3 110199  66639 14:21:53
37.6 110199  67920 12:12:33

比如最高的一组 %CPU占42.8   PID为110199   TID为66491  产生时间为14:38:57

4、将获取的线程号(十进制数)转换成十六进制
        printf "%x\n" 66491
        结果:103bb

5、结合进程号和线程号,利用jstack查到异常代码所在行:jstack -l 进程号 | grep 十六进制的线程号 -A 10
        jstack -l 110199 | grep 0x103bb -A 10
        结果:

[irfs@localhost bin]$ ./jstack -l 110199| grep 0x103bb -A 10
"http-nio-8082-exec-17" #2471 daemon prio=5 os_prio=0 tid=0x00007f3d3400f800 nid=0x103bb runnable [0x00007f3ef1547000]
   java.lang.Thread.State: RUNNABLE
        at java.util.regex.Pattern$Curly.match1(Pattern.java:4300)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4236)
        at java.util.regex.Pattern$Slice.match(Pattern.java:3972)
        at java.util.regex.Pattern$Start.match(Pattern.java:3461)
        at java.util.regex.Matcher.search(Matcher.java:1248)
        at java.util.regex.Matcher.find(Matcher.java:637)
        at xx.ExcelToHtml.convert(ExcelToHtml.java:126)
        at sun.reflect.GeneratedMethodAccessor186.invoke(Unknown Source)
[irfs@localhost bin]$ 

定位到ExcelToHtml.java:126 有死循环导致。

 

 

 

 

上一篇:Python 正则表达式(RegEx)


下一篇:C++ 正则表达式,匹配字符