【问题标题】:How to get percentage of processor use with bash?如何使用 bash 获取处理器使用百分比?
【发布时间】:2015-01-03 15:42:12
【问题描述】:

我想知道如何让我的处理器使用百分比从 0% 变为 100%?

要知道有多少百分比正在使用我的处理器,最好是在 bash 或其他提供该百分比的方法中。

我有这个脚本,我在 google 上找到的,但是它非常不精确 我试图做更多的改进不能,有没有人知道有什么方法可以得到% 0-100的CPU利用率百分比

我的脚本

NUMCPUS=`grep ^proc /proc/cpuinfo | wc -l`; FIRST=`cat /proc/stat | awk '/^cpu / {print $5}'`; sleep 1; SECOND=`cat /proc/stat | awk '/^cpu / {print $5}'`; USED=`echo 2 k 100 $SECOND $FIRST - $NUMCPUS / - p | dc`; echo ${USED}% CPU Usage

【问题讨论】:

    标签: linux bash shell awk centos


    【解决方案1】:

    处理器使用或利用率是随时间变化的衡量标准。衡量% 利用率的一种方法是计算/proc/stat 的两次连续读取。一个简单的常用 bash 脚本来计算百分比是:

    #!/bin/bash
    
    # Read /proc/stat file (for first datapoint)
    read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
    
    # compute active and total utilizations
    cpu_active_prev=$((user+system+nice+softirq+steal))
    cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))
    
    usleep 50000
    
    # Read /proc/stat file (for second datapoint)
    read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
    
    # compute active and total utilizations
    cpu_active_cur=$((user+system+nice+softirq+steal))
    cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))
    
    # compute CPU utilization (%)
    cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))
    
    printf " Current CPU Utilization : %s\n" "$cpu_util"
    
    exit 0
    

    使用/输出:

    $ bash procstat-cpu.sh
     Current CPU Utilization : 10
    

    5 次迭代的输出:

    $ ( declare -i cnt=0; while [ "$cnt" -lt 5 ]; do bash procstat-cpu.sh; ((cnt++)); done )
     Current CPU Utilization : 20
     Current CPU Utilization : 18
     Current CPU Utilization : 18
     Current CPU Utilization : 18
     Current CPU Utilization : 18
    

    【讨论】:

    • 我看到/proc/stat 有更多数据。你能链接一个我可以阅读更多内容的参考吗?
    • @WinEunuuchs2Unix - 哦,是的,很多,proc(5) - Linux manual page
    • @DavidC.Rankin 读得真好!我认为您的公式适用于超过 0.05 秒(50,000 微秒)的 CPU 利用率。我的 conky 显示每秒按 CPU 百分比更新。如果它使用您的公式,那么我会丢失 95% 的利用率吗?请注意这一点,但是计算空闲百分比不是更容易吗?如果是 80%,那么可以推断 CPU 利用率为 20%,包括系统、用户、IRQ 等?无论如何感谢分享:)
    【解决方案2】:

    获取系统启动后的总使用百分比:

    awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
    

    获取上一秒的使用百分比:

    awk -v a="$(awk '/cpu /{print $2+$4,$2+$4+$5}' /proc/stat; sleep 1)" '/cpu /{split(a,b," "); print 100*($2+$4-b[1])/($2+$4+$5-b[2])}'  /proc/stat
    

    说明

    来自man 5 proc/proc/stat中cpu行前四个数字的含义由下式给出:

    cpu 3357 0 4313 1362393
    时间量,以 USER_HZ 为单位(在大多数架构上为 1/100 秒,使用 sysconf(_SC_CLK_TCK) 获得正确的值),系统花费 在用户模式、低优先级的用户模式(nice)、系统模式和空闲任务中分别。最后一个值 应该是 USER_HZ 乘以正常运行时间中的第二个条目 伪文件。

    获取CPU使用率,我们将用户和系统时间相加,然后除以用户、系统和空闲时间的总和。

    让我们再看一下系统启动后总 CPU 使用率的计算:

    awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
    

    通过要求行匹配cpu,我们得到系统总数。第二列是用户时间,第四列是系统时间,第五列是空闲时间。该比率乘以 100 得到一个百分比。

    现在,让我们考虑一下最近的 CPU 使用情况:

     awk -v a="$(awk '/cpu /{print $2+$4,$2+$4+$5}' /proc/stat; sleep 1)" '/cpu /{split(a,b," "); print 100*($2+$4-b[1])/($2+$4+$5-b[2])}'  /proc/stat
    

    这会读取两次/proc/cpu,相隔一秒。第一次,CPU用户+系统,用户+系统+空闲时间保存在变量a中。 sleep 被调用延迟一秒钟。然后,/proc/cpu 被第二次读取。从新总数中减去旧用户+系统总数,然后除以所有时间总数的变化。结果乘以 100 以将其转换为百分比并打印出来。

    【讨论】:

    • 谢天谢地,这真的是我想表达的意思不准确,您解释了对我有很大帮助的计算!谢谢你的朋友!
    • 运行速度比使用 top -bn2 快得多,尤其是如果您将 sleep 1 更改为 sleep 0.3
    【解决方案3】:
    top -bn1 | sed -n '/Cpu/p'
    

    给出以下行

    Cpu(s): 15.4%us,  5.3%sy,  0.0%ni, 78.6%id,  0.5%wa,  0.0%hi,  0.1%si,  0.0%st
    

    您可以使用以下任何 CPU 字段拉取 user CPU (us)

    top -bn1 | sed -n '/Cpu/p' | awk '{print $2}' | sed 's/..,//'
    

    输出:

    15.4%
    

    如果您想要另一个字段,例如 system CPU (sy),您可以将 awk 字段从 $2 更改,

    top -bn1 | sed -n '/Cpu/p' | awk '{print $3}' | sed 's/..,//'
    

    输出:

    5.3%
    

    如果你想要其他 CPU:

    us:     user    CPU used by user processes
    sy:     system  CPU used by system/kernel processes
    ni:     nice    CPU used by processes that were reniced
    id:     idle    CPU not used
    wa:     io wait     Essentially idle CPU waiting on IO devices
    hi:     hardware irq    CPU used to service hardware IRQs
    si:     software irq    CPU used to service soft IRQs
    st:     steal time  CPU time which the hypervisor dedicated (or ‘stole’) for other guests in the system.
    

    【讨论】:

      【解决方案4】:

      非常简单的脚本,只考虑系统、空闲和用户。

      相对于其他答案的好处是它不需要实用程序,甚至不需要顶部,并且还显示分数,而当前的顶部答案不需要。

      #!/bin/bash
      read u1 s1 i1 <<< $(grep 'cpu ' /proc/stat | awk '{print $2" "$4" "$5}' )
      sleep 1
      read u2 s2 i2 <<< $(grep 'cpu ' /proc/stat | awk '{print $2" "$4" "$5}' )
      u=$(echo "scale=4;$u2-$u1" | bc)
      s=$(echo "scale=4;$s2-$s1" | bc)
      i=$(echo "scale=4;$i2-$i1" | bc)
      cpu=$(echo "scale=4;($u+$s)*100/($u+$s+$i)" | bc)
      echo $cpu
      

      简要说明 - 我们从 /proc/stat 中以“cpu”开头的行提取数据。然后我们解析出第二个令牌是用户时间,第四个令牌是系统时间,第五个令牌是空闲时间。

      此时,您可能只想做数学计算,但您所能得到的只是自启动时以来的利用率。我们还需要一个数据点。

      我们休眠 1 秒,然后再次从 /proc/stat 中提取数据。现在我们得到了第一次拉动和第二次拉动之间的区别。这是我们睡觉时那 1 秒的 CPU 利用率。

      我们得到每个变量的差异,然后对差异进行数学运算。每次计算前面的奇怪的 'scale=4' 是强制一个具有 4 位精度的浮点答案。

      【讨论】:

        猜你喜欢
        • 2020-01-20
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        相关资源
        最近更新 更多