GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So erhalten Sie die CPU-Auslastung

Schauen Sie sich dieses Paket an http://github.com/c9s/goprocinfo, das Paket goprocinfo erledigt das Parsen für Sie.

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
}

Ich hatte ein ähnliches Problem und fand nie eine leichte Implementierung. Hier ist eine abgespeckte Version meiner Lösung, die Ihre spezifische Frage beantwortet. Ich probiere den /proc/stat Datei genau wie Tylerl empfiehlt. Sie werden feststellen, dass ich zwischen den Samples 3 Sekunden warte, um die Ausgabe von top abzugleichen, aber ich hatte auch gute Ergebnisse mit 1 oder 2 Sekunden. Ich führe ähnlichen Code in einer Schleife innerhalb einer Go-Routine aus und greife dann auf die CPU-Auslastung zu, wenn ich sie von anderen Go-Routinen benötige.

Sie können auch die Ausgabe von top -n1 | grep -i cpu parsen um die CPU-Auslastung zu erhalten, aber es wird nur eine halbe Sekunde lang auf meiner Linux-Box gesampelt und es war bei hoher Last weit weg. Reguläres Top schien sehr gut zusammenzupassen, als ich es und das folgende Programm synchronisierte:

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)
}

Anscheinend darf ich auf die vollständige Implementierung verlinken, die ich auf Bitbucket geschrieben habe. Wenn nicht, können Sie dies gerne löschen. Bisher funktioniert es allerdings nur unter Linux:systemstat.go


Linux
  1. So begrenzen Sie die CPU-Auslastung eines Prozesses in Linux

  2. So erhalten Sie die gesamte CPU-Auslastung in Linux mit C++

  3. Wie bekomme ich ps zur Druckgruppe?

  4. Wie bekomme ich den Prozentsatz der Prozessorauslastung mit Bash?

  5. Wie bekomme ich % Speicherauslastung mit vmstat?

So zeigen Sie die CPU-Auslastung über die Befehlszeile an

So finden Sie die Top 10 der laufenden Prozesse nach Speicher- und CPU-Auslastung

So erhalten Sie die CPU-Auslastung eines einzelnen Prozesses in Linux

So überprüfen Sie die Linux-CPU-Auslastung oder -Auslastung

Wie erhalte ich die gesamte CPU-Auslastung einer Anwendung aus /proc/pid/stat?

Wie sind CPU-Zeit und CPU-Auslastung gleich?