Block IO 控制器
概述
cgroup 子系统 "blkio" 实现了块 IO 控制器。在存储层次结构中,似乎需要各种类型的 IO 控制策略(如比例带宽、最大带宽),无论是在叶节点还是在中间节点都需要。计划是使用相同的基于 cgroup 的管理接口来管理 blkio 控制器,并根据用户选项在后台切换 IO 策略。
一个 IO 控制策略是限流策略,可以用来指定设备的上限 IO 速率。这个策略是在通用块层中实现的,可以用于叶节点以及更高级别的逻辑设备,比如设备映射器。
如何操作
限流/上限策略
- 启用 Block IO 控制器:
CONFIG_BLK_CGROUP=y
- 在块层启用限流:
CONFIG_BLK_DEV_THROTTLING=y
- 挂载 blkio 控制器(参见控制组,为什么需要 cgroups?):
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
- 为根组的特定设备指定带宽速率。策略的格式为 "
<major>:<minor> <bytes_per_second>
":
echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
- 这将限制主/次编号为 8:16 的设备在根组上进行读取时的速率为 1MB/秒。
- 运行 dd 命令读取文件,查看速率是否被限制为 1MB/s:
# dd iflag=direct if=/mnt/common/zerofile of=/dev/null bs=4K count=1024 1024+0 records in 1024+0 records out 4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s
- 写入的限制可以使用 blkio.throttle.write_bps_device 文件进行设置。
分层控制组
限流实现了层次支持;但是,只有当从 cgroup 方面启用了 "sane_behavior" 时,限流的层次支持才会启用,而目前这是一个开发选项,不对外公开。
如果有人创建了如下所示的层次结构:
root / \ test1 test2 | test3
使用 "sane_behavior" 的限流将正确处理这种层次结构。对于限流来说,所有限制都适用于整个子树,而所有统计信息都是针对该 cgroup 中任务直接生成的 IO 本地的。
如果从 cgroup 方面未启用 "sane_behavior" 的限流,实际上会将所有同级别的组都视为如下所示:
pivot / / \ \ root test1 test2 test3
各种用户可见的配置选项
CONFIG_BLK_CGROUP
:块 IO 控制器。CONFIG_BFQ_CGROUP_DEBUG
:调试帮助。如果启用了此选项,一些额外的统计文件将显示在 cgroup 中。CONFIG_BLK_DEV_THROTTLING
:在块层中启用块设备限流支持。
cgroup 文件的详细信息
比例权重策略文件
blkio.bfq.weight
:指定每个 cgroup 的权重。这是该组在所有设备上的默认权重,除非被每个设备规则(参见下面的 blkio.bfq.weight_device)覆盖。blkio.bfq.weight_device
:指定每个 cgroup 每个设备的权重,覆盖默认组权重。blkio.time
:分配给每个设备的 cgroup 的磁盘时间(以毫秒为单位)。blkio.sectors
:由该组传输到/从磁盘的扇区数。blkio.io_service_bytes
:由该组传输到/从磁盘的字节数。blkio.io_serviced
:由该组发出到磁盘的 IO 数(bio)。blkio.io_service_time
:由该 cgroup 执行的 IO 的请求分派和请求完成之间的总时间。blkio.io_wait_time
:该 cgroup 的 IO 在调度队列中等待服务的总时间。blkio.io_merged
:合并到属于该 cgroup 的请求中的总 bios/requests 数。blkio.io_queued
:在任何给定时刻排队等待服务的请求总数。blkio.avg_queue_size
:仅在启用了CONFIG_BFQ_CGROUP_DEBUG=y
时才启用的调试辅助。该 cgroup 存在期间的平均队列大小。blkio.group_wait_time
:仅在启用了CONFIG_BFQ_CGROUP_DEBUG=y
时才启用的调试辅助。自该 cgroup 变得繁忙(即从 0 到 1 个请求排队)以来等待获取其队列之一的时间量。blkio.empty_time
:仅在启用了CONFIG_BFQ_CGROUP_DEBUG=y
时才启用的调试辅助。该 cgroup 在未被服务时花费的时间量。blkio.idle_time
:仅在启用了CONFIG_BFQ_CGROUP_DEBUG=y
时才启用的调试辅助。IO 调度程序在预期比现有队列/组中的现有请求更好的请求之前空闲给定 cgroup 的时间量。blkio.dequeue
:仅在启用了CONFIG_BFQ_CGROUP_DEBUG=y
时才启用的调试辅助。给出了一个组从设备的服务树中出列的次数的统计信息。blkio.*_recursive
:各种统计信息的递归版本。这些文件显示与它们的非递归对应文件相同的信息,但包括所有后代 cgroups 的统计信息。
限流/上限策略文件
blkio.throttle.read_bps_device
:指定从设备读取的速率上限。blkio.throttle.write_bps_device
:指定向设备写入的速率上限。blkio.throttle.read_iops_device
:指定从设备读取的 IOPS 上限。blkio.throttle.write_iops_device
:指定向设备写入的 IOPS 上限。blkio.throttle.io_serviced
:由该组发出到磁盘的 IO 数(bio)。blkio.throttle.io_service_bytes
:由该组传输到/从磁盘的字节数。
各种策略共有的文件
blkio.reset_stats
:将整个 cgroup 的所有统计信息重置为零。