TOP命令
1,如果某个线程cpu利用率一直100%, 则说明这个线程有可能有死循环.
2,如果某个线程长期除以top位置,说明这个线程可能有性能问题
3,cpu利用率高的线程不停的变化,说明并不是某一个线程导致CPU偏高.
如果是第一种情况,有可能是GC造成的.我们可以用jvm自带的jstat命令查看一下GC情况.是否是持久代或者年老代满了.产生的Full GC,从而导致CPU利用率飙高
命令:sudo /usr/java/jdk1.7.0_80/bin/jstat -gcutil 32235 1000 5 (1000是取样时间间隔单位毫秒,5位次数)
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.39 0.00 12.06 10.09 23.23 54370 306.867 0 0.000 306.867
0.00 0.39 14.03 10.09 23.23 54371 306.872 0 0.000 306.872
0.00 0.39 92.19 10.09 23.23 54371 306.872 0 0.000 306.872
0.00 0.39 92.19 10.09 23.23 54371 306.872 0 0.000 306.872
0.00 0.39 92.20 10.09 23.23 54371 306.872 0 0.000 306.872
S0:Heap上的 Survivor space 0 段已使用空间的百分比 S1:Heap上的 Survivor space 1 段已使用空间的百分比
E: Heap上的 Eden space 段已使用空间的百分比
O: Heap上的 Old space 段已使用空间的百分比
P: Perm space 已使用空间的百分比
YGC:从程序启动到采样时发生Young GC的次数
YGCT:Young GC所用的时间(单位秒)
FGC:从程序启动到采样时发生Full GC的次数
FGCT:Full GC所用的时间(单位秒)
GCT:用于垃圾回收的总时间(单位秒)
我们还可以把目标线程dump下来,直接分析哪儿的代码造成的CPU利用率飙升.
命令:sudo -u root /usr/java/jdk1.7.0_80/bin/jstack 32235 > /usr/local/dump17
查看链接到某个端口的连接数
netstat -nat | grep 12200 -c
查看线程数
ps -eLf |grep java -c
查看系统平均负载
cat /proc/loadavg
结果:0.16 0.16 0.14 4/304 28096
前三个数字大家都知道,是1、5、15分钟内的平均进程数。后面两个呢,一个的分子是正在运行的进程数,分母是进程总数;另一个是最近运行的进程ID号
一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的性能有严重问题。对于 上面的例子来说,假设系统有两个CPU,那么其每个CPU的当前任务数为:8.13/2=4.065。这表示该系统的性能是可以接受的。