这个问题已经被问过很多次了,但是我找不到一个得到充分支持的答案.
许多人建议使用top命令,但如果您运行top一次(因为您有一个脚本,例如每1秒收集一次Cpu使用情况),它将始终给出相同的Cpu使用情况结果(example 1example 2).
计算CPU使用率的更准确方法是读取/proc/stat
中的值,但大多数答案只使用/proc/stat
中的前4个字段来计算CPU使用率(一个示例here).
从Linux内核2.6.33开始,/proc/stat/
每个CPU核心有10个字段!
我还发现了这Accurately Calculating CPU Utilization in Linux using /proc/stat个问题,它指出了同样的问题——大多数其他问题只考虑了众多领域中的4个领域——但这里给出的答案仍然以"我认为"(不确定)开头,除此之外,它只关注前7个领域(/proc/stat/
中的10个领域)
This perl脚本使用所有字段来计算CPU使用率,经过进一步调查后,我认为这也是不正确的.
在快速查看内核代码here之后,例如,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
* @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;
}
}
总之,在Linux中,计算CPU使用率的准确方法是什么?计算中应该考虑哪些字段,以及如何计算(哪些字段归因于空闲时间,哪些字段归因于非空闲时间)?