如何正确获取容器的CPU利用率?( 四 )


四、总结本文深入分析了 Linux 统计系统 CPU 利用率的内部原理 。全文的内容可以用如下一张图来汇总:

如何正确获取容器的CPU利用率?

文章插图
Linux 中的定时器会以某个固定节拍,比如 1 ms 一次采样各个 cpu 核的使用情况,然后将当前节拍的所有时间都累加到 user/nice/system/irq/softirq/io_wait/idle 中的某一项上 。
top 命令是读取的 /proc/stat 中输出的 cpu 各项利用率数据,而这个数据在内核中的是根据 kernel_cpustat 来汇总并输出的 。
回到开篇问题 1,top 输出的利用率信息是如何计算出来的,它精确吗?
/proc/stat 文件输出的是某个时间点的各个指标所占用的节拍数 。如果想像 top 那样输出一个百分比,计算过程是分两个时间点 t1, t2 分别获取一下 stat 文件中的相关输出,然后经过个简单的算术运算便可以算出当前的 cpu 利用率 。
我也提供了一个简单的 shell 代码,你可以把它下载下来,用它来实际查看一下你服务器的 cpu 利用率,我放到我的 Github 上了 。
Github 地址:https://github.com/yanfeizhang/coder-kung-fu/blob/main/tests/cpu/test06/cpu_stat.sh
再说是否精确 。这个统计方法是采样的,只要是采样,肯定就不是百分之百精确 。但由于我们查看 cpu 使用率的时候往往都是计算 1 秒甚至更长一段时间的使用情况,这其中会包含很多采样点,所以查看整体情况是问题不大的 。
另外从本文,我们也学到了 top 中输出的 cpu 时间项目其实大致可以分为三类:
第一类:用户态消耗时间,包括 user 和 nice 。如果想看用户态的消耗,要将 user 和 nice 加起来看才对 。第二类:内核态消耗时间,包括 irq、softirq 和 system 。第三类:空闲时间,包括 io_wait 和 idle 。其中 io_wait 也是 cpu 的空闲状态,只不过是在等 io 完成而已 。如果只是想看 cpu 到底有多闲,应该把 io_wait 和 idle 加起来才对 。

【如何正确获取容器的CPU利用率?】


推荐阅读