容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

13 | 容器磁盘限速:我的容器里磁盘读写为什么不稳定?

解决Buffered I/O限速问题
控制组和子系统
Buffered I/O无法被Cgroups v1的blkio子系统限速
Linux文件I/O模式
限制磁盘I/O性能
参数配置
确认Cgroups v1的blkio无法对Buffered I/O限速
Cgroups v2
Direct I/O和Buffered I/O
Blkio Cgroup
IOPS和吞吐量的概念
多个容器同时写入同一块磁盘导致性能下降
使用fio测试磁盘文件系统读写性能
Cgroups v2解决Buffered I/O限速问题
Cgroups v1的blkio子系统限制磁盘I/O
XFS Quota限制容器文件系统大小
磁盘读写不稳定
思考题
知识详解
场景再现
解决方案
问题
我的容器里磁盘读写为什么不稳定?

该思维导图由 AI 生成,仅供参考

你好,我是程远。今天我们聊一聊磁盘读写不稳定的问题。
上一讲,我给你讲了如何通过 XFS Quota 来限制容器文件系统的大小,这是静态容量大小的一个限制。
你也许会马上想到,磁盘除了容量的划分,还有一个读写性能的问题。
具体来说,就是如果多个容器同时读写节点上的同一块磁盘,那么它们的磁盘读写相互之间影响吗?如果容器之间读写磁盘相互影响,我们有什么办法解决呢?
接下来,我们就带着问题一起学习今天的内容。

场景再现

我们先用这里的代码,运行一下 make image 来做一个带 fio 的容器镜像,fio 在我们之前的课程里提到过,它是用来测试磁盘文件系统读写性能的工具。
有了这个带 fio 的镜像,我们可以用它启动一个容器,在容器中运行 fio,就可以得到只有一个容器读写磁盘时的性能数据。
mkdir -p /tmp/test1
docker stop fio_test1;docker rm fio_test1
docker run --name fio_test1 --volume /tmp/test1:/tmp registery/fio:v1 fio -direct=1 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -name=/tmp/fio_test1.log
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Cgroups中的blkio子系统可以通过限制容器的磁盘I/O性能来解决多个容器之间磁盘读写相互影响的问题。本文详细介绍了如何配置blkio Cgroup的参数,包括磁盘读取IOPS限制、磁盘读取吞吐量限制、磁盘写入IOPS限制和磁盘写入吞吐量限制,并通过实例演示了在容器中限制磁盘吞吐量的效果。此外,文章还介绍了Linux的两种文件I/O模式:Direct I/O和Buffered I/O,以及Cgroup v2相比Cgroup v1的变动,说明了Cgroup v2 io+Memory两个子系统一起使用,可以对buffered I/O控制磁盘写入速率。总之,本文深入浅出地介绍了如何利用Cgroups中的blkio子系统来管理容器的磁盘I/O性能,适合读者快速了解并应用于实际工作中。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • Geek2014
    cgroup v2在buffered IO模式下能限制,是不是可以理解为:写入的1G数据对应的page cache属于该进程,内核同步该部分page cache时产生的IO会被计算在该进程的IO中

    作者回复: @Geek2014, 是这样的。

    2020-12-15
    9
  • Alery
    老师,假如一个容器跨多块磁盘是不是需要拿到每块磁盘的主次设备号都设置一遍iops限制?

    作者回复: 如果一个容器用到多个磁盘(volume),并且都要做io限制,那么都要设置一遍。

    2020-12-22
    3
    3
  • yayiyaya
    吞吐量 = 数据块大小 *IOPS。 如果限制了IOPS, 是不是也可以做到容器的写入磁盘也不会互相干扰了?

    作者回复: iops也是blkio里的限制参数之一。我在例子中用了吞吐量来限制。

    2020-12-21
    2
  • 小羊
    centos8 上的podman 不是 默认cgroup v2了吗?我记得有一次报错查下来就是 v2不支持某个特性导致无法使用某个镜像。可能我搞错了?

    作者回复: CentOS8上缺省用的还是Cgroup V1

    2021-01-03
    1
  • lambda
    现阶段在k8s对磁盘io进行限速可以尝试用device plugin + prestart hook么(仿照nvidia gpu的思路)?只是一个想法,想求证下

    作者回复: 你的想法是让容器独享一个磁盘?这样不用device plugin, 用local volume就可以了。

    2020-12-14
    3
    1
  • 谢哈哈
    cgoups V1下,blkio与buffer io是没什么关系的,一个是DIO模式写入磁盘,一个是通过page cache异步写入磁盘,在cgoups V2下,blkio 在非DIO的模式下包括了buffer io

    作者回复: @谢哈哈 这个是你的总结吗?

    2020-12-18
  • Geek_be1c94
    内容讲的很清楚,但所讲的cgroup blkio更偏向稳定的读写速率,并不能完全解决相互影响的问题吧,比如2个容器的速率限制设置为50,那可能就不一定都能达到50了
    2023-03-20归属地:浙江
  • JianXu
    CY 老师,今天看了这个才知道为什么我们希望去除大数据部门的专用独占硬件资源的工作模式需要cgroup v2。 那现在cgroup v2 在Kubernetes 上成熟度达到你的预期了吗?
    2022-09-05归属地:上海
  • 有识之士
    Step 1/2 : FROM centos:8.1.1911 ---> 470671670cac Step 2/2 : RUN yum install -y fio ---> Running in b64c47e09828 CentOS-8 - AppStream 44 B/s | 38 B 00:00 Failed to download metadata for repo 'AppStream' Error: Failed to download metadata for repo 'AppStream' The command '/bin/sh -c yum install -y fio' returned a non-zero code: 1 make: *** [image] Error 1 Centos8于2021年年底停止了服务, 这个测试demo应该是有问题的,可以同步修改下?
    2022-07-20
    2
  • 罗峰
    发现cpu memory cgroup可以单独设置容器的资源使用量,但是io这个容器是共用一个控制组的配置参数(不知道是否每个容器可以使用不同的io控制组)吗?
    2021-09-11
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部