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 时间进一步划分为用户时间和系统时间。目前支持以下统计数据
user: cgroup 中任务在用户模式下花费的时间。system: cgroup 中任务在内核模式下花费的时间。
user 和 system 的单位是 USER_HZ。
cpuacct 控制器使用 percpu_counter 接口收集用户时间和系统时间。这会带来两个副作用
理论上可能会看到错误的用户时间和系统时间值。这是因为 32 位系统上的 percpu_counter_read() 不防范并发写入。
由于 percpu_counter 的批处理特性,可能会看到略微过时的用户时间和系统时间值。