GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir l'utilisation du processeur

Découvrez ce package http://github.com/c9s/goprocinfo, le package goprocinfo effectue l'analyse pour vous.

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
}

J'ai eu un problème similaire et je n'ai jamais trouvé d'implémentation légère. Voici une version allégée de ma solution qui répond à votre question spécifique. Je sample le /proc/stat fichier comme le recommande tylerl. Vous remarquerez que j'attends 3 secondes entre les échantillons pour correspondre à la sortie de top, mais j'ai aussi eu de bons résultats avec 1 ou 2 secondes. J'exécute un code similaire dans une boucle dans une routine go, puis j'accède à l'utilisation du processeur lorsque j'en ai besoin à partir d'autres routines go.

Vous pouvez également analyser la sortie de top -n1 | grep -i cpu pour obtenir l'utilisation du processeur, mais il n'échantillonne que pendant une demi-seconde sur ma machine Linux et c'était loin pendant une charge importante. Le top régulier semblait correspondre de très près lorsque je l'ai synchronisé avec le programme suivant :

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

Il semble que je sois autorisé à créer un lien vers l'implémentation complète que j'ai écrite sur bitbucket ; si ce n'est pas le cas, n'hésitez pas à le supprimer. Cela ne fonctionne que sur Linux jusqu'à présent :systemstat.go


Linux
  1. Comment limiter l'utilisation du processeur d'un processus sous Linux

  2. Comment trouver les principaux processus en cours d'exécution par utilisation de la mémoire et du processeur

  3. Obtenir l'utilisation du processeur dans le script shell ?

  4. Comment obtenir l'utilisation totale du processeur sous Linux en utilisant C++

  5. Comment obtenir ps pour imprimer le groupe?

Comment afficher l'utilisation du processeur à partir de la ligne de commande

Comment trouver les 10 principaux processus en cours d'exécution par utilisation de la mémoire et du processeur

Comment obtenir l'utilisation du processeur d'un seul processus sous Linux

Comment vérifier l'utilisation ou l'utilisation du processeur Linux

Comment puis-je obtenir l'utilisation totale du processeur d'une application à partir de /proc/pid/stat ?

En quoi le temps CPU et l'utilisation du CPU sont-ils identiques ?