CPU记帐控制器(CPU Accounting Controller)
-------------------------
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)移入其中。 可以从 g1/cpuacct.usage 获取此bash及其子进程消耗的CPU时间,该时间也累积在 /sys/fs/cgroup/cpuacct.usage 中。
cpuacct.stat 文件列出了一些统计信息,这些统计信息进一步将cgroup获得的CPU时间划分为用户时间和系统时间。当前支持以下统计信息:
user:cgroup的任务在用户模式下花费的时间。
system: 内核模式下cgroup任务花费的时间。
user和system以 USER_HZ 为单位。
USER_HZ注释:在2.6之前的内核中,更改HZ的值会导致用户空间异常。 发生这种情况是因为将值以每秒滴答的单位导出到用户空间。随着这些接口的永久使用,应用程序逐渐依赖于HZ的特定值。 因此,更改HZ会按一定的常数缩放各种导出的值,而无需了解用户空间。 正常情况下,正常运行时间为20小时(实际上是两个小时)。
为避免此类问题,内核需要缩放所有导出的jiffies值。 它通过定义USER_HZ来实现,这是用户空间期望的HZ值。 在x86上,因为历史上HZ为100,所以USER_HZ为100。
cpuacct控制器使用 percpu_counter 接口收集用户和系统时间。 这有两个副作用:
- 从理论上讲,用户和系统时间可能会看到错误的值。 这是因为32位系统上的 percpu_counter_read() 不能防止并发写入。
- 由于 percpu_counter 的批处理性质,可能会看到用户和系统时间有些过时的值。