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. sqli-labs环境搭建

    1 下载phpStudy 下载地址:https://www.xp.cn/download.html 由于sqli-lib最后一次提交代码的时候是2014年,所以高版本的phpStudy可能不兼容了,推 ...

  2. 超星尔雅看课刷题小tips

    用chrom浏览器,先安装扩展程序Tampermonkey BETA 然后进入> https://greasyfork.org/zh-CN 找一款适合自己的脚本安装即可刷课.

  3. 如何使用Android可视化埋点

    Android可视化埋点是Android全埋点的增强.开发者可以将App界面同步至DTM界面,并在DTM界面通过可视化点击的方式添加埋点事件.目前Android可视化埋点包含两种埋点方式:普通可视化埋 ...

  4. 2021.08.16 P1300 城市街道交通费系统(dfs)

    2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...

  5. 简单手写一个jqurey

    1 /** 2 * @description 手写jquery 3 * @author ddxldxl 4 */ 5 class Jquery { 6 constructor(selector) { ...

  6. 基于全志A40i开发板——Linux-RT内核应用开发教程(1)

    目录 1 Linux-RT内核简介 3 2 Linux系统实时性测试 3 3 rt_gpio_ctrl案例 10 4 rt_input案例 15 本文为Linux-RT内核应用开发教程的第一章节--L ...

  7. 如何配置JAVA环境并安装IEAD软件

    安装IDEA软件之前需要做哪些准备? 在安装IDEA软件之前,需要先确定电脑中有没有JDK,如果没有需要先安装JDK. JDK是整个JAVA的核心,包括了Java运行环境,Java工具(javac/j ...

  8. echarts基本使用与注意事项

    npm 安装echarts npm install echarts -D 使用流程 1. 引入echarts,并配置成全局方法 vue2 import * as echarts from 'echar ...

  9. XCTF练习题---MISC---reverseMe

    XCTF练习题---MISC---reverseMe flag:flag{4f7548f93c7bef1dc6a0542cf04e796e} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是个 ...

  10. XCTF练习题---MISC---掀桌子

    XCTF练习题---MISC---掀桌子 flag:flag{hjzcydjzbjdcjkzkcugisdchjyjsbdfr} 解题步骤: 1.观察题目,发现没有附件,只有一串代码. 2.根据代码内 ...