Consulte este paquete http://github.com/c9s/goprocinfo, el paquete goprocinfo hace el análisis por usted.
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
}
Tuve un problema similar y nunca encontré una implementación ligera. Aquí hay una versión reducida de mi solución que responde a su pregunta específica. Muestro el /proc/stat
archivo tal como lo recomienda tylerl. Notarás que espero 3 segundos entre muestras para igualar la salida de top, pero también he tenido buenos resultados con 1 o 2 segundos. Ejecuto un código similar en un bucle dentro de una rutina go, luego accedo al uso de la CPU cuando lo necesito de otras rutinas go.
También puede analizar la salida de top -n1 | grep -i cpu
para obtener el uso de la CPU, pero solo muestrea durante medio segundo en mi caja de Linux y se apagó durante la carga pesada. La parte superior normal parecía coincidir mucho cuando la sincronicé y el siguiente programa:
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)
}
Parece que puedo vincular a la implementación completa que escribí en bitbucket; si no es así, siéntete libre de borrar esto. Sin embargo, hasta ahora solo funciona en Linux:systemstat.go