一 背景介绍
由于业务需求需要在ctyunos3操作系统使用cgroupv1 writeback功能,实现对缓存异步I/O(Buffered I/O) 进行限速。ctyunos操作系统对该功能的实现和openeuler保持一致,由于欧拉版本对该功能的使用说明不够详细,网上大部分文档基于龙蜥版本进行说明介绍。而实现细节上与龙蜥有不完全一致,使用方式上有一定的差异,因此基于ctyunos3操作系统对该功能使用进行说明。
二 功能说明
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
。
三 开启cgroupv1 writeback功能
cgroup v1接口中的cgroup writeback功能默认是关闭的,按照以下步骤开启该功能。
3.1 通过命令grubby内添加cgroup1_writeback字段( 与龙蜥字段不同)开启该功能
grubby --update-kernel=ALL --args=cgroup1_writeback
3.2 重启系统使能生效
sudo reboot
3.3 验证功能是否生效
cat /proc/cmdline | grep cgroup1_writeback
确认内核命令行参数中带有cgroup1_writeback字段
四 功能验证
4.1 模拟出两个产生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
4.2 将memcg与blkcg绑定
4.2.1 拿到blkcg1的node id
ls -i /sys/fs/cgroup/blkio/
4.2.2 将inode设置到memcg1的memory.wb_blkio_ino项
echo 23 > /sys/fs/cgroup/memory/memcg1/memory.wb_blkio_ino
4.2.3 确认是否设置成功
cat /sys/fs/cgroup/memory/memcg1/memory.wb_blkio_ino
4.3 使用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
通过lsblk 命令查找设备号
4.4 使用不带参数oflag=sync的dd命令产生缓存异步I/O
sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000
4.5 使用iostat工具查询结果
查看输出列wMB/s,如果被限制到10 MB/s,则表示cgroup writeback功能已生效。
iostat -xdm 1 sda