LINUX-检查内部CPU,JVM

时间:2016-07-01 15:17:40

标签: linux jvm

所以我试图检查JVM的内部CPU和RAM使用情况。

设置是我们有一台服务器,托管39个JVM,每个服务器运行自己的服务,并拥有自己独特的CPU和CPU。 RAM分配。例如,它可以设置如下:

      CPU(Cores)   RAM(MB)
JVM1      2          300
JVM2      1          50
JVM3      5          1024

这些都是虚构的,因为我没有实际的价值。

我知道每个JVM的PID,但我想知道如何看待每个JVM的CPU和RAM使用情况,而不管主机系统的使用情况如何。也可以将多个PID传递给jstat -gc,因为我将要编写脚本吗?

我知道如果我使用:

ps -p <PID> -o %CPU %RAM

这将为我提供主机上该进程的CPU和RAM。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在玩了一会儿后,我想出了以下脚本,它将内存使用量和使用的总内存拉到2DP:

脚本

#!/bin/sh

service=$(mktemp)
jstatop=$(mktemp)
ServiceStatsPre=$(mktemp)
datet=$(date +%Y-%m-%d)
hourt=$(date +%H)

ps -ef | grep  java | grep Service | awk '{key=substr($9,31,match($9,"@")-31); serv[key]++}END{for(name in serv){if($9 ~ /Service/){print name}}}'>$service

printf "%-8sService\t\t\t\t%7s   PID\t%7s  Used\t%7s  Total\n" > $ServiceStatsPre

filename=$service
while read -r line; do
if [ ! -z $line ]; then
pid=$(ps -ef | grep  java | grep Service |awk -v svc="$line" '{if (match($9,svc)){print $2}}')
rncnt=0
rnag=1
        while [ $rnag -eq 1 ]; do
                jstat -gc $pid > $jstatop
                if [ $? -ne 0 ]; then
                        sleep 5;
                        rncnt++;
                else
                rnag=0
                fi
                if [ $rncnt -eq 5 ]; then
                        rnag=0
                fi
        done
cat $jstatop | awk '{if (NR !=1) print}'|awk -v pid="$pid" -v svc="$line" -v d="$datet" -v h="$hourt" '{printf("%-40s %7d %6.2fMB %6.2fMB %11s %3s\n",svc,pid,($1+$5+$7)/1024,($3+$4+$6+$8)/1024,d,h)}' >> $ServiceStatsPre
fi
done < $filename
#printf "Date,Hour,Service,Used,Total\n" > Service_Stats.csv  #Uncomment this line on initial Run to create file with headders
cat $ServiceStatsPre | awk '{if (NR !=1) print}' |
awk '{
printf("%-1s,%1s,%1s,%4.2f,%4.2f\n",$5,$6,$1,$3,$4);
}' >> Service_Stats.csv

rm $service;
rm $jstatop;
rm $ServiceStatsPre;

击穿

ps -ef | grep  java | grep Service | awk '{key=substr($9,31,match($9,"@")-31); serv[key]++}END{for(name in serv){if($9 ~ /Service/){print name}}}'>$service

这将返回服务的名称并将其放入临时文件$service

printf "%-8sService\t\t\t\t%7s   PID\t%7s  Used\t%7s  Total\n" > $ServiceStatsPre

这只是在Temp文件$ServiceStatsPre中创建标题(我知道这不是必需的,但我最初使用它来调试文件而不是临时文件)

Outer While循环

filename=$service
if [ ! -z $line ]; then
while read -r line; do
pid=$(ps -ef | grep  java | grep Service |awk -v svc="$line" '{if (match($9,svc)){print $2}}')
rncnt=0
rnag=1
...
cat $jstatop | awk '{if (NR !=1) print}'|awk -v pid="$pid" -v svc="$line" -v d="$datet" -v h="$hourt" '{printf("%-40s %7d %6.2fMB %6.2fMB %11s %3s\n",svc,pid,($1+$5+$7)/1024,($3+$4+$6+$8)/1024,d,h)}' >> $ServiceStatsPre
fi
done < $filename

