这是一个经常被问到但我找不到确切答案的问题。很多人建议使用top命令,但如果你运行一次top命令(例如因为你有一个脚本每1秒收集Cpu使用率),它总会给出相同的Cpu使用率结果(示例1,示例2)。更准确计算CPU使用率的方法是从/proc/stat中读取值,但大多数答案只使用/proc/stat的前4个字段来计算它(一个例子在这里)。Linux内核2.6.33版本后,每个CPU核心在/proc/stat中有10个字段!
我还发现了这个使用/proc/stat在Linux中准确计算CPU利用率的问题,它指出了同样的问题 - 大多数其他问题只考虑了其中4个字段 - 但是这里给出的答案仅以“我认为”(不确定)开头,并且除此之外,它仅关注前7个字段(
这个Perl脚本使用所有字段来计算CPU使用情况,但经过进一步调查后,我认为这也是不正确的。
我还发现了这个使用/proc/stat在Linux中准确计算CPU利用率的问题,它指出了同样的问题 - 大多数其他问题只考虑了其中4个字段 - 但是这里给出的答案仅以“我认为”(不确定)开头,并且除此之外,它仅关注前7个字段(
/proc/stat/
中的10个字段中的前7个)。这个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使用率的方法?哪些字段应该考虑在计算中以及如何考虑(哪些字段归因于空闲时间,哪些字段归因于非空闲时间)?
top -b
持续运行,因此必须在单独的线程中运行,并将收集的数据保存在不同的输出中。 - Vangelis Tasoulas