cgroupv1和cgroupv2是Linux内核中的两个不同版本的资源管理功能。在AlibabaCloudLinux内核中,blk-iocost功能同时支持cgroupv1和v2接口,但通常在一个系统中只有一个版本是被激活和使用的。您可以通过stat-fc%T/sys/fs/cgroup命令查看当前系统使用的是cgroupv1接口还是cgroupv2接口:
回显为tmpfs:表示cgroupv1接口。
回显为cgroup2fs:表示cgroupv2接口。
该接口用于开启或关闭blk-iocost功能以及基于延迟(latency)权重限制I/O服务质量(QoS)的速率。是一个可读可写接口,接口文件只存在于blkcg根组,且在不同cgroup中的完整名称不同:
cgroupv1:接口文件完整名称为blkio.cost.qos。
cgroupv2:接口文件完整名称为io.cost.qos。
接口配置说明:
每行配置以设备的Major号和Minor号开头,格式为MAJ:MIN(通过lsblk|grep<云盘名称>命令查询设备号),后边衔接其他配置项,说明如下。
enable:是否开启blk-iocost功能。
默认值0:关闭blk-iocost功能。
修改为1:开启blk-iocost功能。
ctrl:控制模式,可选值为auto和user。
auto:系统自动探测设备类型并使用内置参数。
设置ctrl=auto时,如果ECS实例挂载的云盘存储类型为SSD云盘、ESSD云盘或NVMeSSD本地盘等固态存储设备时,需要手动将对应云盘的rotational属性设置为0。blk-iocost可以更准确地估计I/O成本并相应地调整其调度策略,以提高固态存储设备的I/O性能。命令示例如下:
sudosh-c'echo0>/sys/block/
rpct:读延迟百分比,取值范围为[0,100]。
rlat:读延迟,单位为us。
wpct:写延迟百分比,取值范围为[0,100]。
wlat:写延迟,单位为us。
min:最小速率调整比例,取值范围为[1,10000]。
max:最大速率调整比例,取值范围为[1,10000]。
该接口用于设置成本模型(costmodel)。是一个可读可写接口,接口文件只存在于blkcg根组,且在不同cgroup中的完整名称不同:
cgroupv1:接口文件完整名称为blkio.cost.model。
cgroupv2:接口文件完整名称为io.cost.model。
ctrl:控制模式,可选值为auto和user
auto:系统基于当前工作负载自动优化I/O调度策略。
sudosh-c'echo0>/sys/block/
model:模型参数,当前只实现了一种模型linear。当模型参数为linear时,定义如下建模参数。
[r|w]bps:最大顺序IO带宽。
[r|w]seqiops:顺序IOPS(Input/OutputOperationsPerSecond)。
[r|w]randiops:随机IOPS。
以上参数可以使用内核源码中的tools/cgroup/iocost_coef_gen.py脚本来生成,然后写入cost.model接口文件内设置成本模型。
该接口可以为每个设备配置权重,也可以修改该整个子组的默认权重(100),范围为[1,10000]。是一个可读可写接口,接口文件只存在blkcg的子组中,且在不同cgroup中的完整名称不同:
在不同cgroup中的完整名称不同:
cgroupv1:接口文件完整名称为blkio.cost.weight。
cgroupv2:接口文件完整名称为io.weight。
cgroupv2:接口文件完整名称为io.cost.weight。
为接口设置权重值
为接口设置端口号和权重值MAJ:MIN
仅以下内核版本的AlibabaCloudLinux镜像支持配置blk-iocost功能:
AlibabaCloudLinux2:4.19.81-17及以上内核版本。
AlibabaCloudLinux3:所有版本。
场景示例:使用cost.qos接口为设备254:48开启blk-iocost功能,并且当读写请求延迟rlat|wlat有5%超过5ms时,认为磁盘饱和。内核将进行磁盘发送请求速率的调整,调整区间为最低降至原速率的50%,最高升至原速率的150%。cgroupv1接口和cgroupv2接口命令分别如下。
sudosh-c'echo"254:48enable=1ctrl=userrpct=95.00rlat=5000wpct=95.00wlat=5000min=50.00max=150.00">/sys/fs/cgroup/blkio/blkio.cost.qos'cgroupv2接口sudosh-c'echo"254:48enable=1ctrl=userrpct=95.00rlat=5000wpct=95.00wlat=5000min=50.00max=150.00">/sys/fs/cgroup/io.cost.qos'步骤二:使用cost.model接口设置成本模型场景示例:使用cost.model接口在设备254:48上使用用户输入的linear建模参数设置模型。cgroupv1接口和cgroupv2接口命令分别如下。
sudomkdir/sys/fs/cgroup/blkio/blkcg1#创建控制组blkcg1sudosh-c'echo"50">/sys/fs/cgroup/blkio/blkcg1/blkio.cost.weight'#将默认权重修改为50sudosh-c'echo"254:4850">/sys/fs/cgroup/blkio/blkcg1/blkio.cost.weight'#将设备上的权重设置为50cgroupv2接口AlibabaCloudLinux2
sudomkdir/sys/fs/cgroup/cg1#创建控制组cg1sudosh-c'echo"50">/sys/fs/cgroup/cg1/io.cost.weight'#将默认权重修改为50sudosh-c'echo"254:4850">/sys/fs/cgroup/cg1/io.cost.weight'#将设备上的权重设置为50AlibabaCloudLinux3
sudomkdir/sys/fs/cgroup/cg1#创建控制组cg1sudosh-c'echo"50">/sys/fs/cgroup/cg1/io.weight'#将默认权重修改为50sudosh-c'echo"254:4850">/sys/fs/cgroup/cg1/io.weight'#将设备上的权重设置为50常用监测工具blk-iocost需要能够监控和评估系统的I/O性能,可以通过以下工具或接口来监测I/O资源的使用情况,以便帮助您更好地理解和调优I/O资源的使用情况。
iocostmonitor脚本
Linux内核源码中的tools/cgroup/iocost_monitor.py脚本基于drgn调试器可以直接获取内核参数进行I/O性能数据的监控输出。脚本使用方式如下。
首先确保安装drgn调试器。示例命令:
(可选)下载iocost_monitor.py。
如果您没有下载完整的Linux内核源码,需要从Linux内核的公共仓库克隆或下载iocost_monitor.py脚本。示例命令:
sudopython3./iocost_monitor.pvdd返回结果示例如下。
vddRUNper=500.0mscur_per=3930.839:v14620.321busy=+1vrate=6136.22%params=hddactiveweighthweight%inflt%dbtdelayusages%blkcg1*50/509.09/9.090.0000*000009:009:009blkcg2*500/50090.91/90.910.0000*000089:091:092cgroupv1接口下的blkio.cost.stat接口
AlibabaCloudLinux内核提供了在cgroupv1接口下的blk-iocost统计接口,该接口文件中记录了每个受控制的设备的QoS数据。查看该接口文档的命令如下。
cat/sys/fs/cgroup/blkio/blkcg1/blkio.cost.stat返回结果示例如下。
254:48is_active=1active=50inuse=50hweight_active=5957hweight_inuse=5957vrate=159571ftrace监测工具
将enable属性设置为1,开启ftrace工具。
sudosh-c'echo1>/sys/kernel/debug/tracing/events/iocost/enable'