第 3 章 子系统和可调参数
子系统是识别 cgroup 的内核模块。通常它们是为不同 cgroup 分配各种系统登记的资源控制器。但是可为其它与内核的互动编辑子系统,这些互动需要以不同方式对待不同的进程组群。开发新子系统的应用程序编程界面(API)文档位于内核文件的
cgroups.txt
中,该文件安装在您系统的 /usr/share/doc/kernel-doc-kernel-version/Documentation/cgroups/
(由 kernel-doc 软件包提供)。cgroup 文档的最新版本还可在 http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt 中找到。请注意:最新文档中的功能可能不与您系统中安装的内核匹配。
用于 cgroup 的包含子系统参数的状态对象在 cgroup 的虚拟文件系统中是以伪文件出现。这些伪文件可由 shell 命令或者与其对等的系统调用操作。例如:
cpuset.cpus
是用来指定可允许 cgroup 访问哪些 CPU。如果 /cgroup/cpuset/webserver
是用于系统中运行的网页服务器的 cgroup,则我们会运行以下命令:
~]# echo 0,2 > /cgroup/cpuset/webserver/cpuset.cpus
将值
0,2
写入 cpuset.cpus
伪文件,并因此将 PID 为列在 /cgroup/cpuset/webserver/tasks/
中的任务限制为只使用系统中的 CPU 0 和 CPU 2。
3.1. blkio
块 I/O(
blkio
)子系统控制并监控 cgroup 中的任务对块设备的 I/O 访问。在部分这样的伪文件中写入值可限制访问或者带宽,且从这些伪文件中读取值可提供 I/O 操作信息。
- blkio.weight
- 指定 cgroup 默认可用访问块 I/O 的相对比例(加权),范围在
100
到1000
。这个值可由具体设备的blkio.weight_device
参数覆盖。例如:如果将 cgroup 访问块设备的默认加权设定为500
,请运行:echo 500 > blkio.weight
- blkio.weight_device
- 指定对 cgroup 中可用的具体设备 I/O 访问的相对比例(加权),范围是
100
到1000
。这个值可由为设备指定的blkio.weight
参数覆盖。这个值的格式为major:minor weight,其中 major 和 minor 是在《Linux 分配的设备》中指定的设备类型和节点数,我们也称之为 Linux 设备列表,您可以参考 http://www.kernel.org/doc/Documentation/devices.txt。例如:如果为访问/dev/sda
的 cgroup 分配加权500
,请运行:echo 8:0 500 > blkio.weight_device
在《Linux 分配的设备》注释中,8:0
代表/dev/sda
。 - blkio.time
- 报告 cgroup 对具体设备的 I/O 访问时间。条目有三个字段:major、minor 和 time。Major 和 minor 是在 Linux 分配的设备中指定的设备类型和节点数,time 是时间长度,单位为毫秒(ms)。
- blkio.sectors
- 报告使用 cgroup 转换到具体设备或者由具体设备转换出的扇区数。条目有三个字段:major、minor 和 sectors。major、minor 是在 Linux 分配的设备中指定的设备类型和节点数,sectors 是磁盘扇区数。
- blkio.io_service_bytes
- 报告使用 cgroup 转换到具体设备或者由具体设备中转换出的字节数。条目有四个字段:major、minor、operation 和 bytes。Major 和 minor 是在 Linux 分配的设备中指定的设备类型和节点数,operation 代表操作类型(
read
、write
、sync
或者async
),bytes 是转换的字节数。 - blkio.io_serviced
- 报告使用 cgroup 在具体设备中执行的 I/O 操作数。条目有四个字段:major、minor、operation 和 number。Major 和 minor 是在 Linux 分配的设备中指定的设备类型和节点数,operation 代表操作类型(
read
、write
、sync
或者async
),number 代表操作数。 - blkio.io_service_time
- 报告使用 cgroup 在具体设备中的 I/O 操作请求发送和请求完成之间的时间。条目有四个字段:major、minor、operation 和 time。Major 和 minor 是在 Linux 分配的设备中指定的设备类型和节点数,operation 代表操作类型(
read
、write
、sync
或者async
),time 是时间长度,单位为纳秒(ns)。使用纳秒为单位报告而不是较大的单位是要使报告即使对固态设备也是有意义的。 - blkio.io_wait_time
- 报告在具体设备中 cgroup 为调度程序队列中等待的 I/O 操作时间总计。当您解读这个报告时,请注意:
- 报告的时间可以比消耗的时间更长,因为报告的时间是该 cgroup 所有 I/O 操作的总和,而不是该 cgroup 本身等待 I/O 操作的时间。要查找该组群作为整体而消耗的等待时间,请使用
blkio.group_wait_time
。 - 如果该设备有
queue_depth
> 1,则报告的时间只包括向该设备发送请求之前的时间,而不包括在该设备重新提出请求时等待服务的任何时间。
条目有四个字段:major、minor、operation 和 bytes。Major 和 minor 是在《Linux 分配的设备》中指定的设备类型和节点数,operation 代表操作类型(read
、write
、sync
或者async
),time 是时间长度,单位为纳秒(ns)。使用纳秒报告而不是更大的单位可让这个报告对固态设备也有意义。 - blkio.io_merged
- 报告使用 cgroup 将 BIOS 请求合并到 I/O 操作请求的次数。条目有两个字段:number 和 operation。Number 是请求次数,operation 代表操作类型(
read
、write
、sync
或者async
)。 - blkio.io_queued
- 报告 cgroup 为 I/O 操作排队的请求次数。条目有两个字段:number 和 operation。Number 是请求次数,operation 代表操作类型(
read
、write
、sync
或者async
)。 - blkio.avg_queue_size
- 报告在该组群存在的整个过程中,cgroup 的 I/O 操作的平均队列大小。每次这个 cgroup 获得一个时间单位时都对该队列大小进行采样。请注意这个报告只有在将系统设定为
CONFIG_DEBUG_BLK_CGROUP=y
时可用。 - blkio.group_wait_time
- 报告 cgroup 等待每个队列的时间总计(单位为纳秒 -- ns)。每次这个 cgroup 的队列获得一个时间单位时就会更新这个报告,因此如果您在 cgroup 等待时间单位时读取这个伪文件,则该报告将不会包含等待当前队列中的操作的时间。请注意这个报告只有在将系统设定为
CONFIG_DEBUG_BLK_CGROUP=y
时可用。 - blkio.empty_time
- 报告 cgroup 在没有任何等待处理请求时花费的时间总计(单位为纳秒 -- ns)。每次这个 cgroup 有等待处理请求时都会更新这个报告,因此如果您在 cgroup 没有任何等待处理请求是读取这个伪文件,则该报告中不会包含消耗在当前空状态中的时间。请注意这个报告只有在将该系统设定为
CONFIG_DEBUG_BLK_CGROUP=y
时可用。 - blkio.idle_time
- 报告调度程序在 cgroup 等待比已经在其它队列或者来自其它组群请求更好的请求时显示闲置的时间总计(单位为纳秒 -- ns)。每次该组群不显示闲置时就会更新这个报告,因此如果您在 cgroup 闲置时读取这个伪文件,则该报告将不会包括消耗在当前闲置状态的时间。请注意,只有在将系统设定为
CONFIG_DEBUG_BLK_CGROUP=y
时这个报告才可用。 - blkio.dequeue
- 报告 cgroup 的 I/O 操作请求被具体设备从队列中移除的次数。条目有三个字段:major、minor 和 number。major 和 minor 是在 Linux 分配的设备中指定的设备类型和节点数,number 是将该组群从队列中移除的次数。请注意这个报告只有在将系统设定为
CONFIG_DEBUG_BLK_CGROUP=y
时可用。 - blkio.reset_stats
- 重新设定在其它伪文件中记录的统计数据。在这个文件中写入一个整数为这个 cgroup 重新设定统计数据。