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

标签 linux bash parsing virtual-machine cpu-usage

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

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

(遗憾的是我还不能发布截图)

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

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

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

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

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

最好的问候

最佳答案

如果您在/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

关于linux - 从 TOP 命令解析值,然后将它们相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040306/

相关文章:

linux - 设备驱动程序中的错误 : ‘usb_serial_probe’ undeclared, linux 3.10

linux - 如何在linux中将net-snmp默认端口更改为比1024小1?

Linux:将来自两个不同文件的数据合并为一个,它是如何完成的?

c - 在 C 套接字上接收整数数组的最佳方法

linux - 从查找中排除文件列表

linux - Linux Shell 脚本中的动态注释更改

bash - mv操作中引用通配符

bash - 如何自动保存我(每次)运行的最后一个命令的输出?

javascript - 如何从 URL 字符串中删除一些参数?

linux - 为什么 Puppet 解析器在某些情况下失败,但对其他相同的情况有效?