在生产环境中远程监控 JVM
Monitoring JVMs Remotely in a Production Environment
我已经使用 jConsole,通过其 GUI 监视 JVM,有时只需右键单击图形即可将性能数据保存到 csv。但是现在我需要将 JVM 性能数据(例如堆内存使用情况和 CPU 远程 JVM 的使用情况直接写入本地文件(带时间戳),而不使用 GUI。
我尝试了很多工具,包括以下工具,但它们没有所需的功能,例如连接到远程 JVM 和将输出写入本地文件。
任何人都可以向我推荐一个可用于获取类似于通过 jConsole 生成的结果但不使用 GUI 的 csv 输出的工具。
我通常使用 cmdline-jmxclient
来提取我的 MBean 数据,我使用 influx 来存储数据,然后在 Grafana 上显示它用于仪表板,下面是一个示例 shell 调用 jmxclient
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=""
if [ = "DaemonThreadCount" -o = "all" ]; then
TEMPFILE=`mktemp`
$JAVA_BIN -jar $JMX_CMDLINE - : "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 [ = "HeapMemoryUsage" -o = "all" ]; then
TEMPFILE=`mktemp`
$JAVA_BIN -jar $JMX_CMDLINE - : "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 [ = "PSPermGen" -o = "all" ]; then
rm -f $TEMPFILE
$JAVA_BIN -jar $JMX_CMDLINE - : "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
我已经使用 jConsole,通过其 GUI 监视 JVM,有时只需右键单击图形即可将性能数据保存到 csv。但是现在我需要将 JVM 性能数据(例如堆内存使用情况和 CPU 远程 JVM 的使用情况直接写入本地文件(带时间戳),而不使用 GUI。
我尝试了很多工具,包括以下工具,但它们没有所需的功能,例如连接到远程 JVM 和将输出写入本地文件。
任何人都可以向我推荐一个可用于获取类似于通过 jConsole 生成的结果但不使用 GUI 的 csv 输出的工具。
我通常使用 cmdline-jmxclient
来提取我的 MBean 数据,我使用 influx 来存储数据,然后在 Grafana 上显示它用于仪表板,下面是一个示例 shell 调用 jmxclient
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=""
if [ = "DaemonThreadCount" -o = "all" ]; then
TEMPFILE=`mktemp`
$JAVA_BIN -jar $JMX_CMDLINE - : "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 [ = "HeapMemoryUsage" -o = "all" ]; then
TEMPFILE=`mktemp`
$JAVA_BIN -jar $JMX_CMDLINE - : "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 [ = "PSPermGen" -o = "all" ]; then
rm -f $TEMPFILE
$JAVA_BIN -jar $JMX_CMDLINE - : "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