问题涉及 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。
我不是内核开发人员,但是,深入内核源代码, cpuacct.usage (通过cgroup_account_cputime更新)和 cpuacct.stat (通过cgroup_account_cputime_field更新)似乎是由不同的内核组件计算的。
据我了解, cpu.stat 的输出似乎在很大程度上取决于内核配置,特别是CONFIG_VIRT_CPU_ACCOUNTING_GEN、CONFIG_VIRT_CPU_ACCOUNTING_NATIVE和CONFIG_VIRT_CPU_ACCOUNTING。从他们的描述来看,他们似乎更准确。相关文件是kernel/sched/cputime.c,其中定时更新似乎是由某些内核事件(irqs 等)引起的
cpuacct.usage 的输出似乎是由调度程序在任务之间切换时计算的。例如update_curr,它调用 cgroup_account_cputime 是从似乎调度任务的enqueue_entity和 dequeue_entity 调用的。这似乎不受配置的影响。
| 归档时间: |
|
| 查看次数: |
5046 次 |
| 最近记录: |