cgroup?blkio子系統(tǒng)對(duì)容器的讀寫限速詳解
正文
如果多個(gè)容器同時(shí)read/write節(jié)點(diǎn)上的一塊磁盤,如何對(duì)每個(gè)容器的read/write操作限速,以防止其相互干擾、相互競(jìng)爭(zhēng)。
cgroup v1的blkio子系統(tǒng),可以限制磁盤的I/O。
一. 磁盤讀寫的指標(biāo)
衡量磁盤讀寫的常見(jiàn)指標(biāo):
- IOPS(Input/Output Operations per Second): 每秒讀寫磁盤的次數(shù);
- Throughput(吞吐量): 每秒讀寫磁盤的數(shù)據(jù)量,也稱為帶寬(BandWidth);
Throughput = 數(shù)據(jù)塊大小 * IOPS
在IOPS固定的情況下,讀寫的數(shù)據(jù)塊越大,吞吐量也越大。
二. cgroup v1的blkio子系統(tǒng)
blkio cgroup的虛擬文件系統(tǒng)掛載點(diǎn)/sys/fs/cgroup/blkio/,包含以下參數(shù):
- blkio.throttle.read_iops_device:讀IOPS限制;
- blkio.throttle.read_bps_device:讀吞吐量限制;
- blkio.throttle.write_iops.device:寫IOPS限制;
- blkio.throttle.write_bps_device:寫吞吐量限制;
比如,限制容器對(duì)磁盤/dev/vdb的寫吞吐量 <= 10MB/s:
## 1.首先拿到/dev/vdb的主次設(shè)備號(hào) # 其中 252:16是/dev/vdb的主次設(shè)備號(hào) # ls -l /dev/vdb -l brw-rw---- 1 root disk 252, 16 Nov 2 08:02 /dev/vdb ## 2.然后寫cgroup echo "252:16 10485760" > $CGROUP_CONTAINER_PATH/blkio.throttle.write_bps_device
可以使用fio工具,在容器中進(jìn)行驗(yàn)證:
docker exec fio_test1 fio -direct=1 -rw=write -ioengine=libaio -bs=4k -size=100MB -numjobs=1 -name=/tmp/fio_test1.log
值得注意的是:
Cgroupv1 blkio只能對(duì)Direct I/O進(jìn)行限速,不能對(duì)Buffered I/O進(jìn)行限制。
三. Direct I/O 與 Buffered I/O
Direct I/O和Buffered I/O發(fā)生在用戶 寫 磁盤文件時(shí)。
Direct I/O:
- 通過(guò)Linux內(nèi)核的filesystem --> block layer --> disk driver --> disk hardware;
Buffered I/O:
- 用戶進(jìn)程將數(shù)據(jù)寫入Page cache后就返回了;
- Linux內(nèi)核線程把內(nèi)存中的數(shù)據(jù)flush到磁盤;
在Linux中,基于性能考慮,絕大多數(shù)的應(yīng)用都使用Buffered I/O模式。
四. 為什么cgroup v1 blkio不能限制Buffered I/O
對(duì)下圖中的進(jìn)程 pid_y 的cgroup進(jìn)行限制,它分別屬于memory cgroup 和 blkio cgroup:
在blkio cgroup對(duì) pid_y 做磁盤I/O限制的時(shí)候,blkio不會(huì)關(guān)心:
- pid_y 用了哪些內(nèi)存,哪些屬于Page cache,何時(shí)flush到磁盤;
- pid_y 中的Page cache被flush到磁盤時(shí),由于是內(nèi)核線程執(zhí)行flush,產(chǎn)生的磁盤I/O不被計(jì)算到進(jìn)程 pid_y上;
也就是說(shuō):
cgroup v1 blkio獨(dú)立與memory子系統(tǒng),它無(wú)法統(tǒng)計(jì)由Page cache刷入磁盤的I/O;
即 cgroup v1 blkio不能對(duì)Buffered I/O進(jìn)行限速;
五. cgroup v2解決這一問(wèn)題
cgroup v2解決了不能對(duì)Buffered I/O進(jìn)行限速的問(wèn)題。
在cgroup v2中:
- 一個(gè)進(jìn)程屬于一個(gè)控制組;
- 每個(gè)控制組可以定義多個(gè)子系統(tǒng);
上圖中,pid_y 屬于控制組group2,而group2同時(shí)配置了io和memory子系統(tǒng);
在此情況下,cgroup對(duì) pid_y 的磁盤讀寫進(jìn)行限速的時(shí)候,就可以知道 pid_y 寫入Page Cache的數(shù)據(jù)量,這樣Buffered I/O的磁盤限速就實(shí)現(xiàn)了。
也就是說(shuō),在cgroup v2中:
內(nèi)核將Page cache flush到磁盤產(chǎn)生的I/O也會(huì)被計(jì)算到進(jìn)程的I/O中;
對(duì)磁盤限速時(shí),可以同時(shí)限制Directed I/O和Buffered I/O;
值得注意的是,目前runC、containerd和kubernetes剛開始支持cgroup v2,生產(chǎn)環(huán)境上cgroup v1遷移到cgroup v2還需要一個(gè)過(guò)程。
參考 blkio的文檔
https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt
以上就是cgroup blkio子系統(tǒng)對(duì)容器的讀寫限速詳解的詳細(xì)內(nèi)容,更多關(guān)于cgroup blkio容器讀寫限速的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡(jiǎn)述Docker 安裝influxDB分布式時(shí)間序列數(shù)據(jù)庫(kù)及相關(guān)操作
influxDB是一個(gè)分布式時(shí)間序列數(shù)據(jù)庫(kù)。這篇文章主要介紹了Docker 安裝influxDB分布式時(shí)間序列數(shù)據(jù)庫(kù)及相關(guān)操作,需要的朋友可以參考下2019-10-10利用docker搭建web服務(wù)環(huán)境的方法步驟
這篇文章主要給大家介紹了關(guān)于利用docker搭建web服務(wù)環(huán)境的方法步驟,文中通過(guò)是示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09docker安裝gitea教程(本地部署gitea倉(cāng)庫(kù))
這篇文章主要介紹了docker安裝gitea教程(本地部署gitea倉(cāng)庫(kù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04使用docker部署grafana+prometheus配置
這篇文章主要介紹了docker部署grafana+prometheus配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12Jenkins+docker發(fā)布Springbot服務(wù)的實(shí)現(xiàn)
本文主要介紹了Jenkins+docker發(fā)布Springbot服務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Docker Swarm實(shí)現(xiàn)服務(wù)的滾動(dòng)更新的示例代碼
這篇文章主要介紹了Docker Swarm實(shí)現(xiàn)服務(wù)的滾動(dòng)更新的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04excel導(dǎo)出在docker環(huán)境中總是失敗的問(wèn)題
這篇文章主要介紹了excel導(dǎo)出在docker環(huán)境中總是失敗的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,2020-09-09Docker中運(yùn)行nginx并掛載本地目錄到鏡像中的方法
這篇文章主要介紹了Docker中運(yùn)行nginx并掛載本地目錄到鏡像中的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01