CPU占用过高问题排查

1. 查看系统状况

top命令查看CPU、内存等使用情况

[root@izuf6bsiti3f4kuichki8nz ~]# top
top - 14:52:54 up 514 days,  7:00,  8 users,  load average: 2.85, 1.35, 1.62
Tasks: 147 total,   1 running, 146 sleeping,   0 stopped,   0 zombie
Cpu(s): 57.6%us,  6.3%sy,  0.0%ni,  9.2%id, 26.2%wa,  0.0%hi,  0.0%si,  0.7%st
Mem:   3922928k total,  3794232k used,   128696k free,   403112k buffers
Swap:  4194296k total,    65388k used,  4128908k free,  1492204k cached

PID   USER      PR  NI   VIRT    RES   SHR S   %CPU  %MEM      TIME+  COMMAND
6764  root      20   0  2428m   1.1g   11m S  190.0  28.3   36:38.55  java
1161  root      20   0      0     0      0 D    0.3   0.0   32:43.06  flush-253:
...

从top命令的结果发现。pid为6764的java进程CPU利用持续占用过高,达到了190%。内存占用率为28.3%。

2. 定位问题线程

使用ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况,发现该进程的两个线程占用率很高。

[root@izuf6bsiti3f4kuichki8nz ~]# ps -mp 6764 -o THREAD,tid,time
USER   %CPU   PRI   SCNT   WCHAN   USER  SYSTEM    TID     TIME
root   71.7     -      -   -          -       -      -     00:36:52
root    0.0    19      -   futex_     -       -   6764     00:00:00
root    0.0    19      -   poll_s     -       -   6765     00:00:01
root   44.6    19      -   futex_     -       -   6766     00:23:32
root   44.6    19      -   futex_     -       -   6767     00:23:32
root    1.2    19      -   futex_     -       -   6768     00:00:38

从上面可以看出6766和6767两个线程占用CPU大约有半个小时,每个线程的CPU利用率约为45%。接下来需要查看对应线程的问题堆栈。

3. 查看问题线程堆栈

将线程id转换为16进制

[root@izuf6bsiti3f4kuichki8nz ~]# printf "%x\n" 6766
1a6e

4. jstack查看线程堆栈信息

jstack命令打印线程堆栈信息,命令格式jstack pid | grep tid

[root@izuf6bsiti3f4kuichki8nz ~]# jstack 6764 | grep 1a6e
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007ffeb8016800 nid=0x1
a6e runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007ffeb8016800 nid=0x1
a6e runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007ffeb8016800 nid=0x1
a6e runnable
"VM Periodic Task Thread" prio=10 tid=0x00007ffeb8016800 nid=0x3700 wa
iting on condition

可以看出都是GC的线程。那么可以推断,很有可能就是内存不够导致GC不断执行。接下来我们就需要查看gc内存的情况。

5. jstat查看进程内存状况

命令:jstat -gcutil

[root@izuf6bsiti3f4kuichki8nz ~]# jstat -gcutil 6764 2000 10
S0      S1      E       O       P       YGC    YGCT     FGC   FGCT      GCT
0.00    0.00    100.00  100.00  97.74   1863   33.937   310   453.788   487.726
0.00    0.00    100.00  100.00  97.74   1863   33.937   310   453.788   487.726
0.00    0.00    100.00  100.00  97.74   1863   33.937   310   453.788   487.726
0.00    0.00    100.00  100.00  97.74   1863   33.937   310   453.788   487.726

6. jstack和jmap分析进程堆栈和内存状况

使用jmap命令导出heapdump文件,然后拿到本地使用mat、jprofier等工具分析。
命令:jmap [option] vmid
jmap -dump:format=b,file=dump.bin 6764
命令:jstack [option] vmid
jstack -l 6764 >> jstack.out
从heapdump文件中定位到程序中的工作现场,和内存情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值