JVM学习笔记---服务器,JVM性能监控工具

759 阅读4分钟

前言

在日常工作中,有时会遇到意想不到的线上故障,可能是服务器CPU突然飙升,IO异常,内存溢出等等。一般线上故障的处理方式为:

  1. 先回滚版本
  2. 在测试环境定位问题,优化程序
  3. 打补丁解决

那么在定位问题阶段,除了查看应用的日志外,一些棘手的问题往往需要我们通盘排查服务器,JVM的状态和性能,工欲善其事必先利其器,性能监控工具往往可以帮到大忙。

最近遇到一个IO阻塞的问题,起因是发现线上某个服务6个实例其中一个有异常,该服务器所有入方向连接都报超时,出方向正常。那么查看服务器状态后,找到了问题根因是一个websocket在特定的异常情况下造成内存泄漏,代码静态检查又没有检查到这个问题。最终通过查看jvm堆栈定位到相应的类,修复了问题。

这里就分享一下我平时一般使用的几个监控工具。

linux服务器状态监控

如果在测试环境复现了问题。那么这时候定位和监控工作就开始了。

一般先查看服务器基本状态,例如CPU,内存,io,磁盘。 再用jvm相关的工具定位到jvm内的问题

uptime命令与top命令

uptime命令用来显示最近1,5,15分钟的负载情况,这个负载可以理解为CPU占用情况,多核服务器每一个CPU负载满额为1 ,当然也存在超过的情况,正常情况下希望服务器负载再70%以下。例如4核服务器期望负载再2.8以内。 同时uptime还会显示系统运行时间。时间越长表示越稳定。

top命令会显示更详细的信息

显示的内容详解:

  • 第一行与uptime一致。
  • 第二行为所有的进程数,1个再运行,200个sleep,0个停止,0个僵尸进程
  • 第三行为cpu情况,分别为用户空间占用CPU百分比0.0% ,系统内核占用0%,用户进程空间内改变过优先级的进程占用CPU0%,空闲CPU占99.9%,,等待输入输出的CPU占0%,服务于硬中断所耗费的CPU占用0%,服务于软中断所耗费的CPU占用0%。
  • 第四行为物理内存总量,使用物理内存总量,空闲内存总量,用作内核缓存的内存量。
  • 第五行为swap交换分区 情况
  • 下面的表格中主要有 S表示进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程),CPU占用情况,MEN内存占用情况。

使用top可以简单了解到cpu和men的信息,如果出现了与我们期望值不匹配的情况,就是我们的程序出现了异常情况。

netstat命令查看网络状态

netstat命令主要是用来查看linux系统的整个网络状态

网络状态会显示本地端口与远程端口,也有利于我们定位具体的服务。

在我所遇到的一个案例中,用netstat -anp | grep 8080 |wc -l 查出有几千个websocket连接,且查看其状态都是close_wait,websocket是基于http的长连接协议,那么closewait表示http协议关闭时未正常关闭。

jvm状态监控

jvm监控可以帮助我们定位到问题根因。

jstat命令

jstat命令用于查看jvm内存各个区域占用情况,和gc情况。 先用jps查看到需要监控的java进程的pid,使用 jstat -gcutil pid 1000 20 每一秒采集一次,共采集20次

s0区 | s1 区 |eden区|old区|元数据区|压缩空间|YGC次数|YGC时间|FGC次数|FGC时间|总GC时间

元数据区在jdk8之前,是permanent区
可以看到这个程序每隔几秒钟有一次YGC,在没有用户访问的情况下,是什么东西在频繁创建缺没有使用,可能就会产生问题。

使用jvisualVM监控JVM

jvisualvm可以可视化的观察到jvm 的各类情况,而且这个工具越来越强大,在jdk9中已经脱离jdk独立分发,需要单独下载。在jdk8及以下,在jdk 的bin中可以找到这个工具。

左侧可以看到本机正在运行的java进程,打开之后在右边可以可视化的观察到各类jvm信息。