Block IO Controller
1 概覽
cgroup子系統blkio實作了block io控制器,無論是對存盤結構上的葉子節點和還是中間節點,它對各種IO控制策略(proportional BW, max BW)都是必須的,設計規劃就是使用同樣的cgroup,基于blkio控制器的管理介面和后臺的用戶選項來切換IO策略,
IO控制策略就是節流閥門策略,能用來規定設備上的較上層IO速度限制,這個策略在通用塊層實作,能被用在葉子節點和較高層的邏輯設備(像設備映射器device mapper)上,
2 如何控制限制策略
使能Block IO控制器:
CONFIG_BLK_CGROUP=y
在塊層使能節流閥門控制:
CONFIG_BLK_DEV_THROTTLING=y
掛載blkio控制器(參考Control Groups,為什么需要cgroups):
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
為根分組(root group)上的特定設備規定帶寬速率,策略格式是“
echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
這將限制根分組下主次設備號8:16的設備讀取速率為1MB/秒,
運行dd命令來讀取檔案,看看是否速率被控制在1MB/s:
# dd iflag=direct if=/mnt/common/zerofile of=/dev/null bs=4K count=1024
1024+0 records in
1024+0 records out
4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s
寫入限制使用blkio.throttle.write_bps_device來控制,
3 分層的cgroups
節流閥門實作了分層支持,然而分層結構的支持是由cgroup的sane_behavior來使能的,而它是一個開發選項而不是公共可用選項,
如果創建這樣一個分層結構:
root
/ \
test1 test2
|
test3
有"sane_behavior"的節流閥門能正確地處理結構,應用到整個子樹(統計本地IO的)的所有的閥門限制直接由該cgroup中的任務生成,
沒有“sane_behavior”使能的節流閥門幾乎把所有分組當作同級對待,它看起來是這樣的:
pivot
/ / \ \
root test1 test2 test3
4 用戶可見的配置項
CONFIG_BLK_CGROUP
Block IO controller.
CONFIG_BFQ_CGROUP_DEBUG
除錯幫助,使能該選型,有一些額外的統計檔案出現在cgroup,
CONFIG_BLK_DEV_THROTTLING
在塊層使能塊設備節流閥門,
5 cgroup檔案詳情
5.1 比重策略檔案
blkio.bfq.weight
規定每個cgroup權重,所有設備上的分組權重都是默認值,除非被blkio.bfq.weight_device更改,
當前允許的權重范圍1~1000,更多詳情請參看BFQ(Budget Fair Queueing),
blkio.bfq.weight_device
規定每個設備上每個cgroup的權重,會覆寫默認的分組權重,格式如下:
# echo dev_maj:dev_minor weight > blkio.bfq.weight_device
在該cgroup內的設備/dev/sdb(8:16)上配置權重300:
# echo 8:16 300 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev weight
8:16 300
在該cgroup內的設備/dev/sda(8:0)上配置權重500:
# echo 8:0 500 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev weight
8:0 500
8:16 300
移除為/dev/sda規定的權重:
# echo 8:0 0 > blkio.bfq.weight_device
# cat blkio.bfq.weight_device
dev weight
8:16 300
blkio.time
每個設備上分配給cgroup的磁盤時間(毫秒),頭兩個域定義了主次設備號,第三個域定義了分配給分組的磁盤時間(毫秒),
blkio.sectors
被分組遷入或者移出磁盤的sector數量,頭兩個域定義了主次設備號,第三個域定義了遷入或者移出磁盤的sector數量,
blkio.io_service_bytes
被分組遷入或者移出磁盤的位元組數量,它按操作型別(讀或寫,同步或異步)細分,頭兩個域定義了主次設備號,第三個域定義了操作型別,第四個域定義了位元組數量,
blkio.io_serviced
被分組發給磁盤的IO(bio)數量,它按操作型別(讀或寫,同步或異步)細分,頭兩個域定義了主次設備號,第三個域定義了操作型別,第四個域定義了IO數量,
blkio.io_service_time
在cgroup內請求發送和請求完成的IO時間總量,以納秒為時間單位,對佇列深度(queue depth)為1的設備,這個時間表示實際服務時間,如果queue_depth>1, 這個請求可能會出現服務故障,這可能使得給定IO的服務時間包含了多個IO的服務時間,導致總的io_service_time大于實際已用時間,這個時間按操作型別(讀或寫,同步或異步)細分,頭兩個域定義了主次設備號,第三個域定義了操作型別,第四個域定義了io_service_time納秒,
blkio.io_wait_time
cgroup里耗費在調度器佇列內等待服務的IO時間總量(納秒),這個時間可能大于總的已用時間,因為它累加了所有IO的io_wait_time,它不是cgroup等待時間總量的估量,而是單個wait_time的估量,對queue_depth>1的設備,這個度量不包括IO被派發給設備但它實際上還沒被服務到的等待服務的時間(可能由于設備對請求的重新排序而有時滯),這個時間按操作型別(讀或寫,同步或異步)細分,頭兩個域定義了主次設備號,第三個域定義了操作型別,第四個域定義了io_wait_time納秒,
blkio.io_merged
cgroup內的bio請求總量,它按操作型別(讀或寫,同步或異步)細分,
blkio.io_queued
cgroup內任意給定時刻的排隊請求總量,它按操作型別(讀或寫,同步或異步)細分,
blkio.avg_queue_size
除錯目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能,整個cgroup生存期內的平均佇列大小,這個cgroup內其中一個佇列每次獲取到時間片(timeslice),佇列大小采樣就進行一次,
blkio.group_wait_time
除錯目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能,cgroup從它變忙(請求佇列從0變為1)到其中一個佇列獲取到時間片而必須等待的時間數量,它不同于io_wait_time,這個是納秒單位的,cgroup在等待(waiting)狀態時讀取,這個統計僅報告累計到它最后一次獲取到時間片的group_wait_time,不包括當前delta增量,
blkio.empty_time
除錯目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能,cgroup沒有被服務也沒有等待請求的時間數量(納秒),它不包含cgroup內任何一個隊的空閑何時間,cgroup在空(empty)狀態時讀取,這個統計將只報告累計到它最后一次有等待請求的empty_time,不包括當前delta增量,
blkio.idle_time
除錯目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能,IO調度器花在期待更好的請求而不是現存的請求上的空閑時間數量(納秒),cgroup在空閑(idling)狀態時讀取,這個統計將只報告累加到最后一個空閑周期的idle_time,,不包括當前delta增量,
blkio.dequeue
除錯目的,由CONFIG_BFQ_CGROUP_DEBUG=y來使能,這個統計cgroup從設備服務樹出隊(dequeue)多少次,頭兩個域定義了主次設備號,第三個域定義了從特定設備出隊的次數,第四個域定義了io_wait_time納秒,
blkio.*_recursive
各種統計的遞回版本,這個檔案跟他們的非遞回版本對應部分顯示的資訊相同,但是多包含了所有派生cgroup的統計資料,
5.2 限制策略檔案
blkio.throttle.read_bps_device
規定了設備讀取速率的上層限制(位元組/秒),這個規則是針對設備的,格式如下:
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device
blkio.throttle.write_bps_device
規定了設備寫入速率的上層限制(位元組/秒),這個規則是針對設備的,格式如下:
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device
blkio.throttle.read_iops_device
規定了設備讀取速率的上層限制(IO/秒),這個規則是針對設備的,格式如下:
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.read_iops_device
blkio.throttle.write_iops_device
規定了設備寫入速率的上層限制(IO/秒),這個規則是針對設備的,格式如下:
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device
注意:如果設備上BW和IOPS規則都被定義了,那么IO受兩種規則的限制,
blkio.throttle.io_serviced
派發給分組內磁盤的IO(bio)數量,它又按操作型別(讀或寫,同步或異步)細分,頭兩個域定義了主次設備號,第三個域定義了操作型別,第四個域定義了IO數量,
blkio.throttle.io_service_bytes
被分組遷入或者移出磁盤的位元組數量,它又按操作型別(讀或寫,同步或異步)細分,頭兩個域定義了主次設備號,第三個域定義了操作型別,第四個域定義了位元組數量,
5.3 多種策略間的公共檔案
blkio.reset_stats
寫入整型數會重置cgroup所有統計資料,
英文原文:
https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/blkio-controller.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/488672.html
標籤:其他
