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)上的特定设备规定带宽速率,策略格式是“: <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来控制。

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

Linux Cgroup v1(中文翻译)(4):Block IO Controller的更多相关文章

  1. Linux Cgroup v1(中文翻译)(2):CPUSETS

    英文原文:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cpusets.html Copyright (C) 2004 BU ...

  2. Linux Cgroup v1(中文翻译)(1):Control Group

    英文原文:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cgroups.html 1 控制组 1.1 什么是控制组? 控制组 ...

  3. Linux Cgroup v1(中文翻译)(3):CPU Accounting Controller

    英文原文: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cpuacct.html CPU Accounting Contr ...

  4. 【转载】Linux cgroup资源隔离各个击破之 - io隔离

    Linux Cgroup blkio子系统的用法.   blkio子系统支持的两种IO隔离策略 .1. (Completely Fair Queuing 完全公平队列)cfq io调度策略,支持按权重 ...

  5. Linux Container测试之block IO

      简介 Linux Container是OS级别的虚拟化方案,它相比于一般的虚拟机没有了硬件模拟以及指令模拟,相比传统虚拟机具有更低的开销,因此可以应用到私有云之中.LXC目前的版本支持对memor ...

  6. Dapr 官方文档中文翻译 v1.5 版本正式发布

    作者:敖小剑 - Dapr Approver 经过 Dapr 中国社区十余位贡献者一个多月的努力,Dapr 官方文档中文翻译 v1.5 版本完成翻译和审校,正式发布并上线 Dapr 官网. 访问方式 ...

  7. linux运维常见英文报错中文翻译(菜鸟必知)

    linux常见英文报错中文翻译(菜鸟必知) 1.command not found  命令没有找到 2.No such file or directory  没有这个文件或目录 3.Permissio ...

  8. Linux常见英文报错中文翻译(菜鸟必知)

    Linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permission ...

  9. Linux常见英文报错中文翻译

    Linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permission ...

随机推荐

  1. EMS查看及修改邮箱发送和接受邮件大小的方法

    默认情况下,新建用户邮箱没有进行单独设置,故用户邮箱默认值为"Unlimited"(未限制),即遵从全局设置(继承邮箱数据库策略).通过EMS查看用户邮箱发送和接受邮件大小的默认值 ...

  2. re模块补充与其他模块介绍

    注:昨日写了re单个模块几个重要的点需要补充 一.re模块补充 1.findall独有的优先级别展示 res = re.findall('abc', 'abcabcabcabc') print(res ...

  3. ICMP TYPE CODE 对应表

    下载ping程序源代码等信息,可以在这里下载 [root@ht8 network-scripts]# ping -V ping utility, iputils-s20160308 //ping实用程 ...

  4. java_抽象类和接口

    1.抽象类: 1.抽象类之所以被称为抽象类,就是因为它包含有抽象方法,只要含有抽象方法的类就叫抽象类. 2.抽象类中可以没有抽象方法,也可以抽象方法和非抽象方法共存. 3.抽象类和类一样是单继承的. ...

  5. Java学习day9

    抽象类的关键字:abstract 类中有抽象方法时,需要在类名前也加上abstract关键字,即 public abstract class 类名{ } 同时,抽象类不能直接实例化,需要通过子类继承, ...

  6. JavaScript学习总结8-DOM

    今天学习了DOM的增删改查 innerText可以用来修改文本的内容,但是无法识别标签,要修改标签样式使用innerHTML 删除节点的步骤:先获取父节点,在通过父节点删除子节点 注意:删除节点是一个 ...

  7. vue 修改单页标题 --- document.title

    方法1. 在需要的组件或者页面内设置 document.title = response.data.res.title 方法2. <head> <meta http-equiv=&q ...

  8. kali 安装 docker

    添加密钥 信任 浙大更新源 curl -fsSL http://mirrors.zju.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - t ...

  9. [STL] queue 队列 priority_queue 优先队列

  10. Maven install没有将jar包加载到本地仓库

    错误描述 使用mvn install:install-file -Dfile=ojdbc8-19.3.0.0.jar -DgroupId=com.oracle -DartifactId=ojdbc8 ...