blk-iocost权重限速功能是Alibaba Cloud Linux对cgroup I/O子系统(blkcg)基于权重的磁盘限速功能的改进。它是一种I/O控制器,可以根据应用程序或进程的优先级为块设备上的I/O操作分配带宽,并且可以通过设置权重值来限制特定应用程序或进程对块设备的I/O带宽使用,以便帮助您更好地实现对磁盘I/O资源的控制和管理。
说明 cgroup v1和cgroup v2是Linux内核中的两个不同版本的资源管理功能。在Alibaba Cloud Linux内核中,blk-iocost功能同时支持cgroup v1和v2接口,但通常在一个系统中只有一个版本是被激活和使用的。您可以通过stat -fc %T /sys/fs/cgroup
命令查看当前系统使用的是cgroup v1接口还是cgroup v2接口:
接口说明
cost.qos接口
该接口用于开启或关闭blk-iocost功能以及基于延迟(latency)权重限制I/O服务质量(QoS)的速率。是一个可读可写接口,接口文件只存在于blkcg根组,且在不同cgroup中的完整名称不同:
接口配置说明:
每行配置以设备的Major号和Minor号开头,格式为MAJ:MIN
(通过lsblk | grep <云盘名称>
命令查询设备号),后边衔接其他配置项,说明如下。
enable:是否开启blk-iocost功能。
默认值0:关闭blk-iocost功能。
修改为1:开启blk-iocost功能。
ctrl:控制模式,可选值为auto
和user
。
auto
:系统自动探测设备类型并使用内置参数。
重要 设置ctrl=auto
时,如果ECS实例挂载的云盘存储类型为SSD云盘、ESSD云盘或NVMe SSD本地盘等固态存储设备时,需要手动将对应云盘的rotational
属性设置为0。blk-iocost可以更准确地估计I/O成本并相应地调整其调度策略,以提高固态存储设备的I/O性能。命令示例如下:
sudo sh -c 'echo 0 > /sys/block/<DISK_NAME>/queue/rotational' #<DISK_NAME>需替换为实际的云盘名称
user
:需要用户手动设置以下控制参数。
rpct:读延迟百分比,取值范围为[0,100]。
rlat:读延迟,单位为us。
wpct:写延迟百分比,取值范围为[0,100]。
wlat:写延迟,单位为us。
min:最小速率调整比例,取值范围为[1,10000]。
max:最大速率调整比例,取值范围为[1,10000]。
cost.model接口
该接口用于设置成本模型(cost model)。是一个可读可写接口,接口文件只存在于blkcg根组,且在不同cgroup中的完整名称不同:
接口配置说明:
每行配置以设备的Major号和Minor号开头,格式为MAJ:MIN
(通过lsblk | grep <云盘名称>
命令查询设备号),后边衔接其他配置项,说明如下。
weight(Alibaba Cloud Linux 3)/cost.weight(Alibaba Cloud Linux 2)接口
该接口可以为每个设备配置权重,也可以修改该整个子组的默认权重(100),范围为[1,10000]。是一个可读可写接口,接口文件只存在blkcg的子组中,且在不同cgroup中的完整名称不同:
Alibaba Cloud Linux 3
在不同cgroup中的完整名称不同:
接口配置说明:
功能限制
仅以下内核版本的Alibaba Cloud Linux镜像支持配置blk-iocost功能:
操作步骤
步骤一:使用cost.qos接口开启blk-iocost功能
场景示例:使用cost.qos
接口为设备254:48
开启blk-iocost功能,并且当读写请求延迟rlat|wlat
有5%超过5ms时,认为磁盘饱和。内核将进行磁盘发送请求速率的调整,调整区间为最低降至原速率的50%,最高升至原速率的150%。cgroup v1接口和cgroup v2接口命令分别如下。
cgroup v1接口
sudo sh -c 'echo "254:48 enable=1 ctrl=user rpct=95.00 rlat=5000 wpct=95.00 wlat=5000 min=50.00 max=150.00" > /sys/fs/cgroup/blkio/blkio.cost.qos'
cgroup v2接口
sudo sh -c 'echo "254:48 enable=1 ctrl=user rpct=95.00 rlat=5000 wpct=95.00 wlat=5000 min=50.00 max=150.00" > /sys/fs/cgroup/io.cost.qos'
步骤二:使用cost.model接口设置成本模型
场景示例:使用cost.model
接口在设备254:48
上使用用户输入的linear
建模参数设置模型。cgroup v1接口和cgroup v2接口命令分别如下。
cgroup v1接口
sudo sh -c 'echo "254:48 ctrl=user model=linear rbps=2706339840 rseqiops=89698 rrandiops=110036 wbps=1063126016 wseqiops=135560 wrandiops=130734" > /sys/fs/cgroup/blkio/blkio.cost.model'
cgroup v2接口
sudo sh -c 'echo "254:48 ctrl=user model=linear rbps=2706339840 rseqiops=89698 rrandiops=110036 wbps=1063126016 wseqiops=135560 wrandiops=130734" > /sys/fs/cgroup/io.cost.model'
步骤三:使用weight接口修改权重
场景示例:通过步骤一:使用cost.qos接口开启blk-iocost功能或步骤二:使用cost.model接口设置成本模型配置cost.qos
或cost.model
接口开启blk-iocost功能之后,创建blkcg1(cgroup v1)/cg1(cgroup v2)控制组并使用cost.weight
(cgroup v1)/weight
(cgroup v2)接口将控制组的默认权重修改为50,然后设置控制组在设备254:48
上的权重为50,cgroup v1接口和cgroup v2接口命令分别如下。
cgroup v1接口
sudo mkdir /sys/fs/cgroup/blkio/blkcg1 # 创建控制组blkcg1
sudo sh -c 'echo "50" > /sys/fs/cgroup/blkio/blkcg1/blkio.cost.weight' # 将默认权重修改为50
sudo sh -c 'echo "254:48 50" > /sys/fs/cgroup/blkio/blkcg1/blkio.cost.weight' #将设备上的权重设置为50
cgroup v2接口
Alibaba Cloud Linux 2
sudo mkdir /sys/fs/cgroup/cg1 # 创建控制组cg1
sudo sh -c 'echo "50" > /sys/fs/cgroup/cg1/io.cost.weight' # 将默认权重修改为50
sudo sh -c 'echo "254:48 50" > /sys/fs/cgroup/cg1/io.cost.weight' #将设备上的权重设置为50
Alibaba Cloud Linux 3
sudo mkdir /sys/fs/cgroup/cg1 # 创建控制组cg1
sudo sh -c 'echo "50" > /sys/fs/cgroup/cg1/io.weight' # 将默认权重修改为50
sudo sh -c 'echo "254:48 50" > /sys/fs/cgroup/cg1/io.weight' #将设备上的权重设置为50
常用监测工具
blk-iocost需要能够监控和评估系统的I/O性能,可以通过以下工具或接口来监测I/O资源的使用情况,以便帮助您更好地理解和调优I/O资源的使用情况。
iocost monitor脚本
Linux内核源码中的tools/cgroup/iocost_monitor.py
脚本基于drgn调试器可以直接获取内核参数进行I/O性能数据的监控输出。脚本使用方式如下。
首先确保安装drgn调试器。示例命令:
sudo pip3 install drgn
更多关于drgn的信息,请参见drgn。
(可选)下载 iocost_monitor.py
。
如果您没有下载完整的Linux内核源码,需要从Linux内核的公共仓库克隆或下载 iocost_monitor.py
脚本。示例命令:
wget https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/cgroup/iocost_monitor.py
运行 iocost_monitor.py
脚本。示例命令(以vdd云盘为例):
sudo python3 ./iocost_monitor.p vdd
返回结果示例如下。
vdd RUN per=500.0ms cur_per=3930.839:v14620.321 busy= +1 vrate=6136.22% params=hdd
active weight hweight% inflt% dbt delay usages%
blkcg1 * 50/ 50 9.09/ 9.09 0.00 0 0*000 009:009:009
blkcg2 * 500/ 500 90.91/ 90.91 0.00 0 0*000 089:091:092
cgroup v1接口下的blkio.cost.stat接口
Alibaba Cloud Linux内核提供了在cgroup v1接口下的blk-iocost统计接口,该接口文件中记录了每个受控制的设备的QoS数据。查看该接口文档的命令如下。
cat /sys/fs/cgroup/blkio/blkcg1/blkio.cost.stat
返回结果示例如下。
254:48 is_active=1 active=50 inuse=50 hweight_active=5957 hweight_inuse=5957 vrate=159571
ftrace监测工具
Alibaba Cloud Linux内核提供了blk-iocost相关的ftrace工具。对于 blk-iocost
功能,ftrace可以帮助捕捉调度器的决策过程,详细跟踪I/O请求的处理,从而提供深入的性能分析。使用方式如下。
将enable
属性设置为1,开启ftrace工具。
sudo sh -c 'echo 1 > /sys/kernel/debug/tracing/events/iocost/enable'
查看信息输出接口。
sudo cat /sys/kernel/debug/tracing/trace_pipe
返回结果示例如下。
dd-1593 [008] d... 688.565349: iocost_iocg_activate: [vdd:/blkcg1] now=689065289:57986587662878 vrate=137438 period=22->22 vtime=0->57986365150756 weight=50/50 hweight=65536/65536
dd-1593 [008] d.s. 688.575374: iocost_ioc_vrate_adj: [vdd] vrate=137438->137438 busy=0 missed_ppm=0:0 rq_wait_pct=0 lagging=1 shortages=0 surpluses=1
<idle>-0 [008] d.s. 688.608369: iocost_ioc_vrate_adj: [vdd] vrate=137438->137438 busy=0 missed_ppm=0:0 rq_wait_pct=0 lagging=1 shortages=0 surpluses=1
dd-1594 [006] d... 688.620002: iocost_iocg_activate: [vdd:/blkcg2] now=689119946:57994099611644 vrate=137438 period=22->26 vtime=0->57993412421644 weight=250/250 hweight=65536/65536
<idle>-0 [008] d.s. 688.631367: iocost_ioc_vrate_adj: [vdd] vrate=137438->137438 busy=0 missed_ppm=0:0 rq_wait_pct=0 lagging=1 shortages=0 surpluses=1
<idle>-0 [008] d.s. 688.642368: iocost_ioc_vrate_adj: [vdd] vrate=137438->137438 busy=0 missed_ppm=0:0 rq_wait_pct=0 lagging=1 shortages=0 surpluses=1
<idle>-0 [008] d.s. 688.653366: iocost_ioc_vrate_adj: [vdd] vrate=137438->137438 busy=0 missed_ppm=0:0 rq_wait_pct=0 lagging=1 shortages=0 surpluses=1
<idle>-0 [008] d.s. 688.664366: iocost_ioc_vrate_adj: [vdd] vrate=137438->137438 busy=0 missed_ppm=0:0 rq_wait_pct=0 lagging=1 shortages=0 surpluses=1