前言

工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程、方法。本文就将介绍利用性能监控工具,帮助开发者更快更准的找到问题产生的根源。本文分为三部分,第一部分将介绍在Linux环境下的常用监控工具,第二部分介绍Windows环境下的监控工具,第三部分将通过一个案例,介绍利用这些监控工具一步一步找出java应用程序的问题。

Linux环境下的监控工具

需要先声明的是,下面介绍的部分工具其实在Liunx环境、Windows环境下都可以使用,只不过在不同的环境下使用什么工具更合适。

下面我们想象这么一个场景:有一天运维人员看到生产环境下的服务器负载升高、CPU飙升,内存占用增大,请问接下来他该怎么办?可能有人会说,那就找到负载升高、CPU飙升。。的原因啊,如果是应用程序造成的就把它kill掉。如果采用这种方法,问题可能会短时间解决,但带来的问题是应用在一段时间不可用,并且我们没有找到问题发生的根源,下次重启后,问题依然会产生。那么如果出现类似的问题,严格的排查流程是怎样的呢?在回答这个问题之前,我们先了解一下Linux上常用的几个监控工具:

uptime

[root@centos7_template ~]# uptime 10:31:42 up 4 days, 1:01, 1 user,load average: 0.02, 0.02, 0.05
10:31:42    //当前系统时间
up 4 days, 1:01 //持续运行时间,时间越大,说明你的机器越稳定。
1 user  //用户连接数,是总连接数而不是用户数
load average: 0.02, 0.02, 0.05  //系统平均负载,统计最近1,5,15分钟的系统平均负载

该命令将显示目前服务器持续运行的时间,以及负载情况。

通过这个命令,可以最简便的看出系统当前基本状态信息,这里面最有用是负载指标,如果你还想查看当前系统的CPU/内存以及相关的进程状态,可以使用TOP命令。

TOP

通过TOP命令可以详细看出当前系统的CPU、内存、负载以及各进程状态(PID、进程占用CPU、内存、用户)等。从上面的结果看出该系统上安装了MySQL、java,可以看到他们各自的进程ID,假如这时Java进程占用较高的CPU和内存,那么你就要留心了,如果程序中没有计算量特别大、占用内存特别多的代码,可能你的java程序出现了未知的问题,可以根据进程ID做进一步的跟踪。除了通过TOP命令找到进程信息以外,还可以通过jdk自带的工具JPS直接找到java程序的进程号。

JPS

可以看到jps命令直接罗列出了当前系统中存在的java进程,这里第一个是jps命令自己的java进程,而另外一个是我启动的nosql监控工具进程。通过这种方法查询到java程序的进程ID后,可以进一步通过:

top -p 3618 // 这里的3618就是上面查询到的java程序的进程ID

通过此方法可以准确的查看指定java进程的CPU/内存使用情况。

除此之外,vmstat命令也可以查看系统CPU/内存、swap、io等情况:

上面的命令每隔1秒采样一次,一共采样四次。CPU占用率很高,上下文切换频繁,说明系统有线程正在频繁切换,这可能是你的程序开启了大量的线程存在资源竞争的情况。另外swap也是值得关注的指标,如果swpd过高则可能系统能使用的物理内存不足,不得不使用交换区内存,还有一个例外就是某些程序优先使用swap,导致swap飙升,而物理内存还有很多空余,这些情况是需要注意的。

查看系统指标,还有一个第三方工具:pidstat,这个工具还是很好用的,需要先安装:

yum install sysstat

该命令监控进程id为3618的CPU状态,每隔1秒采样一次,一共采样四次。“%CPU”表示CPU使用情况,“CPU”则表示正在使用哪个核的CPU,这里为0表示正在使用第一个核。如果还要显示线程ID,则可以使用:

pidstat -p 3618 -u -t 1 4

如果要监控磁盘读写情况,这可以使用:

pidstat还有其他的参数,可以通过pidstat --help获取,再次不再赘述。

下面再介绍几个JDK自带有用的工具:jps、jstat、jmap、jstack

