IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 【CGroup系列】四、BLKIO子系统 -> 正文阅读

[系统运维]【CGroup系列】四、BLKIO子系统

写在前面

????????blkio,Block IO Controller,指block io控制器或块IO子系统。

????????IO控制策略就是用于控制特定设备的IO速率的一个节流策略。这种策略可以应用在内核通用块层(Generic Block Layer),也可以应用在页节点上和高级别逻辑设备,如设备映射器。

一、如何使能blkio节流或上限 限制策略

1.1 内核配置使能Block IO Controller

CONFIG_BLK_CGROUP=y

1.2 使能应用在内核通用块层

CONFIG_BLK_DEV_THROTTLING=y

1.3 挂载blkio控制子系统

mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

1.4 指定IO速率带宽

????????策略格式:<major>:<minor> <bytes_per_second>

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

????????如上命令,设置blkio层级根节点下任务访问major/minor号为“8:16”的设备读取速率上限为1MB/每秒。

????????上面命令可通过下面方法进行测试:

# 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 CGroup分层管控

????????blkio支持分层管控,使能分层管控的前提需要使能“sane_behavior”。这部分目前处于开发内测阶段,还未公开支持。

? ? ? ? 以下面层次为例:

????????管控策略的限制对root节点下的所有子树节点均有效。

三、可用配置项介绍

CONFIG_BLK_CGROUP

使能Block IO子系统;

CONFIG_BFQ_CGROUP_DEBUG

使能debug选项;

CONFIG_BLK_DEV_THROTTLING

使能通用块设备层的管控;

四、BLKIO CGroup策略文件介绍

4.1 比例/权重型策略文件

4.1.1 blkio.bfq.weight?

? ? ? ? 指定设备每个控制组的权重,取值范围1~1000,权重越大优先级越高。这里实际上是一个默认值,因为如果接下来如果单个设备上(blkio.bfq.weight_device)设置了权重,则单个设备上(blkio.bfq.weight_device)的权重值会覆盖这里设置的默认权重。注意:bfq全称Budget Fair Queueing.

echo 500 > blkio.weight

4.1.2 blkio.bfq.weight_device

? ? ? ? 指定每个控制组每个设备的权重。该配置会覆盖前面设备的默认权重值。

写入配置到策略文件的格式如下:

?? ? ? ?# echo dev_maj:dev_minor weight > blkio.bfq.weight_device

例如,我们要配置权重为weight=300,到设备 /dev/sdb (8:16)上,如下:

?? ? ? ?# echo 8:16 300 > blkio.bfq.weight_device
?? ? ? ?# cat blkio.bfq.weight_device
?? ? ? ?dev ? ? weight
?? ? ? ?8:16 ? ?300

例如,我们要配置权重为weight=500到设备/dev/sda (8:0),如下:

?? ? ? ?# 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

4.1.3 blkio.time

报告控制组的设备磁盘访问时间,单位为毫秒。格式形如"[dev_maj[:[dev_minor] [milliseconds]"。

4.1.4 blkio.sectors

报告控制组传输的扇区数(控制组转换到具体设备或者由具体设备转换出的扇区数)。格式形如"[dev_maj[:[dev_minor] [number of sectors]"。

4.1.5 blkio.io_service_bytes

报告控制组的磁盘传输速率(控制组根据 CFQ 调度程序转换到具体设备或者由具体设备中转出的字节)。这部分会接下来根据操作类型(读写、同步或异步)进一步划分。格式形如"[dev_maj[:[dev_minor] [read/write/sync/async] [number of bytes]"。

4.1.6 blkio.io_serviced

