Block IO Controller
1 概览
cgroup子系统blkio实现了block io控制器。无论是对存储结构上的叶子节点和还是中间节点,它对各种IO控制策略(proportional BW, max BW)都是必须的。设计规划就是使用同样的cgroup,基于blkio控制器的管理接口和后台的用户选项来切换IO策略。
IO控制策略就是节流阀门策略,能用来规定设备上的较上层IO速度限制。这个策略在通用块层实现,能被用在叶子节点和较高层的逻辑设备(像设备映射器device mapper)上。
2 如何控制限制策略
使能Block IO控制器:
CONFIG_BLK_CGROUP=y
在块层使能节流阀门控制:
CONFIG_BLK_DEV_THROTTLING=y
挂载blkio控制器(参考Control Groups,为什么需要cgroups):
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
为根分组(root group)上的特定设备规定带宽速率,策略格式是“
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来控制。
3 分层的cgroups
节流阀门实现了分层支持。然而分层结构的支持是由cgroup的sane_behavior来使能的,而它是一个开发选项而不是公共可用选项。
如果创建这样一个分层结构:
root
/ \
test1 test2
|
test3
有"sane_behavior"的节流阀门能正确地处理结构。应用到整个子树(统计本地IO的)的所有的阀门限制直接由该cgroup中的任务生成。
没有“sane_behavior”使能的节流阀门几乎把所有分组当作同级对待,它看起来是这样的:
pivot
/ / \ \
root test1 test2 test3
4 用户可见的配置项
CONFIG_BLK_CGROUP
Block IO controller.
CONFIG_BFQ_CGROUP_DEBUG
调试帮助。使能该选型,有一些额外的统计文件出现在cgroup。
CONFIG_BLK_DEV_THROTTLING
在块层使能块设备节流阀门。
5 cgroup文件详情
5.1 比重策略文件
blkio.bfq.weight
规定每个cgroup权重。所有设备上的分组权重都是默认值,除非被blkio.bfq.weight_device更改。
当前允许的权重范围1~1000。更多详情请参看BFQ(Budget Fair Queueing)。
blkio.bfq.weight_device
规定每个设备上每个cgroup的权重,会覆盖默认的分组权重。格式如下:
# echo dev_maj:dev_minor weight > blkio.bfq.weight_device
在该cgroup内的设备/dev/sdb(8:16)上配置权重300:
# echo 8:16 300 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev weight
8:16 300
在该cgroup内的设备/dev/sda(8:0)上配置权重500:
# echo 8:0 500 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev weight
8:0 500
8:16 300
移除为/dev/sda规定的权重:
# echo 8:0 0 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev weight
8:16 300
blkio.time
每个设备上分配给cgroup的磁盘时间(毫秒)。头两个域定义了主次设备号,第三个域定义了分配给分组的磁盘时间(毫秒)。
blkio.sectors
被分组迁入或者移出磁盘的sector数量。头两个域定义了主次设备号,第三个域定义了迁入或者移出磁盘的sector数量。
blkio.io_service_bytes
被分组迁入或者移出磁盘的字节数量。它按操作类型(读或写,同步或异步)细分。头两个域定义了主次设备号,第三个域定义了操作类型,第四个域定义了字节数量。
blkio.io_serviced
被分组发给磁盘的IO(bio)数量。它按操作类型(读或写,同步或异步)细分。头两个域定义了主次设备号,第三个域定义了操作类型,第四个域定义了IO数量。
blkio.io_service_time
在cgroup内请求发送和请求完成的IO时间总量,以纳秒为时间单位。对队列深度(queue depth)为1的设备,这个时间表示实际服务时间。如果queue_depth>1, 这个请求可能会出现服务故障。这可能使得给定IO的服务时间包含了多个IO的服务时间,导致总的io_service_time大于实际已用时间。这个时间按操作类型(读或写,同步或异步)细分。头两个域定义了主次设备号,第三个域定义了操作类型,第四个域定义了io_service_time纳秒。
blkio.io_wait_time
cgroup里耗费在调度器队列内等待服务的IO时间总量(纳秒)。这个时间可能大于总的已用时间,因为它累加了所有IO的io_wait_time。它不是cgroup等待时间总量的估量,而是单个wait_time的估量。对queue_depth>1的设备,这个度量不包括IO被派发给设备但它实际上还没被服务到的等待服务的时间(可能由于设备对请求的重新排序而有时滞)。这个时间按操作类型(读或写,同步或异步)细分。头两个域定义了主次设备号,第三个域定义了操作类型,第四个域定义了io_wait_time纳秒。
blkio.io_merged
cgroup内的bio请求总量。它按操作类型(读或写,同步或异步)细分。
blkio.io_queued
cgroup内任意给定时刻的排队请求总量。它按操作类型(读或写,同步或异步)细分。
blkio.avg_queue_size
调试目的,由CONFIG_BFQ_CGROUP_DEBUG=y来使能。整个cgroup生存期内的平均队列大小。这个cgroup内其中一个队列每次获取到时间片(timeslice),队列大小采样就进行一次。
blkio.group_wait_time
调试目的,由CONFIG_BFQ_CGROUP_DEBUG=y来使能。cgroup从它变忙(请求队列从0变为1)到其中一个队列获取到时间片而必须等待的时间数量。它不同于io_wait_time,这个是纳秒单位的。cgroup在等待(waiting)状态时读取,这个统计仅报告累计到它最后一次获取到时间片的group_wait_time,不包括当前delta增量。
blkio.empty_time
调试目的,由CONFIG_BFQ_CGROUP_DEBUG=y来使能。cgroup没有被服务也没有等待请求的时间数量(纳秒)。它不包含cgroup内任何一个队的空闲何时间。cgroup在空(empty)状态时读取。这个统计将只报告累计到它最后一次有等待请求的empty_time,不包括当前delta增量。
blkio.idle_time
调试目的,由CONFIG_BFQ_CGROUP_DEBUG=y来使能。IO调度器花在期待更好的请求而不是现存的请求上的空闲时间数量(纳秒)。cgroup在空闲(idling)状态时读取,这个统计将只报告累加到最后一个空闲周期的idle_time,,不包括当前delta增量。
blkio.dequeue
调试目的,由CONFIG_BFQ_CGROUP_DEBUG=y来使能。这个统计cgroup从设备服务树出队(dequeue)多少次。头两个域定义了主次设备号,第三个域定义了从特定设备出队的次数,第四个域定义了io_wait_time纳秒。
blkio.*_recursive
各种统计的递归版本。这个文件跟他们的非递归版本对应部分显示的信息相同,但是多包含了所有派生cgroup的统计数据。
5.2 限制策略文件
blkio.throttle.read_bps_device
规定了设备读取速率的上层限制(字节/秒)。这个规则是针对设备的,格式如下:
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device
blkio.throttle.write_bps_device
规定了设备写入速率的上层限制(字节/秒)。这个规则是针对设备的,格式如下:
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device
blkio.throttle.read_iops_device
规定了设备读取速率的上层限制(IO/秒)。这个规则是针对设备的,格式如下:
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.read_iops_device
blkio.throttle.write_iops_device
规定了设备写入速率的上层限制(IO/秒)。这个规则是针对设备的,格式如下:
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device
注意:如果设备上BW和IOPS规则都被定义了,那么IO受两种规则的限制。
blkio.throttle.io_serviced
派发给分组内磁盘的IO(bio)数量。它又按操作类型(读或写,同步或异步)细分。头两个域定义了主次设备号,第三个域定义了操作类型,第四个域定义了IO数量。
blkio.throttle.io_service_bytes
被分组迁入或者移出磁盘的字节数量。它又按操作类型(读或写,同步或异步)细分。头两个域定义了主次设备号,第三个域定义了操作类型,第四个域定义了字节数量。
5.3 多种策略间的公共文件
blkio.reset_stats
写入整型数会重置cgroup所有统计数据。
英文原文:
https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/blkio-controller.html