Block IO 控制器 【ChatGPT】

发布时间 2023-12-09 21:41:19作者: 摩斯电码

Block IO 控制器

概述

cgroup 子系统 "blkio" 实现了块 IO 控制器。在存储层次结构中,似乎需要各种类型的 IO 控制策略(如比例带宽、最大带宽),无论是在叶节点还是在中间节点都需要。计划是使用相同的基于 cgroup 的管理接口来管理 blkio 控制器,并根据用户选项在后台切换 IO 策略。

一个 IO 控制策略是限流策略,可以用来指定设备的上限 IO 速率。这个策略是在通用块层中实现的,可以用于叶节点以及更高级别的逻辑设备,比如设备映射器。

如何操作

限流/上限策略

  1. 启用 Block IO 控制器:

    CONFIG_BLK_CGROUP=y
    
  2. 在块层启用限流:

    CONFIG_BLK_DEV_THROTTLING=y
    
  3. 挂载 blkio 控制器(参见控制组,为什么需要 cgroups?):

    mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
    
  4. 为根组的特定设备指定带宽速率。策略的格式为 "<major>:<minor> <bytes_per_second>":

    echo "8:16  1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
    

    这将限制主/次编号为 8:16 的设备在根组上进行读取时的速率为 1MB/秒。

  5. 运行 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 的所有统计信息重置为零。