这是一个已经被问了很多次的问题,但是我找不到很好的支持的答案。
许多人建议使用顶级命令,但如果您运行顶部一次(因为您有一个脚本,例如每1秒收集Cpu使用),它将始终给出相同的Cpu使用结果(example 1,example 2)。
更准确的计算CPU使用率的方法是通过读取/ proc / stat中的值,但是大多数答案只使用/ proc / stat中的前4个字段来计算(一个例子here)。
/ proc / stat /每个CPU内核有10个字段,从Linux内核2.6.33开始!
我也发现这个Accurately Calculating CPU Utilization in Linux using /proc/stat这个问题指出了同样的问题,大多数其他问题只考虑到许多领域中的4个 – 但是这里给出的答案仍然以“我认为”(不确定)开始,除了,只关注前7个字段(/ proc / stat / 10中的10个)
This perl脚本使用所有的字段来计算CPU使用率,再次我认为在进一步的调查之后是不正确的。
在快速查看内核代码here后,它看起来像,例如,guest_nice和客户字段总是与nice和user一起增加(因此它们不应该包含在cpu使用计算中,因为它们包含在nice和用户字段)
/*
* 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
* @cputime_scaled: cputime scaled by cpu frequency
*/
static void account_guest_time(struct task_struct *p, cputime_t cputime,
cputime_t cputime_scaled)
{
u64 *cpustat = kcpustat_this_cpu->cpustat;
/* Add guest time to process. */
p->utime += cputime;
p->utimescaled += cputime_scaled;
account_group_user_time(p, cputime);
p->gtime += cputime;
/* Add guest time to cpustat. */
if (task_nice(p) > 0) {
cpustat[CPUTIME_NICE] += (__force u64) cputime;
cpustat[CPUTIME_GUEST_NICE] += (__force u64) cputime;
} else {
cpustat[CPUTIME_USER] += (__force u64) cputime;
cpustat[CPUTIME_GUEST] += (__force u64) cputime;
}
}
所以总结一下,什么是计算CPU使用率的准确方法,哪些领域应该在计算中考虑,哪些领域归因于空闲时间以及哪些字段为非空闲时间?