GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere l'utilizzo della CPU

Dai un'occhiata a questo pacchetto http://github.com/c9s/goprocinfo, il pacchetto goprocinfo esegue l'analisi per te.

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
}

Ho avuto un problema simile e non ho mai trovato un'implementazione leggera. Ecco una versione ridotta della mia soluzione che risponde alla tua domanda specifica. Assaggio il /proc/stat file proprio come consiglia tylerl. Noterai che aspetto 3 secondi tra i campioni per abbinare l'output di top, ma ho anche ottenuto buoni risultati con 1 o 2 secondi. Eseguo un codice simile in un ciclo all'interno di una routine go, quindi accedo all'utilizzo della cpu quando ne ho bisogno da altre routine go.

Puoi anche analizzare l'output di top -n1 | grep -i cpu per ottenere l'utilizzo della cpu, ma campiona solo per mezzo secondo sulla mia macchina Linux ed era molto lontano durante il carico pesante. Regular top sembrava corrispondere molto da vicino quando l'ho sincronizzato con il seguente programma:

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

Sembra che mi sia permesso collegarmi all'implementazione completa che ho scritto su bitbucket; se non lo è, sentiti libero di cancellarlo. Finora però funziona solo su Linux:systemstat.go


Linux
  1. Come limitare l'utilizzo della CPU di un processo in Linux

  2. Come trovare i migliori processi in esecuzione in base all'utilizzo di memoria e CPU

  3. Come ottenere l'utilizzo totale della CPU in Linux usando C++

  4. Come ottenere ps per stampare il gruppo?

  5. Come ottenere la percentuale di utilizzo del processore con bash?

Come visualizzare l'utilizzo della CPU dalla riga di comando

Come trovare i 10 principali processi in esecuzione in base all'utilizzo di memoria e CPU

Come ottenere l'utilizzo della CPU di un singolo processo in Linux

Come controllare l'utilizzo o l'utilizzo della CPU di Linux

Come posso ottenere l'utilizzo totale della CPU di un'applicazione da /proc/pid/stat?

In che modo il tempo della CPU e l'utilizzo della CPU sono uguali?