从 top 命令计算 CPU 使用率

从 top 命令计算 CPU 使用率

我必须显示应用程序的 CPU 使用率并实时更新。我使用以下命令获取 CPU 使用率:

top -b -n 2 | grep Cpu | awk '{printf "CPU Load:%.2f\n", $(NF-13) + $(NF-15)}' | sed -n '2 p'

上述命令确实给了我所需的结果,但过了一段时间后它停止工作,我没有得到更新的 CPU 使用率。任何帮助都可以解释为什么命令在一段时间后停止工作。

答案1

根据以下条件计算 CPU 使用率Linux CPU 利用率

#!/bin/bash

declare -i total idle

# man: proc(5)
# Read first line, skip `cpu', guest, guest_nice.
cpu_usage(){
    local -a a
    local -n b=$1 c=total d=idle
    local    e
    local -i f g

    mapfile -t -s 2 -n 8 -d \  a < /proc/stat
    e=${a[*]}
    ((b=(((f=(g=${e// /+})-c)-(a[3]-d))*1000/f+5)/10))
    c=${g}
    d=${a[3]}
}

# Hide cursor and bring it back on exit.
trap 'tput cnorm' EXIT; tput civis

# An example how you can use cpu_usage
# in a while loop. cpu_usage will use the
# supplied argument as a name reference.
while true; do
    cpu_usage load
    printf \\r%d%%\ \\b $load
    sleep 0.2
done

答案2

您正在从最后一个字段开始倒数,并假设字段数始终相同。但事实并非如此。举个例子,可能还有更多:

doug@s18:~$ top -b -n 2 | grep Cpu
%Cpu(s): 98.9 us,  1.1 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

请注意,在第二次印刷中只有 16 个字段而不是 17 个,因为 : 和“us”负载的第一位数字之间的正常空格不存在,已被“1”占用,因此引用是错误的。

更详细地看,我将在下面添加字段编号(请记住,默认的字段分隔符是空格和制表符):

%Cpu(s): 98.9 us,  1.1 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
1        2    3    4   5    6   7    8   9    10  11   12  13   14  15   16  17
.
%Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
1             2    3   4    5   6    7   8    9   10   11  12   13  14   15  16

确实,运行命令的输出有时会给出错误的答案(循环运行,其中实际负载始终为 100%):

CPU Load: 100.00
CPU Load:   0.00
CPU Load:   0.00
CPU Load: 100.00
CPU Load:   0.00
CPU Load:   0.00

这个 hack 似乎可以解决这个问题:

top -b -n 2 | grep Cpu | sed 's/:/ /g' | awk '{printf "CPU Load:%7.2f\n", $(NF-13) + $(NF-15)}' | sed -n '2 p'

我不知道这是不是你的问题,也不知道这是否是唯一的问题。

相关内容