jps:上面我们已经使用过了,他可以罗列出目前再服务器上运行的java程序及进程ID;

jstat:用于输出java程序内存使用情况,包括新生代、老年代、元数据区容量、垃圾回收情况。

上述命令输出进程ID为3618的内存使用情况(每2000毫秒输出一次,一共输出20次)

  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:伊甸园区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

jmap:用于输出java程序中内存对象的情况,包括有哪些对象,对象的数量。

jmap -histo 3618

上述命令打印出进程ID为3618的内存情况。但我们常用的方式是将指定进程的内存heap输出到外部文件,再由专门的heap分析工具进行分析,例如mat(Memory Analysis Tool),所以我们常用的命令是:

jmap -dump:live,format=b,file=heap.hprof 3618

将heap.hprof传输出来到window电脑上使用mat工具分析:

jstack:用户输出java程序线程栈的情况,常用于定位因为某些线程问题造成的故障或性能问题。

jstack 3618 > jstack.out

上述命令将进程ID为3618的栈信息输出到外部文件,便于传输到windows电脑上进行分析。

Windows环境下的监控工具

Windows环境下的监控工具也有很多,但是本文主要推荐jvisualvm.exe、MemoryAnalyzer.exe,有了他们其他工具几乎不需要了。

jvisualvm.exe在JDK安装目录下的bin目录下面,双击即可打开。

双击左侧你需要监控的java程序即可对它进行监控,这个工具包括对CPU、内存、线程、类都做了监控,功能非常强大,上文中介绍的所有功能,其他在这个工具上都已经有了。当然怎么用、如何分析它需要花时间去一点点积累。

MemoryAnalyzer.exe:上文我们已经提到,常用于分析内存堆使用情况,也是非常强大的工具。详细使用方法,这里就不再赘述,可以下载下来尝试一下。

上述介绍了基于Linux、Windows环境的监控工具,有了这些工具我们就要利用他们做对应的事情,下面将通过一个简单的案例,说明如何使用他们。

案例分析

首先通过上述的介绍,我们对故障排查流程应该有了一个印象,这里先梳理出来:

案例:

一个java应用启动以后,使用人员发现应用不可用,针对该现象我们做以下分析排查:

1、首先查看服务器上的应用状态。使用jps命令查询当前在运行中的java进程:

这里进程ID为6400的java应用就是我们刚启用的,说明应用并没有挂掉,还在运行中。

2、通过进程ID查询所占用的CPU、内存以及当前负载情况,top -p 6400。

从以上结果看出该应用并没有引起系统负载过高,CPU、内存也没有出现异常情况。

3、通过上述结果我们推测因为内存原因引起的故障可性能较小,所以我们优先排查线程栈,使用jstack命令,导出线程栈。

jstack 6400 > stack.out

我们将该文件传输出来便于查看。

查看线程栈可以看出,主线程处于运行状态,而子线程ThreadA、ThreadB、ThreadC、ThreadD一边在等待一个锁,同时又持有另外一个锁,其实看到这里我们基本推断该应用程序存在死锁,因此造成线程等待,应用不可用。通过以上栈的信息,我们就可以到程序代码中详细查看代码了,并且修改bug解决此问题。

死锁原理补充:

如图所示,造成死锁的原因是线程之间存在相互制约的情况,而任一线程都无法继续执行。

小结

本文介绍了Linux、Windows环境下常用的监控工具,最后通过一个案例简单说明故障排查的流程,怎么使用监控工具找出应用故障的原因。

