CPU統計計算アルゴリズム

CPU統計計算アルゴリズム

インターネット上で検索しすぎましたが、topコマンドの結果に基づいて%Us、%Sy、%Idなどを計算するアルゴリズムが見つかりませんでした。しかし、文書が見つかりませんでした。
いくつかのファイル、例:これまたはこれCPU使用率を計算しますが、出力はtopコマンドの出力と同じではありません。 (とても違う!!!)

topまたはmpstatコマンドはCPU統計をどのように計算しますか?

答え1

私は次の式を使って計算しました。

result=(CurrentUse-PrevUse)*100/(CurrentTotal-PrevTotal)

これは CPU [us,sys,idle] を計算するサンプルスクリプトです。

#!/bin/bash 

prev_total=0 
prev_idle=0
prev_us=0
prev_sys=0

while true
do
        line=$(head -n1 /proc/stat)

        us=$(echo $line | awk '{print $2}') 
        ni=$(echo $line | awk '{print $3}') 
        sy=$(echo $line | awk '{print $4}') 
        id=$(echo $line | awk '{print $5}') 
        io=$(echo $line | awk '{print $6}') 
        irq=$(echo $line | awk '{print $7}') 
        si=$(echo $line | awk '{print $8}') 
        st=$(echo $line | awk '{print $9}') 
        g=$(echo $line | awk '{print $10}') 
        gn=$(echo $line | awk '{print $11}') 

        total=$(expr $us + $ni + $sy + $id + $io + $irq + $si + $st + $g + $gn) 

        let "diff_total=$total-$prev_total"
        let "diff_idle=$id-$prev_idle"
        let "diff_us=$us-$prev_us"
        let "diff_sys=$sy-$prev_sys"

         let "result_us=$diff_us * 100 / $diff_total" 
         let "result_idle=$diff_idle * 100 / $diff_total" 
         let "result_sys=$diff_sys * 100 / $diff_total" 

         echo -en "\rCpu   us:$result_us%  sys:$result_sys%  idle:$result_idle%\b\b"

        prev_total=$total 
        prev_idle=$id
        prev_us=$us
        prev_sys=$sy
        sleep 1
done

出力は次のとおりです。

Cpu   us:1%  sys:0%  idle:97%

関連情報