我的虚拟机中的平均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
这将给我相关的行,但我不知道如何迭代它将值保存为变量并添加它们。我很感激你的想法。
祝你好运
答案 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。