全部產品
Search
文件中心

Alibaba Cloud Linux:配置blk-iocost權重限速

更新時間:Jun 25, 2025

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命令查看。

  • 回顯為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 3的weight和Alibaba Cloud Linux 2的cost.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的控制組blkcg1和cgroup v2的控制組cg1,通過使用cgroup v1的cost.weight介面和cgroup v2的weight介面將控制組的預設權重修改為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