Lihat paket ini http://github.com/c9s/goprocinfo, paket goprocinfo melakukan penguraian untuk Anda.
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
}
Saya memiliki masalah serupa dan tidak pernah menemukan implementasi yang ringan. Ini adalah versi ramping dari solusi saya yang menjawab pertanyaan spesifik Anda. Saya mencicipi /proc/stat
file seperti yang tylerl rekomendasikan. Anda akan melihat bahwa saya menunggu 3 detik antara sampel untuk mencocokkan keluaran teratas, tetapi saya juga mendapatkan hasil yang baik dengan 1 atau 2 detik. Saya menjalankan kode serupa dalam satu lingkaran dalam rutinitas go, lalu saya mengakses penggunaan cpu saat saya membutuhkannya dari rutinitas go lainnya.
Anda juga dapat mengurai keluaran dari top -n1 | grep -i cpu
untuk mendapatkan penggunaan cpu, tetapi hanya mengambil sampel setengah detik di kotak linux saya dan mati saat beban berat. Top reguler sepertinya sangat cocok ketika saya menyinkronkannya dan program berikut:
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)
}
Sepertinya saya diizinkan menautkan ke implementasi penuh yang saya tulis di bitbucket; jika tidak, silakan hapus ini. Sejauh ini hanya berfungsi di linux:systemstat.go