性能问题排查

本文介绍了一些常用的工具和方法,帮助开发者快速定位线上问题。通过使用TOP命令查看进程情况,结合jstack命令进行线程Dump,进一步分析CPU利用率高的原因。此外,还提供了优化实战案例,如减少TCP连接数量及调整线程池配置。
摘要由CSDN通过智能技术生成

  有时候有很多问题只有在线上或者预发环境才能发现,而线上又不能Debug,所以线上问题定位就只能看日志,系统状态和Dump线程,本文只是简单的介绍一些常用的工具,帮助定位线上问题。

注:Linux性能分析命令请参见:http://uule.iteye.com/blog/2149699

问题定位

1、首先使用TOP命令查看每个进程的情况,显示如下:

我们的程序是Java应用,所以只需要关注COMMAND是Java的性能数据,COMMAND表示启动当前进程的命令,在Java进程这一行里可以看到CPU利用率是300%,不用担心,这个是当前机器所有核加在一起的CPU利用率。

2、再使用Top的交互命令数字1查看每个CPU的性能数据

命令行显示了CPU4,说明这是一个5核的虚拟机,平均每个CPU利用率在60%以上。如果这里显示CPU利用率100%,则很有可能程序里写了一个死循环。这些参数的含义,可以对比下表:

3、使用Top的交互命令H查看每个线程的性能信息

在这里可能会出现三种情况:

  • 第一种情况,某个线程一直CPU利用率100%,则说明是这个线程有可能有死循环,那么请记住这个PID。
  • 第二种情况,某个线程一直在TOP十的位置,这说明这个线程可能有性能问题。
  • 第三种情况,CPU利用率TOP几的线程在不停变化,说明并不是由某一个线程导致CPU偏高。

如果是第一种情况,也有可能是GC造成,我们可以用jstat命令看下GC情况,看看是不是因为持久代或年老代满了,产生Full GC,导致CPU利用率持续飙高,命令如下。

我们还可以把线程Dump下来,看看究竟是哪个线程,执行什么代码造成的CPU利用率高。执行以下命令,把线程dump到文件dump17里

sudo -u admin /opt/java/bin/jstack  31177 > /home/tengfei.fangtf/dump17

dump出来内容的类似下面这段:

dump出来的线程ID(nid)是十六进制的,而我们用TOP命令看到的线程ID是10进制的,所以我们要printf命令转换一下进制。然后用16进制的ID去dump里找到对应的线程。

优化实战

1、查看下TCP连接状态,建立了800多个连接,需要尽量降低ESTABLISHED。

2、用jstack dump看看这些线程都在做什么

 

3、统计下所有线程分别处于什么状态,发现大量线程处于WAITING(onobjectmonitor)状态

4、查看处于WAITING(onobjectmonitor)的线程信息,主要是jboss的工作线程在await

5、找到jboss的线程配置信息,将maxThreads降低到100

其他命令

  • 查看CPU信息 cat /proc/cpuinfo
  • 查看内存信息 cat /proc/meminfo
  • 查看Java线程数 ps -eLf | grep java -c
  • 查看linux系统里打开文件描述符的最大值 ulimit -u
  • 找到日志里TOP10的异常:grep ‘Exception’ /home/admin/logs/XX.log |awk -F':|,’ ‘{print $2}’|sort |uniq -c |sort -nr|head -10,找到之后可以再用-A 2 -B 2,看定位出日志的前面2行和后面两行

参见:http://blog.csdn.net/zhu_tianwei/article/details/44161509

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值