从TOP命令解析值然后将它们相加

时间:2014-07-30 15:04:05

标签: linux bash parsing virtual-machine cpu-usage

我的虚拟机中的平均CPU负载的TOP命令输出有问题。它显示错误的值,例如在具有 1 Virtual Core 的VM中,%Cpu0显示3%的使用率,而我看到一个消耗98%的进程。

有趣的是,有时它确实可以正常工作。例如,当消费过程'用户是VM或Root时。但是当我在我的VM上运行的owncloud实例上使用JMeter执行POST请求时,VM中会出现一个新进程,该进程占用cpu并由用户“www-data”执行。不知何故,这个过程的使用不会出现在平均CPU负载中。 cpu肯定会被使用,因为我可以看到我的虚拟机监视器中的使用情况。

(不幸的是我无法发布截图)

这就是为什么我要解析TOP中显示的每个进程的CPU使用率,然后将这些值相加以计算自己的CPU使用总量以获得准确的结果。

(在我运行我的测量脚本之后,我将得到一个top_VM.txt文件,它只是我VM的TOP日志,所以我想从那里开始)

到目前为止,我得到了这个:

awk '{ print $9 }' /home/user/top_VM.txt

这将给我相关的行,但我不知道如何迭代它将值保存为变量并添加它们。我很感激你的想法。

祝你好运

2 个答案:

答案 0 :(得分:1)

如果/home/user/top_VM.txt中的第9列包含这样的数字:

10

12.5

0

0.5

...

你可以这样做:

awk '{ sum+=$9} END {print sum}' /home/user/top_VM.txt

如果您的第9列不仅包含您可以执行的编号:

#The first awk is to get only number part (12.3 from 12.3%cpu)
awk '{printf ("%f\n",$9)} ' /home/user/top_VM.txt | awk '{ sum+=$1} END {print sum} '

为了计算每个快照的cpu%,您可以使用以下脚本:

#!/bin/bash
count="0"
VM="VM cpu usage : "
SUM="ONSTART"

 while read line ; 
 do
     #extract the first word in each line
     TMP=$(echo $line | awk '{printf $1}')

     #if its equal to PID then we have a new snapshot
     #SUM variable is to prevent writing to result file before calculating cpu% the first time we have a snapshot   
     if [[ "$TMP" == "PID"  && "$SUM" == "NEWVM" ]] ; then
        #increment snapshot number
        let count++
        echo "$count $VM $NUM" >> result
        NUM="0" 
     fi

     #if we have a number so its the pid of a process
     if [[ $TMP  =~ ^[0-9]+$ ]] ; then
        #get cpu value
        NEWNUM=$(echo $line | awk '{printf ("%f\n",$9)}')
        #add new value to previous ones
        NUM=$( echo "$NUM $NEWNUM" | awk '{print $1 + $2}')
        SUM="NEWVM"
     fi

done < /home/user/top_VM.txt
#Save cpu usage for the last snapshot
let count++
echo "$count $VM $NUM" >> result

答案 1 :(得分:0)

您可以为每个循环使用计数器并使用END块。基本上它是这样的:

awk '{ print $9; sum += $9 } END { print "Sum:", sum }' /home/user/top_VM.txt

您也可以考虑printf。请参阅The GNU Awk User’s Guide