首先检查它传入的行是否为空(if [ ! -z $line ]; then)然后它为临时文件{{1}中的每个服务提取PID并设置一个支票($service)+重试计数器(rnag)。此外部while循环的最后一部分是计算rncntMB)中的统计信息,内存使用情况,使用的总内存(($1+$5+$7)/1024)以及重新调整($3+$4+$6+$8)/1024,服务名称,日期和时间。

Inner While Loop

PID

这基本上是为了确保... while [ $rnag -eq 1 ]; do jstat -gc $pid > $jstatop if [ $? -ne 0 ]; then sleep 5; rncnt++; else rnag=0 fi if [ $rncnt -eq 5 ]; then rnag=0 fi done ... 正确运行并且不会返回错误。

此脚本的最后部分:

jstat

只是为了解析格式并将其放入格式中,以便可以在#printf "Date,Hour,Service,Used,Total\n" > Service_Stats.csv #Uncomment this line on initial Run to create file with headders cat $ServiceStatsPre | awk '{if (NR !=1) print}' | awk '{ printf("%-1s,%1s,%1s,%4.2f,%4.2f\n",$5,$6,$1,$3,$4); }' >> Service_Stats.csv 中使用。

输出

此脚本输出如下:

CSV

Date,Hour,Service,Used,Total 2016-07-03,07,undMFSAdapterServiceVM,331.00,188.87 2016-07-03,07,entSCSServiceVM,332.50,278.19 2016-07-03,07,kServiceVM,457.50,132.91 2016-07-03,07,ServiceTuTrackVm,432.00,282.66 2016-07-03,07,ter1WMSAdapterServiceVm,233.00,77.02 2016-07-03,07,kingMFSAdapterServiceVM,451.50,126.69 2016-07-03,07,erBuilderServiceVM,261.50,211.27 2016-07-03,07,ter3MFSAdapterServiceVM,449.50,210.23 2016-07-03,07,rServiceVM1,1187.00,529.26 2016-07-03,07,rServiceVM2,597.50,398.43 2016-07-03,07,rServiceVM3,2786.00,819.30 2016-07-03,07,rServiceVM4,451.50,163.13 2016-07-03,07,MessagingServiceVm,457.50,357.11 2016-07-03,07,viceVM,444.50,263.59 2016-07-03,07,ServiceVM,1910.50,909.19 2016-07-03,07,undPackingMFSAdapterServiceVM,208.00,113.51 2016-07-03,07,gisticLockServiceVM,245.00,173.05 2016-07-03,07,kingMFSAdapterServiceVM,781.50,327.13 2016-07-03,07,ferWMSAdapterServiceVm,196.00,84.02 2016-07-03,07,geMFSAdapterServiceVM,499.50,256.91 2016-07-03,07,ferMFSAdapterServiceVM,456.50,246.89 2016-07-03,07,kingWMSAdapterServiceVm,195.00,73.70 2016-07-03,07,AdapterServiceVm,149.50,72.62 2016-07-03,07,ter2MFSAdapterServiceVM,455.00,136.02 2016-07-03,07,ionServiceVM,484.00,240.46 2016-07-03,07,ter3WMSAdapterServiceVm,266.00,138.70 2016-07-03,07,iceVm,135.50,106.07 2016-07-03,07,viceVm,3317.00,1882.15 2016-07-03,07,entBCSServiceVM,356.50,143.93 2016-07-03,07,ServiceVm,951.00,227.12 2016-07-03,07,lingServiceVM,145.50,76.61 2016-07-03,07,entDBHServiceVM,182.50,4.63 2016-07-03,07,kingWMSAdapterServiceVm,208.00,103.13 2016-07-03,07,gingServiceVM,1529.50,235.84 2016-07-03,07,ServiceVM,249.50,131.78 2016-07-03,07,ter1MFSAdapterServiceVM,453.00,394.11 2016-07-03,07,AdapterServiceVM,461.00,208.41 2016-07-03,07,ter2WMSAdapterServiceVm,178.50,79.93 2016-07-03,07,AdapterServiceVm,395.00,131.08 2016-07-03,07,ingServiceVM,184.50,126.28 已被裁剪,只是为了隐藏服务名称等。

有用的链接

A nice explanation of jstat -gc output