如何获得CPU使用率

如何获得CPU使用率

本文介绍了如何获得CPU使用率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My Go program needs to know the current cpu usage percentage of all system and user processes.

我如何获得?

推荐答案

我遇到了类似的问题,但从未找到轻量级的实现.这是我的解决方案的精简版,可以回答您的特定问题.就像tylerl推荐的一样,我对/proc/stat文件进行了采样.您会注意到,我在两次采样之间等待3秒以匹配top的输出,但是在1或2秒的情况下我也取得了不错的结果.我在go例程中的循环中运行类似的代码,然后在需要其他go例程使用它时访问cpu用法.

I had a similar issue and never found a lightweight implementation. Here is a slimmed down version of my solution that answers your specific question. I sample the /proc/stat file just like tylerl recommends. You'll notice that I wait 3 seconds between samples to match top's output, but I have also had good results with 1 or 2 seconds. I run similar code in a loop within a go routine, then I access the cpu usage when I need it from other go routines.

您也可以解析top -n1 | grep -i cpu的输出以获取cpu的使用情况,但是它在我的Linux机器上仅采样了半秒钟,并且在繁重的工作中已经消失了.当我将其与以下程序同步时,常规顶部似乎非常匹配:

You can also parse the output of top -n1 | grep -i cpu to get the cpu usage, but it only samples for half a second on my linux box and it was way off during heavy load. Regular top seemed to match very closely when I synchronized it and the following program:

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

It seems like I'm allowed to link to the full implementation that I wrote on bitbucket; if it's not, feel free to delete this. It only works on linux so far, though: systemstat.go

这篇关于如何获得CPU使用率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 18:44