我的Go程序需要知道所有系统和用户进程的当前cpu使用百分比.

我怎样才能得到呢?

推荐答案

我也有类似的问题,从未找到轻量级的实现.下面是我的解决方案的精简版本,可以回答您的具体问题.我按照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

Linux相关问答推荐

将UTC字符串日期时间转换为毫秒UTC时间戳

如何根据具体情况打印两行输出?

在不编写任何代码的情况下,是否有一个命令可以检索当前 shell 的亲和力中的可用内核数?

我需要制作一个 awk 脚本来解析文件中的文本.我不确定我是否做得正确

使用 awk 将多行文本转换为 CSV

获取变量中的当前路径并使用它

从 .war 文件外部化 Tomcat webapp 配置

如何在python中检索进程开始时间(或正常运行时间)

为什么在编译 K&R2 第 1 章中最长的行示例时出现getline 的类型冲突错误?

C hello world 的汇编输出的每一行是什么意思?

如何在 linux ElementaryOS 中修复 Genymotion,但未找到错误CXXABI_1.3.8

任何方式以编程方式在android上运行shell命令?

使用 linux 命令行 (bash) 从网络摄像头拍照

如何在 Linux 上取消关机?

使用 C++ 和 Linux 的高分辨率计时器?

根据文件名模式和文件内容列出文件名?

在 Python 中删除 Root 权限

比较文件的日期 bash

Docker:您是否try 连接到没有 TLS 的启用 TLS 的守护进程?

Linux如何确定下一个PID?