原文:https://www.kernel.org/doc/html/v6.6/admin-guide/cgroup-v1/cpuacct.html
CPU核算控制器
CPU核算控制器用于使用cgroups对任务进行分组,并核算这些任务组的CPU使用情况。
CPU核算控制器支持多层级分组。一个核算组累积其所有子组和直接存在于其组中的任务的CPU使用情况。
可以通过首先挂载cgroup文件系统来创建核算组:
# mount -t cgroup -ocpuacct none /sys/fs/cgroup
通过上述步骤,初始或父核算组将出现在/sys/fs/cgroup中。在启动时,此组包括系统中的所有任务。/sys/fs/cgroup/tasks列出了此cgroup中的任务。/sys/fs/cgroup/cpuacct.usage给出了此组获得的CPU时间(以纳秒为单位),这实质上是系统中所有任务获得的CPU时间。
可以在父组/sys/fs/cgroup下创建新的核算组:
# cd /sys/fs/cgroup
# mkdir g1
# echo $$ > g1/tasks
上述步骤创建了一个新组g1,并将当前shell进程(bash)移入其中。可以从g1/cpuacct.usage获取由此bash及其子进程消耗的CPU时间,并且这些时间也会累积在/sys/fs/cgroup/cpuacct.usage中。
cpuacct.stat文件列出了一些统计数据,进一步将cgroup获得的CPU时间分为用户和系统时间。目前支持以下统计数据:
- user:cgroup中任务在用户模式下花费的时间。
- system:cgroup中任务在内核模式下花费的时间。
用户和系统以USER_HZ单位表示。
cpuacct控制器使用percpu_counter接口来收集用户和系统时间。这有两个副作用:
- 理论上可能会看到用户和系统时间的错误值。这是因为在32位系统上,percpu_counter_read()不安全,可能会受到并发写入的影响。
- 由于percpu_counter的批处理特性,可能会看到略微过时的用户和系统时间值。