配置blk-iocost权重限速

blk-iocost权重限速功能是Alibaba Cloud Linuxcgroup I/O子系统(blkcg)基于权重的磁盘限速功能的改进。它是一种I/O控制器,可以根据应用程序或进程的优先级为块设备上的I/O操作分配带宽,并且可以通过设置权重值来限制特定应用程序或进程对块设备的I/O带宽使用,以便帮助您更好地实现对磁盘I/O资源的控制和管理。

说明

cgroup v1cgroup v2Linux内核中两个不同版本的资源管理功能。在Alibaba Cloud Linux内核中,blk-iocost功能同时支持cgroup v1v2接口,但通常在一个系统中仅有一个版本被激活和使用。您可以通过执行stat -fc %T /sys/fs/cgroup命令查看。

  • 回显为tmpfs:表示cgroup v1接口。

  • 回显为cgroup2fs:表示cgroup v2接口。

操作系统限制

  • Alibaba Cloud Linux 2(内核4.19.81-17及以上版本)。

  • Alibaba Cloud Linux 3。

cost.qos接口使用说明

cost.qos是一个可读写的接口,用于开启或关闭blk-iocost功能,以及基于延迟权重限制I/O服务质量(QoS)的速率。接口文件仅存在于blkcg根组中,且在不同的cgroup中的完整名称有所不同。

  • cgroup v1:接口文件完整名称为blkio.cost.qos

  • cgroup v2:接口文件完整名称为io.cost.qos

配置说明

每行配置以设备的Major号和Minor号开头,格式为MAJ:MIN(通过lsblk | grep <云盘名称>命令查询设备号),后边衔接其他配置项,配置项说明如下。

配置项

说明

enable

是否开启blk-iocost功能。

  • 0:默认值,关闭blk-iocost功能。

  • 1:开启blk-iocost功能。

ctrl

控制模式。

  • auto:系统自动探测设备类型并使用内置参数。

    重要

    设置ctrl=auto时,如果ECS实例挂载的云盘存储类型为SSD云盘、ESSD云盘或NVMe SSD本地盘等固态存储设备时,需要手动将对应云盘的rotational属性设置为0。blk-iocost可以更准确地估计I/O成本并相应地调整其调度策略,以提高固态存储设备的I/O性能。命令示例如下:

    <DISK_NAME>需替换为实际的云盘名称。

    sudo sh -c 'echo 0 > /sys/block/<DISK_NAME>/queue/rotational'
  • user:需要用户手动设置以下控制参数。

    • rpct:读延迟百分比,取值范围为[0,100]。

    • rlat:读延迟,单位为us。

    • wpct:写延迟百分比,取值范围为[0,100]。

    • wlat:写延迟,单位为us。

    • min:最小速率调整比例,取值范围为[1,10000]。

    • max:最大速率调整比例,取值范围为[1,10000]。

开启blk-iocost功能

本文以设备254:48开启blk-iocost功能,控制模式为user为例,并设置读写请求延迟(rlat|wlat)有95%超过5 ms时,认为磁盘饱和。内核将进行磁盘发送请求速率的调整,调整范围为50%~150%。

  • 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是一个可读写接的口,用于设置成本模型(cost model)。该接口文件仅存在于blkcg根组中,并且在不同的cgroup中,其完整名称有所不同。

  • cgroup v1:接口文件完整名称为blkio.cost.model

  • cgroup v2:接口文件完整名称为io.cost.model

配置说明

每行配置以设备的Major号和Minor号开头,格式为MAJ:MIN(通过lsblk | grep <云盘名称>命令查询设备号),后边衔接其他配置项,配置项说明如下。

配置项

说明

ctrl

控制模式。

  • auto:系统基于当前工作负载自动优化I/O调度策略。

    重要

    设置ctrl=auto时,如果ECS实例挂载的云盘存储类型为SSD云盘、ESSD云盘或NVMe SSD本地盘等固态存储设备时,需要手动将对应云盘的rotational属性设置为0。blk-iocost可以更准确地估计I/O成本并相应地调整其调度策略,以提高固态存储设备的I/O性能。命令示例如下:

    <DISK_NAME>需替换为实际的云盘名称。

    sudo sh -c 'echo 0 > /sys/block/<DISK_NAME>/queue/rotational'
  • user:需要用户手动输入模型参数。

model

模型参数。目前仅实现了linear一种模型。当模型参数为linear时,定义如下建模参数。

  • [r|w]bps:最大顺序IO带宽。单位:字节/秒。

  • [r|w]seqiops:顺序IOPS(Input/Output Operations Per Second)限制。

  • [r|w]randiops:随机IOPS限制。

    说明

    以上参数可以使用内核源码中的tools/cgroup/iocost_coef_gen.py脚本来生成,然后写入cost.model接口文件内设置成本模型。

使用cost.model接口设置成本模型

本文以在设备254:48上使用用户输入的linear建模参数设置模型为例。

  • 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.weight接口使用说明

Alibaba Cloud Linux 3weightAlibaba Cloud Linux 2cost.weight是内核中用于控制I/O资源分配的核心接口,均为可读写接口。通过配置权重值[1,10000],动态分配磁盘I/O带宽。该接口文件仅存在blkcg的子组中,并且在不同cgroup中的完整名称存在差异。

  • Alibaba Cloud Linux 3

    • cgroup v1:接口文件完整名称为blkio.cost.weight

    • cgroup v2:接口文件完整名称为io.weight

  • Alibaba Cloud Linux 2

    • cgroup v1:接口文件完整名称为blkio.cost.weight

    • cgroup v2:接口文件完整名称为io.cost.weight

配置说明

  • 为接口设置权重值<weight>:表示修改blkcg的默认权重。

  • 为接口设置端口号和权重值MAJ:MIN <weight>:表示修改设备上的blkcg的权重。

使用weight接口修改权重

开启blk-iocost功能后,本文以创建cgroup v1的控制组blkcg1cgroup v2的控制组cg1,通过使用cgroup v1cost.weight接口和cgroup v2weight接口将控制组的默认权重修改为50,并将控制组在设备254:48上的权重设置为50为例。

  • 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 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
    • 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

常用监测工具

blk-iocost需要能够监控和评估系统的I/O性能,可以通过以下工具或接口来监测I/O资源的使用情况,以便帮助您更好地理解和调优I/O资源的使用情况。

  • iocost monitor脚本

    Linux内核源码中的tools/cgroup/iocost_monitor.py脚本基于drgn调试器可以直接获取内核参数进行I/O性能数据的监控输出。脚本使用方式如下。

    1. 执行以下命令,安装drgn调试器。

      sudo pip3 install drgn
    2. 执行以下命令,下载 iocost_monitor.py脚本。

      wget https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/cgroup/iocost_monitor.py
    3. 执行以下命令,运行 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请求的处理,从而提供深入的性能分析。使用方式如下。

    1. enable属性设置为1,开启ftrace工具。

      sudo sh -c 'echo 1 > /sys/kernel/debug/tracing/events/iocost/enable'
    2. 查看信息输出接口。

      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