多线程线上问题定位(附带有用的Linux命令)

来源:互联网 发布:linux locale 中文 编辑:程序博客网 时间:2024/06/03 10:27

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。这表示该系统的性能是可以接受的。


0 0
原创粉丝点击