报告当前控制组的IOs(IO操作数,指bio数)数(控制组根据 CFQ 调度程序在具体设备中执行的 I/O 操作数。),这部分会接下来根据操作类型(读写、同步或异步)进一步划分。格式形如"[dev_maj[:[dev_minor] [number of IOs]"。(注意,查资料,了解到BIO以流的方式处理数据,而 NIO 以块的方式处理数据,块 I/O 的效率比流 I/O 高很多。BIO 是阻塞的,而 NIO 是非阻塞的。BIO 基于字节流和字符流进行操作,而 NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

4.1.7 blkio.io_service_time

报告当前控制组根据CFQ调度程序在具体设备中执行 I/O 操作时,发送请求到完成请求的时间总和(纳秒)。如果设备队列深度等于1,这个时间就是实际的服务时间。如果设备队列深度大于1,这个服务时间就不再准确,因为请求可能会是无序的。而这种情况下这个时间可能包括多个IOs请求时间而大于实际的值。格式形如"[dev_maj[:[dev_minor] [read/write/sync/async] [io_service_time]"。

4.1.8 blkio.io_wait_time

报告当前控制组IOs请求在调度程序队列中等待服务的总时间(纳秒)。这个时间也要比实际的等待时间大一些,因为报告的时间是该 cgroup 所有 I/O 操作的总和,而不是该 cgroup 本身等待 I/O 操作的时间。要查找该群组作为整体的等待时间,请使用?blkio.group_wait_time?参数。如果设备包含?queue_depth?> 1,则报告只包括向该设备发送请求之前的时间,而不包括该设备将请求重新排序时等待服务的时间。这部分会接下来根据操作类型(读写、同步或异步)进一步划分。格式形如"[dev_maj[:[dev_minor] [read/write/sync/async] [io_wait_time]"。

4.1.9?blkio.io_merged

报告合并到属于这个控制组的bios/requests请求的总数,按操作类型进一步划分,读或写,同步或异步。

4.1.10 blkio.io_queued

报告控制组排队的请求总数。按操作类型进一步划分,读或写,同步或异步。

4.1.11 blkio.avg_queue_size

用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。Debugging aid only enabled if CONFIG_BFQ_CGROUP_DEBUG=y.用于报告控制组整个过程cgroup I/O 操作的平均队列大小。每当此控制组队列获得一个时间片时,该队列大小都将被采样。

4.1.12 blkio.group_wait_time

用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。用于报告控制组中每一个队列等待的总时间(单位为纳秒:ns)。每当控制组队列获得一个时间片时,此报告就会被更新,因此如果在控制组等待时间片时读取该参数文件,该报告将不会包含当前队列等待操作的时间。

4.1.13 blkio.empty_time

用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。报告没有任何等待处理的请求时,控制组花费的总时间(纳秒:ns)。每当控制组的列队有等待处理的请求时,报告都会被更新,因此如果控制组没有任何等待处理的请求时读取此参数文件,该报告将不会包含消耗在当前空状态中的时间。

4.1.14 blkio.idle_time

用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。报告当一个请求比其它队列或者其它群组的请求更好时,调度程序让控制组闲置所消耗的总时间(纳秒:ns)。每当该群组不处于闲置状态时,该报告就会被更新。因此如果在控制组闲置时读取该参数文件,该报告将不会包含消耗在当前闲置状态的时间。

4.1.15 blkio.dequeue

用于调试目。仅在CONFIG_BFQ_CGROUP_DEBUG=y配置项打开的情况下才会生效。报告 cgroup 的 I/O 操作请求被具体设备从队列中移除的次数。格式形如"[dev_maj[:[dev_minor] [number of dequeues]"。

4.1.16 blkio.*_recursive

递归统计各种类型的数据。这些文件显示与它们的非递归对应项相同的信息,但是包括所有子cgroup的统计信息。

4.2 节流/上限 限制型策参数文件

4.2.1 blkio.throttle.read_bps_device

设置设备执行“读”操作字节的上限。“读”的操作率以每秒的字节数来限定。格式形如"[dev_maj[:[dev_minor] [bytes_per_second]"。

echo "<major>:<minor> ?<rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device

# echo "8:0 10485760" > /cgroup/blkio/test/blkio.throttle.read_bps_device

4.2.2 blkio.throttle.write_bps_device

设置设备执行“写”操作字节的上限。“写”的操作率以每秒的字节数来限定。格式形如"[dev_maj[:[dev_minor] [bytes_per_second]"。

echo "<major>:<minor> ?<rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device

# echo "8:0 10485760" > /cgroup/blkio/test/blkio.throttle.write_bps_device

4.2.3 blkio.throttle.read_iops_device

设置设备执行“读”操作次数的上限。“读”的操作率以每秒的操作次数来表示。格式形如"[dev_maj[:[dev_minor] [operations_per_second]"。

echo "<major>:<minor> ?<operations_per_second>" > /cgrp/blkio.throttle.read_iops_device

# echo "8:0 10485760" > /cgroup/blkio/test/blkio.throttle.write_bps_device

4.2.4 blkio.throttle.write_iops_device

设置设备执行“写”操作次数的上限。“写”的操作率以每秒的操作次数来表示。格式形如"[dev_maj[:[dev_minor] [operations_per_second]"。

echo "<major>:<minor> ?<rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device

# echo "8:0 10485760" > /cgroup/blkio/test/blkio.throttle.write_bps_device
注意:如果为设备同时指定了BW和IOPS规则,则IO是同时受到两方面的限制。

4.2.5 blkio.throttle.io_serviced

报告控制组根据节流限制在具体设备中执行的 I/O 操作数。格式形如:"[dev_maj[:[dev_minor] [read/write/sync/async] [Number of IOs (bio)]"。

4.2.6 blkio.throttle.io_service_bytes

报告 cgroup 传送到具体设备或者由具体设备中传送出的字节数。blkio.io_service_bytes?和?blkio.throttle.io_service_bytes?之间的唯一区别是:CFQ 调度程序在请求队列中操作时,前者不会被更新。格式形如:"[dev_maj[:[dev_minor] [read/write/sync/async] [bytes]"。

4.3 通用型策略文件

4.3.1 blkio.reset_stats

此策略文件用于重设其它所有包含统计数据的策略文件。写入一个整数到该策略文件,即可重置控制组所有的统计数据。

五、使用案例

5.1 挂载子系统

# mount -t cgroup -o blkio blkio /cgroup/blkio/

5.2 创建子系统层级下创建两个控制组 --- test1/test2

# mkdir /cgroup/blkio/test1/
# mkdir /cgroup/blkio/test2/

5.3 分别设置两个控制组不同的blkio权重

# echo 1000 > /cgroup/blkio/test1/blkio.weight
# echo 500 > /cgroup/blkio/test2/blkio.weight

5.4 用dd命令创建两个大文件

//分别创建两个大小为4G的文件
# dd if=/dev/zero of=file_1 bs=1M count=4000
# dd if=/dev/zero of=file_2 bs=1M count=4000

5.5 分别测试控制组test1,test2使用dd指令读取大文件的时间

# cgexec -g blkio:test1 time dd if=file_1 of=/dev/null
# cgexec -g blkio:test2 time dd if=file_2 of=/dev/null

注意!

为确保测试准确。测试前,先执行?dd?指令、清除所有文件系统缓存并使用下列指令释放缓存页、目录项和索引节点。

# sync
# echo 3 > /proc/sys/vm/drop_caches

可以启用“群组隔离”以便 I/O 工作量随机也可以保证公平。如要启用群组隔离,请执行下列指令:

# echo 1 > /sys/block/<disk_device>/queue/iosched/group_isolation

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:32:06  更:2022-04-06 23:32:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:01:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码