在生产环境中远程监视JVM

时间:2018-06-11 09:16:49

标签: java performance jvm monitoring jmx

我使用jConsole来通过GUI监视JVM,有时只需右键单击图形就可以将性能数据保存到csv。但是现在我需要将JVM性能数据(如堆内存使用率和远程JVM的CPU使用率)直接写入本地文件(带时间戳),而不使用GUI。

我尝试了很多工具,包括以下内容,但它们没有必要的功能,例如连接到远程JVM并将输出写入本地文件。

  1. JVM Top
  2. JVM Mon
  3. 任何人都可以建议我使用一个工具来获取csv输出,这些输出类似于可以通过jConsole生成但不使用GUI的结果。

1 个答案:

答案 0 :(得分:1)

我通常使用cmdline-jmxclient来获取我的MBean数据,我使用涌入来存储数据,然后在Grafana上显示它用于仪表板,下面是一个调用jmxclient的示例shell脚本

CMDLINE-jmxclient:

如果您有MBean:com.yourcompany.data:type=datasystem,id=0 使用名为jmxRefresh()

的操作

然后你可以编写一个简单的bash脚本(假设你下载cmdline-jmxclient-0.10.3.jar并放在与你的脚本相同的目录中):

#!/bin/bash

cmdLineJMXJar=./cmdline-jmxclient-0.10.3.jar
user=yourUser
password=yourPassword
jmxHost=localhost
port=9003

#No User and password so pass '-'
echo "Available Operations for com.yourcompany.data:type=datasystem,id=0"
java -jar ${cmdLineJMXJar} ${user}:${password} ${jmxHost}:${port} com.yourcompany.data:type=datasystem,id=0

echo "Executing XML update..."
java -jar ${cmdLineJMXJar} - ${jmxHost}:${port} com.yourcompany.data:type=datasystem,id=0 jmxRefresh

同样,您可以获取堆内存或JVM中公开的任何其他MBean。

另一个示例脚本如下

#!/bin/bash

if [ $# -ne 3 ]; then
    echo "You need to supply both JMX host and port and metric. Exiting ..."
    exit 1
fi

JAVA_BIN="/usr/bin/java"
JMX_CMDLINE="./cmdline-jmxclient-0.10.3.jar"
APP_NAME="${1}"

if [ $3 = "DaemonThreadCount" -o $3 = "all" ]; then

  TEMPFILE=`mktemp`
  $JAVA_BIN -jar $JMX_CMDLINE - ${1}:${2}  "java.lang:type=Threading" DaemonThreadCount 2>> $TEMPFILE
  VALUE=`grep DaemonThreadCount $TEMPFILE | sed "s/.*DaemonThreadCount: //g" | cut -f2 -d:` 
  echo "$VALUE"
  rm -f $TEMPFILE

fi

if [ $3 = "HeapMemoryUsage" -o $3 = "all" ]; then

  TEMPFILE=`mktemp`
  $JAVA_BIN -jar $JMX_CMDLINE - ${1}:${2}  "java.lang:type=Memory" HeapMemoryUsage 2>> $TEMPFILE

  OUTPUT=`cat $TEMPFILE | egrep "committed:|used:" | sed "s/: /=/g"`

  for line in $OUTPUT
  do
    NAME=`echo $line | cut -f1 -d=`
    VALUE=`echo $line | cut -f2 -d=`
  done

  cat $TEMPFILE | grep used | cut -f2 -d" "
  rm -f $TEMPFILE

fi


if [ $3 = "PSPermGen" -o $3 = "all" ]; then

  rm -f $TEMPFILE

  $JAVA_BIN -jar $JMX_CMDLINE - ${1}:${2}  "java.lang:name=PS Perm Gen,type=MemoryPool" Usage 2>> $TEMPFILE

  OUTPUT=`cat $TEMPFILE | egrep "committed:|used:" | sed "s/: /=/g"`

  for line in $OUTPUT
  do
    NAME=`echo $line | cut -f1 -d=`
    VALUE=`echo $line | cut -f2 -d=`
    echo "$VALUE"
  done

fi