【问题标题】:Parsing values from TOP command and then add them up从 TOP 命令解析值,然后将它们相加
【发布时间】:2014-07-30 15:04:05
【问题描述】:

我的虚拟机中平均 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 文件,它只是来自我的 VM 的 TOP 日志,所以我想从那里开始)

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

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

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

最好的问候

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 感谢您的回复。这是 top_VM.txt pastebin.com/R8CrbakW 的一部分,我不想把完整的第 9 列加起来。我想为每个顶级快照添加 %CPU。这意味着最后我应该得到一个总和表。
    • 其实你文件中的第 9 列是 CPU% :)
    • 是的,但这不是问题,问题是我在批处理模式下运行 TOP,所以它会每 0.5 秒保存一次快照。现在我想知道每个快照的总 CPU 使用率。根据您的想法,它会将第 9 列中的所有值相加。我不要那个。我想得到一个表格,显示保存在 top_VM.txt 中的每个快照的 %CPU 总和(请参阅 pastebin 链接)。它基本上必须开始将 %CPU 文本下方的值相加,并在到达该列中的空白处时立即停止,然后重复。
    • 非常感谢,您的脚本运行良好,虽然看起来有点慢。
    • 酷,所以你最终会接受这个答案:D,不客气,这是因为读取(逐行),我可以建议你通过快照将文件拆分为文件,然后在我之前的回答中描述的每个快照上调用 awk。
    【解决方案2】:

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

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

    你也可以考虑printf。见The GNU Awk User’s Guide

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2017-06-16
      相关资源
      最近更新 更多