这是一个多次被问过的问题,但是我找不到很好的支持答案.
许多人建议使用top命令,但如果你运行top一次(因为你有一个脚本,例如每1秒收集一次Cpu使用),它将始终给出相同的Cpu使用结果(例1,例2).
计算CPU使用率的更准确方法是从中读取值/proc/stat
,但大多数答案仅使用前4个字段/proc/stat
来计算它(此处为一个示例).
/proc/stat/
从Linux内核2.6.33开始,每CPU核心有10个字段!
我还使用/ proc/stat问题在Linux中找到了这个准确计算CPU利用率的问题,该问题指出了同样的问题 - 大多数其他问题只考虑了许多领域中的4个问题 - 但这里给出的答案仍然是"我在认为"(不确定),除此之外,它只关注前7个领域(满分为10个/proc/stat/
)
这个 perl脚本使用所有字段来计算CPU使用率,经过一些进一步的调查后我再也认为这是不正确的.
采取快速查找到内核代码后在这里,它看起来像,例如,guest_nice
并且guest fields
总是与一起增加nice
和user
(所以他们不应该被包含在CPU使用率计算,因为它们包含在nice
和user
领域已经)
/*
* Account guest cpu time to a process.
* @p: the process that the cpu time gets accounted to
* @cputime: the cpu time spent in virtual machine since the last update …
Run Code Online (Sandbox Code Playgroud) 我知道[1]。通过几行代码,我只想从CPU使用率最高的前n个进程中提取当前的CPU使用率。或多或少都是前5排的顶部。使用github.com/shirou/gopsutil/process这很简单:
// file: gotop.go
package main
import (
"log"
"time"
"sort"
"github.com/shirou/gopsutil/process"
)
type ProcInfo struct{
Name string
Usage float64
}
type ByUsage []ProcInfo
func (a ByUsage) Len() int { return len(a) }
func (a ByUsage) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByUsage) Less(i, j int) bool {
return a[i].Usage > a[j].Usage
}
func main() {
for {
processes, _ := process.Processes()
var procinfos []ProcInfo
for _, p …
Run Code Online (Sandbox Code Playgroud)