在Alibaba Cloud Linux 2(核心版本4.19.36-12.al7
開始)和Alibaba Cloud Linux 3中,對核心介面cgroup v1新增了控制群組回寫(cgroup writeback)功能。該功能使您在使用核心介面cgroup v1時,可以對緩衝非同步I/O (Buffered I/O) 進行限速。
背景資訊
控制群組(control group)簡稱為cgroup,分為v1和v2兩個版本。更多資訊,請參見什麼是控制群組。本文介紹如何啟用cgroup v1的cgroup writeback功能,並對進程進行Buffered I/O限速。
使用限制
在啟用cgroup writeback功能之後,您可以先確認記憶體子系統(memcg)和IO子系統(blkcg)的映射關係是否符合下文所述的規則,再對進程進行Buffered I/O限速。
cgroup writeback功能需要memcg和blkcg協同工作,完成Buffered I/O的限速,但是核心介面cgroup v1的各個控制子系統間預設不協同工作。因此需要通過一定的規則把memcg和blkcg串連起來,規則為:通過任意一個memcg必須可以找到與之唯一對應的blkcg。即memcg和blkcg的映射關係可以是一對一或多對一,不可以是一對多或多對多。
例如,存在進程A和B,對它們進行Buffered I/O限速,需要遵循以下約束。
如果A和B分屬不同的memcg,它們可以映射到不同的blkcg,只需各自一一對應。例如:A屬於
memcg1
,blkcg1
;B屬於memcg2
,blkcg0
。如果A和B分屬不同的memcg,它們也可以映射到同一個blkcg。例如:A屬於
memcg1
,B屬於memcg2
,A和B都屬於blkcg2
。如果A和B屬於相同的memcg,那麼它們只能映射到同一個blkcg。例如:A和B均屬於
memcg0
,它們同時屬於blkcg3
。
為了避免出現意外情況,建議您在啟用cgroup writeback功能後,對進程進行Buffered I/O限速前,優先設定blkcg的cgroup.procs
介面,向該介面寫入一個進程ID來保證blkcg映射的唯一性。同時您也可以通過工具查看memcg和blkcg的映射關係,更多資訊,請參見確認memcg和blkcg的映射關係。
在實際營運中,可能出現進程移動到其它cgroup的情況。根據上述規則,如果進程在memcg之間移動,不會出現問題,但如果進程在blkcg之間移動,將會出現異常情況。為了避免產生異常,該功能的代碼中定義了規則:一旦工作中的blkcg內的進程發生blkcg間的移動,則將映射關係直接指向root blkcg。由於一般情況是不在root blkcg設定限流閾值,所以當映射關係直接指向root blkcg時,限速功能會失效。
核心代碼雖定義了規則避免出現意外,但您需要在實際操作中盡量避免將進程在blkcg間移動。
開啟cgroup writeback功能
cgroup v1介面中的cgroup writeback功能預設是關閉的,按照以下步驟開啟該功能。
通過命令
grubby
內添加cgwb_v1
欄位開啟該功能。本樣本中核心版本為
4.19.36-12.al7.x86_64
,您在操作中需要更換為實際的核心版本,核心版本的查看命令為uname -r
。sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1"
重啟系統使功能生效。
sudo reboot
使用以下命令讀取核心檔案
/proc/cmdline
,確認核心命令列參數中帶有cgwb_v1
欄位。此時,blkcg下的blkio.throttle.write_bps_device
及blkio.throttle.write_iops_device
介面能夠對Buffered I/O進行限速。cat /proc/cmdline | grep cgwb_v1
在k8s環境下,開啟cgroup writeback功能後,您需要額外綁定memory和blkio cgroup子系統,以避免因為進程移動導致限速功能失效。
合并memory和blkio cgroup子系統。
編輯system.conf檔案。
sudo vim /etc/systemd/system.conf
修改JoinControllers配置,例如:
JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkio
按 Ecs 鍵退出編輯模式,輸入 :wq儲存並退出。
運行以下命令,重做核心鏡像,確保systemd的配置修改生效。
sudo dracut /boot/initramfs-4.19.36-12.al7.x86_64.img 4.19.36-12.al7.x86_64 --force
運行以下命令,重啟系統。
sudo reboot
運行以下命令,驗證memory、blkio子系統是否合并。
ls /sys/fs/cgroup
驗證cgroup writeback是否生效
本樣本將類比出兩個產生I/O的進程,用於驗證cgroup writeback功能是否有效。
由於
dd
命令的反饋速度較快,結果使用iostat
命令查看。由於
dd
命令為順序寫入,順序IO回刷時,會產生1 MB資料再回刷,因此設定閾值時,blkio.throttle.write_bps_device
不得小於1 MB(1048576)。如果設定值小於1 MB,可能會引發IO hang。
類比出兩個產生I/O的進程,並按照限制條件優先設定blkcg的
cgroup.procs
介面。sudo mkdir /sys/fs/cgroup/blkio/blkcg1 sudo mkdir /sys/fs/cgroup/memory/memcg1 sudo bash -c "echo $$ > /sys/fs/cgroup/blkio/blkcg1/cgroup.procs" # $$為您的進程ID sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$為您的進程ID
使用blkcg下的
blkio.throttle.write_bps_device
介面對Buffered I/O進行限速。sudo bash -c "echo 254:48 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device" # 通過裝置號配置磁碟的回寫限流bps為10 M
使用不帶參數
oflag=sync
的dd
命令產生緩衝非同步I/O。sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000
使用iostat工具查詢結果。查看輸出資料行
wMB/s
,如果被限制到10 MB/s,則表示cgroup writeback功能已生效。iostat -xdm 1 vdd
確認memcg和blkcg的映射關係
您可以使用以下任意一種方式診斷memcg和blkcg的映射關係是否為一對一或多對一。
查看memcg與blkcg映射關係。
sudo cat /sys/kernel/debug/bdi/bdi_wb_link
返回結果樣本如下,該樣本表示memcg和blkcg符合一對一的映射規則。
memory <---> blkio memcg1: 35 <---> blkcg1: 48
使用ftrace核心監測工具。
開啟ftrace工具。
sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable"
查看資訊輸出介面。
sudo cat /sys/kernel/debug/tracing/trace_pipe
輸出內容樣本如下,其中
memcg_ino=35 blkcg_ino=48
表示memcg和blkcg符合一對一的映射規則。<...>-1537 [006] .... 99.511327: insert_memcg_blkcg_link: memcg_ino=35 blkcg_ino=48 old_blkcg_ino=0