为什么 cpuacct.stat 中的用户和系统 cpu 相加不等于 cpuacct.usage?

Bry*_*yan 7 cpu-usage cgroup

问题涉及 Linux cgroups cpu 核算。

我在容器级别注意到了这一点,但它仍然持续到顶层。例如:

# cat /sys/fs/cgroup/cpu/cpuacct.stat /sys/fs/cgroup/cpu/cpuacct.usage
user 34618
system 18038
743932863030
Run Code Online (Sandbox Code Playgroud)

前者的单位是百分之一秒,后者的单位是纳秒,即 346.18、180.38 和 743.932863030

我的问题是:为什么前两者加起来不等于后者?

您可能会想“啊,他们从不同的起源开始”,所以几分钟后以下是相同的指标:

# cat /sys/fs/cgroup/cpu/cpuacct.stat /sys/fs/cgroup/cpu/cpuacct.usage
user 40028
system 22098
818501029494
Run Code Online (Sandbox Code Playgroud)

增量为 54.1、40.6 和 74.57。

use*_*623 4

我不是内核开发人员,但是,深入内核源代码, cpuacct.usage (通过cgroup_account_cputime更新)和 cpuacct.stat (通过cgroup_account_cputime_field更新)似乎是由不同的内核组件计算的。

据我了解, cpu.stat 的输出似乎在很大程度上取决于内核配置,特别是CONFIG_VIRT_CPU_ACCOUNTING_GENCONFIG_VIRT_CPU_ACCOUNTING_NATIVECONFIG_VIRT_CPU_ACCOUNTING。从他们的描述来看,他们似乎更准确。相关文件是kernel/sched/cputime.c,其中定时更新似乎是由某些内核事件(irqs 等)引起的

cpuacct.usage 的输出似乎是由调度程序在任务之间切换时计算的。例如update_curr,它调用 cgroup_account_cputime 是从似乎调度任务的enqueue_entity和 dequeue_entity 调用的。这似乎不受配置的影响。