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