当前位置: 首页 > 面试题库 >

在Linux中以百分比给出的CPU使用率的准确计算?

松旭
2023-03-14
问题内容

这个问题已经被问过很多次了,但是我找不到一个得到很好支持的答案。

很多人建议使用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(因此,它们不应包括在niceand 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 usertime
usertime = 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_nice
cpu  74608   2520   24433   1117073   6176   4054  0        0      0      0

通过算法,我们可以计算出CPU使用率百分比,如下所示:

PrevIdle = previdle + previowait
Idle = 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


 类似资料:
  • 问题内容: 关于如何使用/ proc / stat中的统计信息获取CPU利用率的文章和参考文献很多。但是,它们中的大多数仅使用7个以上的CPU统计信息中的四个(用户,nice,系统和空闲),而忽略了Linux2.6中存在的剩余jiffie CPU计数(iowait,irq,softirq)。 我的问题是:iowait / irq / softirq编号是否也计入前四个编号之一(用户/ nice /

  • 有人可以指导我,如何计算POD的百分比[CPU和内存]的使用情况,并提供以下可用信息 kubectl top pods -n 默认 kubectl描述pod TEST

  • 问题内容: 我想以编程方式[在C中]为Linux中给定进程ID计算CPU使用率%。 如何获得给定进程的实时CPU使用率%? 为了进一步说明: 我应该能够确定所提供的processid或进程的CPU使用率。 该进程不必是子进程。 我想要“ C”语言的解决方案。 问题答案: 您需要从中解析出数据。这些是前几个字段(来自内核源代码): 您可能在和/或之后。您还需要从中读取行,如下所示: 这将告诉您已在各

  • 问题内容: 我正在尝试按以下方式计算Android中进程的CPU使用率,但是由于产生的输出,我不确定它是否正确。 要将吉菲转换为秒:吉菲/赫兹 第一步: 使用文件的第一个参数获取正常运行时间。 第二步: 从中获取每秒的时钟滴答数。 第三步: 从中获取过程参数花费的总时间 第四步: 从 Linux 2.6之后的时钟滴答声中除以sysconf(_SC_CLK_TCK)表示的值,获取进程的startti

  • 我正在我的a集群(10个节点)中运行几个kubernetes pod。每个pod只包含一个托管一个工作进程的容器。我已指定容器的CPU“限制”和“请求”。以下是在节点(crypt12)上运行的一个pod的描述。 以下是我运行“kubectl可描述节点crypt12”时的输出 更新:我在github问题讨论中找到了问题的答案:“kubectl描述节点”中的cpu百分比是“cpu限制/#个内核”。由于

  • 我通过从Jmeter发送请求来强调容器,然后通过docker stats命令监视容器的cpu使用情况,该命令给出的值大于100%。 我不明白为什么即使只给容器分配一个核心,它也会给出超过100%的!。你知道原因吗?这个cpu值是否表示除了容器之外的某些系统进程的cpu使用情况? 提前感谢你的帮助。 docker信息结果:集装箱:2运行:1暂停:0停止:1图像:10服务器版本:17.06.0-CE存