CGroup系列四blkio 子系统
Posted 高桐@BILL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CGroup系列四blkio 子系统相关的知识,希望对你有一定的参考价值。
写在前面
blkio,Block IO Controller,指block io控制器或块IO子系统。
IO控制策略就是用于控制特定设备的IO速率的一个节流策略。这种策略可以应用在内核通用块层(Generic Block Layer),也可以应用在页节点上和高级别逻辑设备,如设备映射器。
一、如何使能blkio节流或上限 限制策略
1.1 内核配置使能Block IO Controller
CONFIG_BLK_CGROUP=y
1.2 使能应用在内核通用块层
CONFIG_BLK_DEV_THROTTLING=y
1.3 挂载blkio控制子系统
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
1.4 指定IO速率带宽
策略格式:<major>:<minor> <bytes_per_second>
echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
如上命令,设置blkio层级根节点下任务访问major/minor号为“8:16”的设备读取速率上限为1MB/每秒。
上面命令可通过下面方法进行测试:
# 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 CGroup分层管控
blkio支持分层管控,使能分层管控的前提需要使能“sane_behavior”。这部分目前处于开发内测阶段,还未公开支持。
以下面层次为例:
管控策略的限制对root节点下的所有子树节点均有效。
三、可用配置项介绍
CONFIG_BLK_CGROUP
使能Block IO子系统;
CONFIG_BFQ_CGROUP_DEBUG
使能debug选项;
CONFIG_BLK_DEV_THROTTLING
使能通用块设备层的管控;
四、BLKIO CGroup策略文件介绍
4.1 比例/权重型策略文件
4.1.1 blkio.bfq.weight
指定设备每个控制组的权重,取值范围1~1000,权重越大优先级越高。这里实际上是一个默认值,因为如果接下来如果单个设备上(blkio.bfq.weight_device)设置了权重,则单个设备上(blkio.bfq.weight_device)的权重值会覆盖这里设置的默认权重。注意:bfq全称Budget Fair Queueing.
echo 500 > blkio.weight
4.1.2 blkio.bfq.weight_device
指定每个控制组每个设备的权重。该配置会覆盖前面设备的默认权重值。
写入配置到策略文件的格式如下:
# echo dev_maj:dev_minor weight > blkio.bfq.weight_device
例如,我们要配置权重为weight=300,到设备 /dev/sdb (8:16)上,如下:
# echo 8:16 300 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev weight
8:16 300
例如,我们要配置权重为weight=500到设备/dev/sda (8:0),如下:
# 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
4.1.3 blkio.time
报告控制组的设备磁盘访问时间,单位为毫秒。格式形如"[dev_maj[:[dev_minor] [milliseconds]"。
4.1.4 blkio.sectors
报告控制组传输的扇区数(控制组转换到具体设备或者由具体设备转换出的扇区数)。格式形如"[dev_maj[:[dev_minor] [number of sectors]"。
4.1.5 blkio.io_service_bytes
报告控制组的磁盘传输速率(控制组根据 CFQ 调度程序转换到具体设备或者由具体设备中转出的字节)。这部分会接下来根据操作类型(读写、同步或异步)进一步划分。格式形如"[dev_maj[:[dev_minor] [read/write/sync/async] [number of bytes]"。
4.1.6 blkio.io_serviced
报告当前控制组的ios(IO操作数,指bio数)数(控制组根据 CFQ 调度程序在具体设备中执行的 I/O 操作数。),这部分会接下来根据操作类型(读写、同步或异步)进一步划分。格式形如"[dev_maj[:[dev_minor] [number of IOs]"。(注意,查资料,了解到BIO以流的方式处理数据,而 NIO 以块的方式处理数据,块 I/O 的效率比流 I/O 高很多。BIO 是阻塞的,而 NIO 是非阻塞的。BIO 基于字节流和字符流进行操作,而 NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。)
4.1.7 blkio.io_service_time
报告当前控制组根据CFQ调度程序在具体设备中执行 I/O 操作时,发送请求到完成请求的时间总和(纳秒)。如果设备队列深度等于1,这个时间就是实际的服务时间。如果设备队列深度大于1,这个服务时间就不再准确,因为请求可能会是无序的。而这种情况下这个时间可能包括多个IOs请求时间而大于实际的值。格式形如"[dev_maj[:[dev_minor] [read/write/sync/async] [io_service_time]"。
4.1.8 blkio.io_wait_time
报告当前控制组IOs请求在调度程序队列中等待服务的总时间(纳秒)。这个时间也要比实际的等待时间大一些,因为报告的时间是该 cgroup 所有 I/O 操作的总和,而不是该 cgroup 本身等待 I/O 操作的时间。要查找该群组作为整体的等待时间,请使用 blkio.group_wait_time
参数。如果设备包含 queue_depth
> 1,则报告只包括向该设备发送请求之前的时间,而不包括该设备将请求重新排序时等待服务的时间。这部分会接下来根据操作类型(读写、同步或异步)进一步划分。格式形如"[dev_maj[:[dev_minor] [read/write/sync/async] [io_wait_time]"。
4.1.9 blkio.io_merged
报告合并到属于这个控制组的bios/requests请求的总数,按操作类型进一步划分,读或写,同步或异步。
4.1.10 blkio.io_queued
报告控制组排队的请求总数。按操作类型进一步划分,读或写,同步或异步。
4.1.11 blkio.avg_queue_size
用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。Debugging aid only enabled if CONFIG_BFQ_CGROUP_DEBUG=y.用于报告控制组整个过程cgroup I/O 操作的平均队列大小。每当此控制组队列获得一个时间片时,该队列大小都将被采样。
4.1.12 blkio.group_wait_time
用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。用于报告控制组中每一个队列等待的总时间(单位为纳秒:ns)。每当控制组队列获得一个时间片时,此报告就会被更新,因此如果在控制组等待时间片时读取该参数文件,该报告将不会包含当前队列等待操作的时间。
4.1.13 blkio.empty_time
用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。
Debugging aid only enabled if CONFIG_BFQ_CGROUP_DEBUG=y.
This is the amount of time a cgroup spends without any pending
requests when not being served, i.e., it does not include any time
spent idling for one of the queues of the cgroup. This is in
nanoseconds. If this is read when the cgroup is in an empty state,
the stat will only report the empty_time accumulated till the last
time it had a pending request and will not include the current delta.
4.1.14 blkio.idle_time
用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。
Debugging aid only enabled if CONFIG_BFQ_CGROUP_DEBUG=y.
This is the amount of time spent by the IO scheduler idling for a
given cgroup in anticipation of a better request than the existing ones
from other queues/cgroups. This is in nanoseconds. If this is read
when the cgroup is in an idling state, the stat will only report the
idle_time accumulated till the last idle period and will not include
the current delta.
4.1.15 blkio.dequeue
用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。
Debugging aid only enabled if CONFIG_BFQ_CGROUP_DEBUG=y. This
gives the statistics about how many a times a group was dequeued
from service tree of the device. First two fields specify the major
and minor number of the device and third field specifies the number
of times a group was dequeued from a particular device.
4.1.16 blkio.*_recursive
递归统计各种类型的数据。这些文件显示与它们的非递归对应项相同的信息,但是包括所有子cgroup的统计信息。
4.2 节流/上限 限制型策略文件
blkio.throttle.read_bps_device Specifies upper limit on READ rate from the device. IO rate is specified in bytes per second. Rules are per device. Following is the format:: echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device blkio.throttle.write_bps_device Specifies upper limit on WRITE rate to the device. IO rate is specified in bytes per second. Rules are per device. Following is the format:: echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device blkio.throttle.read_iops_device Specifies upper limit on READ rate from the device. IO rate is specified in IO per second. Rules are per device. Following is the format:: echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.read_iops_device blkio.throttle.write_iops_device Specifies upper limit on WRITE rate to the device. IO rate is specified in io per second. Rules are per device. Following is the format:: echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device Note: If both BW and IOPS rules are specified for a device, then IO is subjected to both the constraints. blkio.throttle.io_serviced Number of IOs (bio) issued to the disk by the group. These are further divided by the type of operation - read or write, sync or async. First two fields specify the major and minor number of the device, third field specifies the operation type and the fourth field specifies the number of IOs. blkio.throttle.io_service_bytes Number of bytes transferred to/from the disk by the group. These are further divided by the type of operation - read or write, sync or async. First two fields specify the major and minor number of the device, third field specifies the operation type and the fourth field specifies the number of bytes.
4.3 通用型策略文件
4.3.1 blkio.reset_stats
此策略文件用于重设其它所有包含统计数据的策略文件。写入一个整数到该策略文件,即可重置控制组所有的统计数据。
以上是关于CGroup系列四blkio 子系统的主要内容,如果未能解决你的问题,请参考以下文章