我的Go程序需要知道所有系统和用户进程的当前cpu使用率。
我如何获得?
我遇到了类似的问题,但从未找到轻量级的实现。这是我的解决方案的精简版,可以回答您的特定问题。我按照/proc/stattylerl的建议对文件进行采样。您会注意到,我在两次采样之间等待3秒以匹配top的输出,但是在1或2秒的情况下我也取得了不错的结果。我在go例程中的循环中运行类似的代码,然后在需要其他go例程时访问cpu用法。
/proc/stat
您也可以解析输出top -n1 | grep -i cpu以获取cpu的使用情况,但是它在我的Linux机器上仅采样了半秒钟,在繁重的工作中已经消失了。当我将其与以下程序同步时,常规顶部似乎非常匹配:
top -n1 | grep -i cpu
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) }
似乎可以链接到我在bitbucket上编写的完整实现;如果不是,请随时删除它。到目前为止,它仅适用于linux:systemstat.go