【问题标题】:How to calculate CPU utilization effectively using bash?如何使用 bash 有效计算 CPU 利用率?
【发布时间】:2012-11-12 00:57:11
【问题描述】:

我正在尝试计算单个 CPU 的整体 CPU 利用率,Ubuntu 系统使用 bash。我需要我正在制作的系统监控脚本的总体 CPU 使用百分比。问题是,当我使用以下代码时,CPU 利用率百分比始终相同:

top -n 1 | grep "Cpu"

我发现的另一种方法是使用以下代码:

read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
echo $CPU

这段代码的问题是我不知道它是否完全准确。我有几个问题...首先为什么第一个代码会失败?第二,第二个代码可靠吗?如果没有,我可以使用什么代码来可靠地读取系统的整体 CPU 利用率?谢谢!

【问题讨论】:

    标签: linux bash ubuntu cpu utilization


    【解决方案1】:

    您的代码正在丢弃可能影响 CPU 利用率的 IO 等待时间。可以参考下面的链接查看每个/proc/stat/条目对应的内容:

    http://man7.org/linux/man-pages/man5/proc.5.html

    总体CPU利用率可以通过以下公式计算:

    CPU_Util = (user+system+nice+softirq+steal)/(user+system+nice+softirq+steal+idle+iowait)

    一个简单的 bash 脚本可以计算超过 50 毫秒的 CPU 利用率:

    #!/system/bin/sh
    
    # Read /proc/stat file
    read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
    
    cpu_active_prev=$((user+system+nice+softirq+steal))
    cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))
    
    usleep 50000
    
    read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
    
    cpu_active_cur=$((user+system+nice+softirq+steal))
    cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))
    
    cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))
    
    echo $cpu_util
    

    【讨论】:

      【解决方案2】:

      sysstat 包中的mpstat 相当不错

      您必须使用 apt-get 安装 sysstat

      【讨论】:

      • 我不知道我是否做错了什么,但是当我做错了时:while true; do; mpstat; done; 即使我正在运行多个进程,我的 CPU 利用率也总是相同。
      • 好吧,现在我发现如果你不带任何参数运行 mpstat 命令,输出是无意义的……它必须像这样使用mpstat 1 1
      猜你喜欢
      • 2023-04-09
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2012-06-13
      • 2011-07-27
      • 2011-04-14
      相关资源
      最近更新 更多