CPU 记账控制器¶
CPU 记账控制器用于使用 cgroup 对任务进行分组,并记录这些任务组的 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) 移动到其中。此 bash 及其子进程消耗的 CPU 时间可以从 g1/cpuacct.usage 中获得,并且也会累积在 /sys/fs/cgroup/cpuacct.usage 中。
cpuacct.stat 文件列出了一些统计信息,这些信息进一步将 cgroup 获得的 CPU 时间划分为用户时间和系统时间。目前支持以下统计信息
用户:cgroup 的任务在用户模式下花费的时间。系统:cgroup 的任务在内核模式下花费的时间。
用户和系统以 USER_HZ 为单位。
cpuacct 控制器使用 percpu_counter 接口来收集用户时间和系统时间。这有两个副作用
从理论上讲,用户和系统时间的值可能会出现错误。这是因为在 32 位系统上,percpu_counter_read() 对于并发写入是不安全的。
由于 percpu_counter 的批处理特性,用户和系统时间的值可能会稍微过时。