我的Go程序需要知道所有系统和用户进程的当前cpu使用百分比。
我怎样才能获得?
在64位系统上编译32位二进制
在Go中枚举registry值(Golang)
Go编译器有一个窗口设置选项吗?
我想在Windows上开发并部署到Google App ENGIne
在Windows中从Golang启动新的命令窗口
我有类似的问题,从来没有找到一个轻量级的实现。 这是我的解决方案的一个减肥版本,可以解答您的具体问题。 我像tylerl推荐的那样采样/proc/stat文件。 你会注意到,我在样本之间等了3秒,以匹配顶部的输出,但是我也有1或2秒的好结果。 我在循环中运行类似的代码,然后当我需要从其他的例程中访问cpu使用情况。
你也可以解析top -n1 | grep -i cpu的输出 top -n1 | grep -i cpu来获得cpu使用率,但它只在我的Linux机器上采样了半秒钟,而且在负载较重的时候它已经关闭了。 当我同步它和下面的程序时,常规顶部似乎非常紧密匹配:
package main import ( "fmt" "io/IoUtil" "strconv" "Strings" "time" ) func getcpuSample() (idle,@R_767_10586@l 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) } @R_767_10586@l += val // tally up all the numbers to get @R_767_10586@l ticks if i == 4 { // idle is the 5th field in the cpu line idle = val } } return } } return } func main() { idle0,@R_767_10586@l0 := getcpuSample() time.Sleep(3 * time.Second) idle1,@R_767_10586@l1 := getcpuSample() idleTicks := float64(idle1 - idle0) @R_767_10586@lTicks := float64(@R_767_10586@l1 - @R_767_10586@l0) cpuUsage := 100 * (@R_767_10586@lTicks - idleTicks) / @R_767_10586@lTicks fmt.Printf("cpu usage is %f%% [busy: %f,@R_767_10586@l: %f]n",cpuUsage,@R_767_10586@lTicks-idleTicks,@R_767_10586@lTicks) }
好像我被允许链接到我在bitbucket上写的完整实现; 如果不是,请随时删除。 它只能在linux上运行,但是: systemstat.go
看看这个软件包http://github.com/c9s/goprocinfo,goprocinfo软件包会为你解析这些东西。
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 }
获取cpu使用的机制取决于操作系统,因为数字意味着与不同的操作系统内核略有不同。
在Linux上,您可以通过读取/proc/ filesystem中的伪文件来查询内核以获取最新的统计信息。 当您读取这些信息以反映机器的当前状态时,这些信息即时生成。
具体而言,每个进程的/proc/<pid>/stat文件包含关联的进程记帐信息。 它记录在proc(5)中 。 你特别感兴趣的领域, utime , stime , cutime和cstime (从第14场开始)。
你可以很容易地计算出百分比:只要读取数字,等待一段时间,再读一遍。 采取差异,除以等待的时间,这就是你的平均水平。 这正是top程序所做的(以及执行相同服务的所有其他程序)。 请记住,如果您拥有多个cpu,则可以拥有超过100%的cpu使用率。
如果您只是想要一个系统范围的摘要,那么在/proc/stat报告 – 使用相同的技术计算您的平均值,但您只需读取一个文件。
您可以使用os.exec包执行ps命令并获取结果。
下面是一个发出ps aux命令的程序,解析结果并打印linux上所有进程的cpu使用情况:
package main import ( "bytes" "log" "os/exec" "strconv" "Strings" ) type Process struct { pid int cpu float64 } func main() { cmd := exec.Command("ps","aux") var out bytes.buffer cmd.Stdout = &out err := cmd.Run() if err != nil { log.Fatal(err) } processes := make([]*Process,0) for { line,err := out.ReadString('n') if err!=nil { break; } tokens := Strings.Split(line," ") ft := make([]String,0) for _,t := range(tokens) { if t!="" && t!="t" { ft = append(ft,t) } } log.Println(len(ft),ft) pid,err := strconv.Atoi(ft[1]) if err!=nil { conTinue } cpu,err := strconv.ParseFloat(ft[2],64) if err!=nil { log.Fatal(err) } processes = append(processes,&Process{pid,cpu}) } for _,p := range(processes) { log.Println("Process ",p.pid," takes ",p.cpu," % of the cpu") } }
这是一个独立于操作系统的解决方案,使用Cgo来利用C标准库提供的clock()函数:
//#include <time.h> import "C" import "time" var startTime = time.Now() var startTicks = C.clock() func cpuUsagePercent() float64 { clockSeconds := float64(C.clock()-startTicks) / float64(C.CLOCKS_PER_SEC) realSeconds := time.Since(startTimE).Seconds() return clockSeconds / realSeconds * 100 }
我最近不得不从RaspBerry Pi(Raspbian操作系统)获取cpu使用率的测量数据,并使用了github.com/c9s/goprocinfo和这里提出的内容:
在Linux中以百分比的形式精确计算cpu使用率?
这个想法来自于htop源代码,并且为了计算cpu使用情况,需要有两个测量值(prevIoUs / current):
func calcSingleCoreUsage(curr,prev linuxproc.cpuStat) float32 { PrevIdle := prev.Idle + prev.IOWait Idle := curr.Idle + curr.IOWait PrevNonIdle := prev.User + prev.Nice + prev.System + prev.IRQ + prev.softIRQ + prev.Steal NonIdle := curr.User + curr.Nice + curr.System + curr.IRQ + curr.softIRQ + curr.Steal Prev@R_767_10586@l := PrevIdle + PrevNonIdle @R_767_10586@l := Idle + NonIdle // fmt.Println(PrevIdle,Idle,PrevNonIdle,NonIdle,Prev@R_767_10586@l,@R_767_10586@l) // differentiate: actual value minus the prevIoUs one @R_767_10586@ld := @R_767_10586@l - Prev@R_767_10586@l idled := Idle - PrevIdle cpu_Percentage := (float32(@R_767_10586@ld) - float32(idled)) / float32(@R_767_10586@ld) return cpu_Percentage }
对于更多,你也可以检查https://github.com/tgogos/rpi_cpu_memory
大佬总结
以上是大佬教程为你收集整理的通过golang获取CPU使用情况全部内容,希望文章能够帮你解决通过golang获取CPU使用情况所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。