我也有类似的问题,从未找到轻量级的实现.下面是我的解决方案的精简版本,可以回答您的具体问题.我按照tylerl的建议对/proc/stat
文件进行了采样.您会注意到,我在两个样本之间等待了3秒钟,以匹配top的输出,但我也在1秒或2秒的时间内获得了很好的结果.我在go routine 中循环运行类似的代码,然后在需要时从其他go routine 访问cpu使用情况.
您还可以解析top -n1 | grep -i cpu
的输出以获得cpu使用率,但在我的linux机器上,它只采样半秒钟,而且在重载情况下,它的采样时间非常长.当我将常规上衣与以下程序同步时,它似乎非常匹配:
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