Alibaba Cloud Linux 2在内核版本4.19.36-12.al7中,对内核接口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分属不同的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.procs
接口,向该接口写入一个进程ID来保证blkcg映射的唯一性。同时您也可以通过工具查看memcg和blkcg的映射关系,详情请参见确认memcg和blkcg的映射关系。
开启cgroup writeback功能
cgroup v1接口中的cgroup writeback功能默认是关闭的,按照以下步骤开启该功能。
确认memcg和blkcg的映射关系
当您对进程进行Buffered I/O限速之前,您可以使用以下任意一种方式诊断memcg和blkcg的映射关系是否为一对一或多对一。
- 查看memcg与blkcg映射关系。
返回结果示例如下,该示例表示memcg和blkcg符合一对一的映射规则。sudo cat /sys/kernel/debug/bdi/bdi_wb_link
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
- 开启ftrace工具。
验证cgroup writeback是否生效
本示例将模拟出两个产生I/O的进程,用于验证cgroup writeback功能是否有效。
- 由于
dd
命令的反馈速度较快,结果使用iostat
命令查看。 - 由于
dd
命令为顺序写入,顺序IO回刷时,会生成1 MB数据再回刷,因此设置阈值时,blkio.throttle.write_bps_device
不得小于1 MB(1048576)。如果设置值小于1 MB,可能会引发IO hang。