配置blk-iocost权重限速

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接口:

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

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

接口说明

  • cost.qos接口

    该接口用于开启或关闭blk-iocost功能以及基于延迟(latency)权重限制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:控制模式,可选值为autouser

      • 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中的完整名称不同:

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

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

    接口配置说明:

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

    • ctrl:控制模式,可选值为autouser

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

        重要

        设置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:需要用户手动输入模型参数。

    • 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接口文件内设置成本模型。

  • weight(Alibaba Cloud Linux 3)/cost.weightAlibaba Cloud Linux 2)接口

    该接口可以为每个设备配置权重,也可以修改该整个子组的默认权重(100),范围为[1,10000]。是一个可读可写接口,接口文件只存在blkcg的子组中,且在不同cgroup中的完整名称不同:

    Alibaba Cloud Linux 3

    在不同cgroup中的完整名称不同:

    • 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的权重。

功能限制

仅以下内核版本的Alibaba Cloud Linux镜像支持配置blk-iocost功能:

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

  • Alibaba Cloud Linux 3:所有版本。

操作步骤

步骤一:使用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.qoscost.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性能数据的监控输出。脚本使用方式如下。

    1. 首先确保安装drgn调试器。示例命令:

      sudo pip3 install drgn

      更多关于drgn的信息,请参见drgn

    2. (可选)下载 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
    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