GNU/Linux >> Linux の 問題 >  >> Linux

CPU使用率を取得する方法

このパッケージ http://github.com/c9s/goprocinfo をチェックしてください。goprocinfo パッケージが解析を行います。

stat, err := linuxproc.ReadStat("/proc/stat")
if err != nil {
    t.Fatal("stat read fail")
}

for _, s := range stat.CPUStats {
    // s.User
    // s.Nice
    // s.System
    // s.Idle
    // s.IOWait
}

同様の問題があり、軽量の実装は見つかりませんでした。これは、特定の質問に答える私のソリューションのスリム化されたバージョンです。 /proc/stat をサンプリングします tylerl が推奨するファイルと同じです。 top の出力と一致するようにサンプル間で 3 秒待機していることに気付くでしょうが、1 秒または 2 秒でも良い結果が得られました。同様のコードを go ルーチン内のループで実行し、必要なときに他の go ルーチンから CPU 使用率にアクセスします。

top -n1 | grep -i cpu の出力を解析することもできます CPU使用率を取得するために使用しましたが、私のLinuxボックスでは0.5秒間しかサンプリングされず、負荷が高い間はかなりオフでした.通常のトップと次のプログラムを同期すると、非常によく一致するように見えました:

package main

import (
    "fmt"
    "io/ioutil"
    "strconv"
    "strings"
    "time"
)

func getCPUSample() (idle, total uint64) {
    contents, err := ioutil.ReadFile("/proc/stat")
    if err != nil {
        return
    }
    lines := strings.Split(string(contents), "\n")
    for _, line := range(lines) {
        fields := strings.Fields(line)
        if fields[0] == "cpu" {
            numFields := len(fields)
            for i := 1; i < numFields; i++ {
                val, err := strconv.ParseUint(fields[i], 10, 64)
                if err != nil {
                    fmt.Println("Error: ", i, fields[i], err)
                }
                total += val // tally up all the numbers to get total ticks
                if i == 4 {  // idle is the 5th field in the cpu line
                    idle = val
                }
            }
            return
        }
    }
    return
}

func main() {
    idle0, total0 := getCPUSample()
    time.Sleep(3 * time.Second)
    idle1, total1 := getCPUSample()

    idleTicks := float64(idle1 - idle0)
    totalTicks := float64(total1 - total0)
    cpuUsage := 100 * (totalTicks - idleTicks) / totalTicks

    fmt.Printf("CPU usage is %f%% [busy: %f, total: %f]\n", cpuUsage, totalTicks-idleTicks, totalTicks)
}

私が bitbucket で書いた完全な実装へのリンクが許可されているようです。そうでない場合は、これを削除してください。ただし、今のところ Linux でのみ動作します:systemstat.go


Linux
  1. LinuxでプロセスのCPU使用率を制限する方法

  2. メモリとCPU使用率で上位のプロセスを見つける方法

  3. psを印刷グループにするにはどうすればよいですか?

  1. bashでプロセッサ使用率を取得するには?

  2. LinuxでARM CPUクロック速度を取得するには?

  3. 高CPU使用率を引き起こしているプロセスを見つける方法

  1. シェルスクリプトでCPU使用率を取得しますか?

  2. C++ を使用して Linux で合計 CPU 使用率を取得する方法

  3. vmstat でメモリ使用率を取得するには?