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