Block IO 控制器 【ChatGPT】

简介: Block IO 控制器 【ChatGPT】

Block IO 控制器

概述

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

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

如何操作

限流/上限策略

  1. 启用 Block IO 控制器:
CONFIG_BLK_CGROUP=y
  1. 在块层启用限流:
CONFIG_BLK_DEV_THROTTLING=y
  1. 挂载 blkio 控制器(参见控制组,为什么需要 cgroups?):
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
  1. 为根组的特定设备指定带宽速率。策略的格式为 "<major>:<minor> <bytes_per_second>":
echo "8:16  1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
  1. 这将限制主/次编号为 8:16 的设备在根组上进行读取时的速率为 1MB/秒。
  2. 运行 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
  1. 写入的限制可以使用 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 的所有统计信息重置为零。
相关文章
|
SQL 分布式计算 DataWorks
同步Hive表数据报block文件不存在问题 java.io.FileNotFoundException: File does not exist
同步Hive表数据报block文件不存在问题 java.io.FileNotFoundException: File does not exist
|
3月前
|
安全 API
在FS/IO上下文使用的GFP掩码 【ChatGPT】
在FS/IO上下文使用的GFP掩码 【ChatGPT】
40 10
|
3月前
|
运维
延迟IO 【ChatGPT】
延迟IO 【ChatGPT】
|
3月前
|
前端开发 RDMA
RDMA 控制器 【ChatGPT】
RDMA 控制器 【ChatGPT】
|
3月前
|
Shell
进程数量控制器 【ChatGPT】
进程数量控制器 【ChatGPT】
|
3月前
|
Shell
HugeTLB 控制器 【ChatGPT】
HugeTLB 控制器 【ChatGPT】
|
3月前
设备白名单控制器 【ChatGPT】
设备白名单控制器 【ChatGPT】
|
存储 缓存 固态存储
【Linux】基础IO --- 内核级和用户级缓冲区、磁盘结构、磁盘的分治管理、block group块组剖析…
【Linux】基础IO --- 内核级和用户级缓冲区、磁盘结构、磁盘的分治管理、block group块组剖析…
|
数据库
操作系统第五章_01 IO设备的基本概念和分类 IO控制器 IO控制方式
操作系统第五章_01 IO设备的基本概念和分类 IO控制器 IO控制方式
464 0
操作系统第五章_01 IO设备的基本概念和分类 IO控制器 IO控制方式
|
存储 虚拟化 内存技术