JVM学习--(七)性能监控工具的更多相关文章

  1. JVM学习七:JVM之类加载器之类的卸载

    类加载的过程和原理,以及双亲委派机制都已经讲解完成,那么我们今天讲解类加载的最后一节,那么就是类的卸载. 我们知道,当一个类被加载.连接和初始化之后,他的生命周期就开始了,当该类的class对象不再被 ...

  2. JVM学习七-(复习)垃圾收集策略与算法

    垃圾收集策略与算法 程序计数器.虚拟机栈.本地方法栈随线程而生,也随线程而灭:栈帧随着方法的开始而入栈,随着方法的结束而出栈.这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的 ...

  3. JVM内核-原理、诊断与优化学习笔记(七):性能监控工具

    文章目录 系统性能监控 系统性能监控- linux uptime top vmstat(虚拟内存统计) pidstat 系统性能监控 - windows 任务管理器 Perfmon Process E ...

  4. JVM学习03:性能监控工具

    JVM学习03:性能监控工具 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 性能监控工具知识要点Xmind梳理 案例分析 案例分析1-JPS 案例分 ...

  5. JVM学习十二:JVM之性能监控工具

    前面我们学习了很多JVM相关的理论知识,那么本节将重点讲述的是工具的使用,正所谓:工欲善其事,必先利其器.因此,本节介绍常用的性能监控工具,用于性能监控和问题排查. 一.系统性能监控 系统性能工具用于 ...

  6. JVM学习五:性能监控工具

    一.系统性能监控 系统性能工具用于确定系统运行的整体状态,基本定位问题所在. Linux – uptime • 系统时间 • 运行时间 n 例子中为7分钟 • 连接数 n 每一个终端算一个连接 • 1 ...

  7. 深入理解JVM(七)——性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...

  8. 深入理解JVM(七)——性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...

  9. 深入理解JVM—性能监控工具

    (转自:http://yhjhappy234.blog.163.com/blog/static/31632832201222691738865/) 我们知道,在JVM编译期和加载器,甚至运行期已经做了 ...

随机推荐

  1. 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧

    因为写博客总是需要录制 Android 软件的演示效果, 研究了将近一小时找到了合适的工具; 录制流程 : -- 1. 录制 Android 手机屏幕内容 : 使用 拍大师 软件录制 Android ...

  2. 对 jiffies 溢出、回绕及 time_after 宏的理解

    原文如下: 关于jiffies变量:     全局变量jiffies用来记录自启动以来产生的节拍的总数.系统启动时会将该变量初始化为0,此后,每当时钟中断产生时就会增加该变量的值.jiffies和另外 ...

  3. 02_NoSQL数据库之Redis数据库:string类型和hash类型

     Strings类型及操作 String是最简单的类型,一个key对应一个Value,String类型是二进制安全的.Redis的String可以包含任何数据,比如jpg图片或者序列化的对象. S ...

  4. 如何在Cocos2D游戏中实现A*寻路算法(八)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  5. UNIX环境高级编程——创建与打开IPC通道

    创建或打开一个IPC对象的三个getXXX函数的第一个参数key是类型为key_t的IPC键,返回值identifier是一个整数标识符.该标识符不同于ftok函数的id参数.对于key值,应用程序有 ...

  6. Weblogic10 集群配置

     1.预备知识 什么是Domain和Server Domain Domain是WebLogic Server实例的基本管理单元.所谓Domain就是,由配置为Administrator Serve ...

  7. C++实现最小堆及插入,调整顺序,删除堆顶元素的操作

    上次用Java实现了最大堆的封装,这次就来写一下最小堆的实现吧 插入函数的思路: 向堆中插入元素有两种情况,一种是堆为空,那么就让插入值作为根节点即可:另一种是堆不为空,那么此时就要进行判断当前节点与 ...

  8. GIT版本控制 — GIT与SVN的相互转换 (三)

    git-svn git-svn用于Git和SVN的转换,可以把Git仓库迁移成SVN仓库,反之亦可. 详细介绍可见[1],或者命令行输入git-svn. Bidirectional operation ...

  9. python的w+到底是什么

    python 文件处理的打开方式有很多种, os.mknod("test.txt") 创建空文件 fp = open("test.txt",w) 直接打开一个文 ...

  10. 【翻译】Ext JS最新技巧——2014-9-10

    原文:Top Support Tips Greg Barry:删除网格单元格的焦点 在Ext JS 5.0.1,添加了一些与可访问性和支持ARIA有关的显著改进.虽然鼓励使用这些新增功能,但默认样式可 ...