监控jvm虚拟机有很多很多种方法,最为常见的一种就是通过jmx来获取jvm运行时的各种数据,目前也有很多开源的工具,各大主流监控工具基本都支持jmx监控。但是感觉在客户端配置起来比较麻烦,比如zabbix、nagios这些监控系统,需要你自己写脚本获取jvm数据,然后再上报给监控服务端。今天我尝试的是一种不需要我自己写脚本的方法,那就是jmxtrans。
jmxtrans是什么呢?看这里,我也就不废话了。各种版本的jmxtrans,官方提供了很多打包好的安装包,有rpm、deb、tar等等。因为rpm依赖的是jdk1.8,而生产环境是jdk1.7,所以我使用tar包的方式来安装jmxtrans。
下载jmxtrans-254:here
实验环境:CentOS release 6.5
java version "1.7.0_67"
部署目录:/opt/programs/jmxtrans_254
解压:
cd /opt/programs/jmxtrans_254
tar zxvf jmxtrans-254-dist.tar.gz
查看目录结构:
tree -L 3 jmxtrans_254
总共四个目录:bin里面是启动脚本,test.json是我编排的配置文件,doc是样例编排文件,lib里面是jmxtrans.sh启动的时候需要引用的jar文件,tools里面是两个文件转换工具。
下面看看test.json文件的内容:
{
"servers": [
{
"numQueryThreads": "2",
"host": "10.203.50.34",
"port": "9080",
"queries": [
{
"outputWriters": [
{
"@class": "com.googlecode.jmxtrans.model.output.StdOutWriter"
}
],
"obj": "java.lang:type=OperatingSystem",
"attr": [
"SystemLoadAverage",
"AvailableProcessors",
"TotalPhysicalMemorySize",
"FreePhysicalMemorySize",
"TotalSwapSpaceSize",
"FreeSwapSpaceSize",
"OpenFileDescriptorCount",
"MaxFileDescriptorCount"
]
},
{
"outputWriters": [
{
"@class": "com.googlecode.jmxtrans.model.output.StdOutWriter"
}
],
"resultAlias": "heap",
"obj": "java.lang:type=Memory",
"attr": [
"HeapMemoryUsage",
"NonHeapMemoryUsage"
]
},
{
"outputWriters": [
{
"@class": "com.googlecode.jmxtrans.model.output.StdOutWriter"
}
],
"resultAlias": "cmsoldgen",
"obj": "java.lang:name=CMS Old Gen,type=MemoryPool",
"attr": [
"Usage"
]
},
{
"outputWriters": [
{
"@class": "com.googlecode.jmxtrans.model.output.StdOutWriter"
}
],
"resultAlias": "gc",
"obj": "java.lang:type=GarbageCollector,name=*",
"attr": [
"CollectionCount",
"CollectionTime"
]
},
{
"outputWriters": [
{
"@class": "com.googlecode.jmxtrans.model.output.StdOutWriter",
"settings": {}
}
],
"resultAlias": "memorypool",
"obj": "java.lang:type=MemoryPool,name=*",
"attr": [
"Usage"
]
},
{
"outputWriters": [
{
"@class": "com.googlecode.jmxtrans.model.output.StdOutWriter"
}
],
"resultAlias": "threads",
"obj": "java.lang:type=Threading",
"attr": [
"DaemonThreadCount",
"PeakThreadCount",
"ThreadCount",
"TotalStartedThreadCount"
]
},
{
"outputWriters": [
{
"@class": "com.googlecode.jmxtrans.model.output.StdOutWriter"
}
],
"resultAlias": "tomcat8-connectors",
"obj": "Catalina:type=ThreadPool,name=*",
"attr": [
"currentThreadCount",
"currentThreadsBusy"
]
},
{
"outputWriters": [
{
"@class": "com.googlecode.jmxtrans.model.output.StdOutWriter"
}
],
"resultAlias": "tomcat8-requests",
"obj": "Catalina:type=GlobalRequestProcessor,name=*",
"attr": [
"bytesReceived",
"bytesSent",
"errorCount",
"processingTime",
"requestCount"
]
}
]
}
]
}
你可以根据你想查询的jvm type进行编排queries中的具体内容。
其中host和port是开启jmx服务的机器的ip和端口,numQueryThreads是针对下面的queries的工作线程数。jmxtrans支持把收集到的jvm信息写入多个后端服务中,例如:StdOutWriter、GangliaWriter、GraphiteWriter、OpenTSDBWriter、RRDWriter、StatsDWriter、StdoutWriter、TCollectorUDPWriter、Log4JWriter、InfluxDBWriter等等。为了演示方便,我使用的是StdOutWriter,也就是打印到标准输出中。
启动jmxtrans:
使用jmxtrans.sh [ start conf.json ]来启动jmxtrans服务。但是,因为我选用的是打印结果到标准输出,如果使用jmxtrans.sh来启动,还要在标准能输出看到结果,就需要修改启动脚本,当然这个很容易,只需要在脚本内部的启动命令上设置标准输出重定向即可,但是为了保持jmxtrans.sh的原生行,我采用原始命令启动,命令如下:
/opt/programs/jdk1.7.0_67/bin/java -server -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true \
-Djmxtrans.log.level=DEBUG -Djmxtrans.log.dir=. -Xms512m -Xmx512m -XX:PermSize=384m \
-XX:MaxPermSize=384m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=2101 \
-jar /opt/programs/jmxtrans_254/jmxtrans-254/lib/jmxtrans-all.jar -e -f ./test.json -s 60
注意我的jdk是oracle jdk,采用tar包安装。
可以看到已经开始收集配置文件中编排的jvm的相关信息了,-f 是制定配置文件,-s 是制定收集时间间隔。
下一篇讲解怎么使用jmxtrans agent配合jmxtrans使用。