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接口
cost.model接口
該接口用于設置成本模型(cost model)。是一個可讀可寫接口,接口文件只存在于blkcg根組,且在不同cgroup中的完整名稱不同:
cgroup v1:接口文件完整名稱為
blkio.cost.model
。cgroup v2:接口文件完整名稱為
io.cost.model
。
接口配置說明:
每行配置以設備的Major號和Minor號開頭,格式為
MAJ:MIN
(通過lsblk | grep <云盤名稱>
命令查詢設備號),后邊銜接其他配置項,說明如下。ctrl:控制模式,可選值為
auto
和user
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.weight(Alibaba 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.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資源的使用情況。
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
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
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