jvm性能优化之jvm监控系统
jmxtrans
介绍
jmxtrans是一个jvm管理工具,它允许您连接到任意数量的Java虚拟机(JVM)并查询它们的属性,而无需编写单行Java代码。这些属性通过Java Management Extensions(JMX)从JVM导出。大多数Java应用程序都通过此协议提供了统计信息,并且可以将其添加到任何代码库中而无需花费太多精力。如果将SpringFramework用于代码,就可以像在Java类文件中添加几个注释一样简单。 查询语言基于易于编写的JSON格式。这允许非程序员访问JMX而无需知道如何编写Java,实现了对代码的零侵入。查询的结果由名为OutputWriters的Java类处理。开箱即用,jmxtrans支持多个输出编写器,可通过配置直接写入到对应的数据库。
1、 Engine Mode
使用jmxtrans有两种主要模式。第一种是使用分发中包含的JmxTransformer引擎。该引擎将读取.json文件的目录,然后创建“作业”以在类似cron的计划上执行。
每个作业都映射到您要查询jmx属性的服务器。因此,您可以通过在Server对象上设置cronExpression字段来为每个服务器设置复杂的查询计划(默认 为每分钟)。 对于给定的json文件,可以在其中定义无限数量的服务器。服务器是您要从中收集统计信息的JVM,并由主机名,端口,用户名和密码定义。 在每个服务器中,可以对其执行无限数量的JMX查询。针对服务器执行的每个查询都可以使用任意数量的OutputWriters输出其结果。
JmxTransformer引擎是完全多线程的。您指定要为应用程序的每个部分启动的最大线程数。默认情况下,最多同时查询10台服务器。对于服务器,每个查询也可以有多个线程。因此,您可以指定要10个线程来处理50个服务器。您的每台服务器可能已定义了10个查询。因此,您可以将numQueryThreads设置为2,以便同时对服务器执行两个查询。JmxTransformer有两个方面。输入是与JVM中运行的JMX服务器的连接。输出是OutputWriters。必要时,双方都使用连接对象池来维护与输入和输出的套接字连接。
2、API模式
jmxtrans的第二种模式是充当API来构建自己的应用程序,以便从JMX中提取数据并将其写出来。引擎是在这个API之上编写的。engine是我如何使用这个项目,所以你可以编写自己的engine完全支持。 api的核心在JmxUtils类中实现为大多数静态方法。也可以使用Java'ish语言(如Jython,Scala和Groovy)来编写jmxtrans脚本以执行您想要的任何操作。
架构
jmxtrans+influxdb+grafana安装(其它安装方式详见官网)
docker run -p 8086:8086 -p 8083:8083 -e INFLUXDB_ADMIN_ENABLED=true influxdb:1.2.4
docker run -d -v /opt/jmxtrans/json-files:/var/lib/jmxtrans -p 9999:9999 --env PROXY_HOST=10.10.0.131 docker.xsy.io/base/jmxtrans:1.0
The arguments as environment variable are :
· SECONDS_BETWEEN_RUNS
· HEAP_SIZE
· PERM_SIZE
· MAX_PERM_SIZE
· CONTINUE_ON_ERROR
· JMXTRANS_OPTS
· JAVA_OPTS
To run jmxtrans:
· ./jmxtrans.sh start [optional path to one json file]
To stop jmxtrans:
· ./jmxtrans.sh stop
Options you may want to configure:
· JSON_DIR - Location of your .json files. Defaults to '.'
· LOG_DIR - Location of where the log files get written. Defaults to '.'
· SECONDS_BETWEEN_RUNS - How often jobs run. Defaults to 60.
配置
注意: 配置之前请确保监控的java 服务已经打开jmx
-Dcom.sun.management.jmxremote.port=1105
-Dcom.sun.management.jmxremote.host=10.10.0.130
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
· 配置template文件到上面容器挂载目录下:
更多配置参数可以通过jconsole 连接查看mean。
{
"servers" : [ {
"port" : "1105", # jmx端口
"host" : "192.168.0.11", # jmx IP
"username" : "xxx", # jmx 用户名
"password" : "xxx", # jmx 密码
"queries" : [ {
"outputWriters" : [ {
"@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
"url" : "[http://10.10.0.130:8086/](http://10.10.0.130:8086/)",
"username" : "root",
"password" : "root",
"database" : "jmxtrans",
"tags" : {"application" : "manager-service"}
} ],
"obj" : "java.lang:type=OperatingSystem",
"attr" : [ "SystemLoadAverage", "AvailableProcessors", "TotalPhysicalMemorySize",
"FreePhysicalMemorySize", "TotalSwapSpaceSize", "FreeSwapSpaceSize",
"OpenFileDescriptorCount", "MaxFileDescriptorCount","SystemCpuLoad" ],
"resultAlias":"SystemUsage"
},
...
]
} ]
}
· 查看influxdb数据
image.png
· 配置grafana dashboard
image.png
参考资料
jmxtrans https://github.com/jmxtrans/jmxtrans