在Linux中以百分比给出的CPU使用率的准确计算?
这个问题已经被问过很多次了,但是我找不到一个得到很好支持的答案。
很多人建议使用top命令,但是如果您运行一次top(因为您有一个脚本,例如每1秒收集一次Cpu使用情况),它将始终给出相同的Cpu使用情况结果(示例1,示例2)。
计算CPU使用率的一种更准确的方法是,从中读取值/proc/stat
,但是大多数答案仅使用from中的前4个字段/proc/stat
进行计算(此处是一个示例)。
/proc/stat/
从Linux内核2.6.33开始,每个CPU内核有10个字段!
我还发现使用/ proc / stat这个问题在Linux中准确地计算CPU利用率,该问题指出了同样的问题-
大多数其他问题仅考虑了多个字段中的4个-但此处给出的答案仍以“ I思考”(不确定),但仅关注前7个字段(10个中的/proc/stat/
)
该
perl脚本使用所有字段来计算CPU使用率,经过进一步研究,我再次认为这是不正确的。
快速浏览一下此处的内核代码后,它看起来像,guest_nice
并且guest
fields总是与nice
和一起增加user
(因此,它们不应包括在nice
and user
字段中,因此不应该包括在cpu使用率计算中)
/* * 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使用率的准确方法?计算中应考虑哪些字段以及如何处理(哪些字段属于空闲时间,哪些字段属于非空闲时间)?
回答:
根据撰写本文时的htop源代码,我的假设看起来是正确的:
(请参阅ProcessList.c中的void
ProcessList_scan(ProcessList*
this)函数)
// Guest time is already accounted in usertimeusertime = usertime - guest; # As you see here, it subtracts guest from user time
nicetime = nicetime - guestnice; # and guest_nice from nice time
// Fields existing on kernels >= 2.6
// (and RHEL's patched kernel 2.4...)
idlealltime = idletime + ioWait; # ioWait is added in the idleTime
systemalltime = systemtime + irq + softIrq;
virtalltime = guest + guestnice;
totaltime = usertime + nicetime + systemalltime + idlealltime + steal + virtalltime;
因此,从/proc/stat
:第一行中列出的字段中(请参阅文档中的
1.8节)
user nice system idle iowait irq softirq steal guest guest_nicecpu 74608 2520 24433 1117073 6176 4054 0 0 0 0
通过算法,我们可以计算出CPU使用率百分比,如下所示:
PrevIdle = previdle + previowaitIdle = idle + iowait
PrevNonIdle = prevuser + prevnice + prevsystem + previrq + prevsoftirq + prevsteal
NonIdle = user + nice + system + irq + softirq + steal
PrevTotal = PrevIdle + PrevNonIdle
Total = Idle + NonIdle
# differentiate: actual value minus the previous one
totald = Total - PrevTotal
idled = Idle - PrevIdle
CPU_Percentage = (totald - idled)/totald
以上是 在Linux中以百分比给出的CPU使用率的准确计算? 的全部内容, 来源链接: utcz.com/qa/403682.html