• Linux Cgroup v1(中文翻译)(4):Block IO Controller


    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

  • 相关阅读:
    TiDB 集群最小部署的拓扑架构
    98%的人都不会使用这6种地图可视化方法,学会直接涨薪5K
    Android-Handler源码解析-Message
    基于JSP的房屋租赁系统
    mysql主从复制docker版
    Windows计划任务权限维持
    什么是CRM系统?CRM的价值体现在哪里?
    一篇文章教你Pytest快速入门和基础讲解,一定要看
    洛谷 P5656
    Swift爬虫程序
  • 原文地址:https://www.cnblogs.com/aosp/p/16359379.html