Linux 中 CPU 利用率是如何算出来的?

💡 原文中文,约8900字,阅读约需22分钟。
📝

内容提要

本文深入分析了Linux统计系统CPU利用率的内部原理,通过定时器以固定节拍采样各个CPU核的使用情况,并将时间累加到不同的统计项中。top命令读取/proc/stat中的输出数据,这些数据是根据kernel_cpustat变量汇总并输出的。文章还解释了用户态、内核态和空闲时间的统计方法。总体而言,Linux的CPU利用率统计方法是基于采样的,虽然不是百分之百精确,但对于整体情况的评估是可靠的。

🔎

延伸解读

采样统计的误差与可靠性

Linux 通过定时器以固定节拍(如 1ms)采样 CPU 状态,将每个节拍的时间累加到对应统计项。这种采样方式必然存在误差,例如进程在两次采样间开始或结束,其时间可能被部分误记。但由于查看 CPU 利用率时通常统计 1 秒甚至更长时间,包含成千上万个采样点,误差会被平均化,因此对整体情况的评估是可靠的。

用户态时间的完整构成

top 输出中的 user 和 nice 共同构成用户态消耗时间。内核根据进程 nice 值是否大于 0 来区分:nice 值大于 0 的进程时间计入 nice,否则计入 user。因此,若要准确评估用户态 CPU 消耗,应将 user 和 nice 相加,而非仅看 user 列。

iowait 的本质与解读

iowait 并非 CPU 忙碌时间,而是 CPU 空闲但存在未完成 IO 请求的时间。内核在 CPU 空闲时检查运行队列的 nr_iowait 计数,若大于 0 则计入 iowait,否则计入 idle。因此,iowait 属于空闲时间范畴,若想了解 CPU 的真实空闲程度,应结合 iowait 和 idle 一起考虑。

内核态时间的细分

内核态时间分为 irq、softirq 和 system 三项。当采样时 CPU 处于硬中断上下文,时间计入 irq;处于软中断上下文,计入 softirq;否则计入 system。这种细分有助于定位内核态消耗的具体来源,例如中断处理或系统调用。

❓

Q&A

Linux中CPU利用率是如何计算的?

Linux通过定时器以固定节拍采样CPU核的使用情况,并将时间累加到不同的统计项中,最终通过/proc/stat输出给用户。

top命令输出的CPU利用率数据来源于哪里?

top命令通过访问/proc/stat获取CPU利用率数据,这些数据由内核通过kernel_cpustat数组汇总。

CPU利用率的统计方法包括哪些时间状态?

CPU利用率的统计方法包括用户态时间、内核态时间和空闲时间,其中空闲时间还包括IO等待时间。

为什么Linux的CPU利用率统计方法不是百分之百精确?

因为Linux的CPU利用率统计是基于采样的,瞬时采样可能导致数据波动,但对于整体情况的评估是可靠的。

如何通过top命令查看用户态和内核态的CPU时间?

在top命令的输出中,用户态时间包括user和nice,内核态时间包括irq、softirq和system。

iowait和idle时间有什么区别?

iowait是CPU在等待IO完成时的空闲状态,而idle是CPU完全空闲的状态。

🏷️

标签

➡️

继续阅读