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

11 | 容器文件系统:我在容器中读写文件怎么变慢了?

容器镜像文件的层和OverlayFS的lowerdir
挂载点和目录关系
实现方式
减少冗余的镜像数据在网络上的传输
有效减少磁盘上冗余的镜像数据
内核5.6中的解决方案
内核5.4中的性能问题
使用perf工具查看内核函数调用
容器镜像文件的层和OverlayFS的lowerdir
挂载点和目录关系
实现方式
OverlayFS
UnionFS
需要理解容器的文件系统
建立2个lowerdir的目录并进行overlay mount的实验
容器镜像文件和OverlayFS的关系
UnionFS和OverlayFS的工作原理
减少数据冗余和网络资源占用
解决问题
OverlayFS
容器文件系统
使用fio工具测试发现性能差异
宿主机升级到ubuntu20.04后,容器中文件读写性能下降
思考题
重点总结
知识详解
问题再现
容器文件读写性能问题
容器文件读写性能问题

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

你好,我是程远。从这一讲开始,我们进入容器存储这个模块。
这一模块我们所讲的内容,都和容器里的文件读写密切相关。因为所有的容器的运行都需要一个容器文件系统,那么我们就从容器文件系统先开始讲起。
那我们还是和以前一样,先来看看我之前碰到了什么问题。
这个问题具体是我们在宿主机上,把 Linux 从 ubuntu18.04 升级到 ubuntu20.04 之后发现的。
在我们做了宿主机的升级后,启动了一个容器,在容器里用 fio 这个磁盘性能测试工具,想看一下容器里文件的读写性能。结果我们很惊讶地发现,在 ubuntu 20.04 宿主机上的容器中文件读写的性能只有 ubuntu18.04 宿主机上的 1/8 左右了,那这是怎么回事呢?

问题再现

这里我提醒一下你,因为涉及到两个 Linux 的虚拟机,问题再现这里我为你列出了关键的结果输出截图,不方便操作的同学可以重点看其中的思路。
我们可以先启动一个 ubuntu18.04 的虚拟机,它的 Linux 内核版本是 4.15 的,然后在虚拟机上用命令 docker run -it ubuntu:18.04 bash 启动一个容器,接着在容器里运行 fio 这条命令,看一下在容器中读取文件的性能。
# fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=10G -numjobs=1 -name=./fio.test
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

文章介绍了在升级宿主机操作系统后,容器中文件读写性能下降的问题,并详细讨论了OverlayFS作为一种UnionFS的实现方式。在Ubuntu 20.04上的容器中文件读写性能下降的问题引起了作者的关注,通过对比在不同版本的Ubuntu上运行容器的性能测试,发现在Ubuntu 20.04上的容器中文件读写性能只有Ubuntu 18.04的1/8左右。文章首先解释了容器文件系统的重要性,指出使用UnionFS可以有效减少磁盘上冗余的镜像数据,减少网络传输。然后详细介绍了OverlayFS的基本概念和使用方法,以及容器镜像文件中各层作为OverlayFS的lowerdir的目录,加上一个空的upperdir一起挂载后,就组成了容器的文件系统。文章还分析了在内核5.4中对异步I/O操作的缺失,以及在Linux内核5.6版本中通过补丁解决了这个问题。总的来说,本文深入浅出地介绍了容器文件系统和性能问题,适合技术人员快速了解容器文件系统和性能问题。

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

全部留言(19)

  • 最新
  • 精选
  • 谢哈哈
    经过实验确认,只会在merge即联合挂载点里生成一个文件名,也就是说overlay文件系统为了省存储空间是做了同名文件合并优化的

    作者回复: 赞!

    2020-12-09
    2
    13
  • Geek3340
    老师提到的aufs,是完全被废弃吗?aufs的废弃是指在内核层的废弃吗?之前安装docker时,时可以配置使用aufs 还是overlay2,也就是说内核层还未完全去除对aufs的支持吗?

    作者回复: aufs的代码从来就没有进入Linux内核的主干。

    2020-12-10
    10
  • 上邪忘川
    实验过程如下,结果是lower1目录中的文件覆盖了lower2中同名的文件。 [root@localhost ~]# cat overlay.sh #!/bin/bash umount ./merged rm upper lower1 lower2 merged work -r mkdir upper lower1 lower2 merged work echo "I'm from lower1!" > lower1/in_lower.txt echo "I'm from lower2!" > lower2/in_lower.txt echo "I'm from upper!" > upper/in_upper.txt # `in_both` is in both directories echo "I'm from lower1!" > lower1/in_both.txt echo "I'm from lower2!" > lower2/in_both.txt echo "I'm from upper!" > upper/in_both.txt sudo mount -t overlay overlay \ -o lowerdir=./lower1:./lower2,upperdir=./upper,workdir=./work \ ./merged [root@localhost ~]# sh overlay.sh [root@localhost ~]# cat merged/in_lower.txt I'm from lower1!

    作者回复: @上邪忘川 很好的测试步骤。我再问一个问题,“merged/in_lower.txt ”里的值有可能是"I'm from lower2!"吗?

    2020-12-10
    5
    4
  • Alery
    老师,假如我将一个卷(宿主机上的某个目录)挂在到容器文件系统中的某个目录,我在容器中对这个卷中的数据做读写操作,因为这个挂载路径也是容器文件系统的一部分,性能是不是也是会有影响的?

    作者回复: 如果以volume的方式挂载到容器中,那么它就不是以overlayfs的文件系统。 性能是否影响要看volume目录的位置在哪个物理磁盘上,和它共享物理磁盘的有哪些读写进程。

    2020-12-13
    3
  • 美美
    想和老师探讨一个非技术问题,老师对当前k8s和docker的相爱相杀有什么看法?老师觉得未来docker市场会被podman取代吗?如果会的话,这个过程大概要多久

    作者回复: 容器云平台里,k8s肯定是主流,用了k8s, 基本就不需要要docker了,启动容器的程序肯定是越简单越好。 我们在2019年初就不用docker了。

    2020-12-10
    2
    3
  • 流浪地球
    和老师探讨一个问题,本文中描述的现象,一个重要的原因是容器镜像里只有rootfs,没有linux内核,宿主机上的所有容器是共用宿主机内核的。所以,当宿主机内核版本升级后,容器镜像并没有相应的升级,也会产生这个问题,文中并没有对这个知识要点说明。不知道我的理解是否正确

    作者回复: @流浪地球 容器镜像中只有rootfs没有Linux内核是对的。 在文章里,宿主机内核升级后,无论容器的镜像是否升级,都会有这个问题。文中的问题是overlayfs引起的,和镜像中的文件没有关系。

    2020-12-09
    3
    3
  • 姜姜
    思考题: 我认为在多个lower之间出现同名文件,在merge中也是上层lower覆盖下层lower。 个人理解: “merge层”相当于提供给用户进行交互的视图层; “upper层”相当于存储实际发生变动的地方; “lower层”是不变的,用户通过merge层视图对lower层文件的所有操作,都被重定向到“upper层”了,特殊的是删除操作,会在upper层生成一个特殊的c类型的文件来代表该文件被删。 用户交互时只能对merge层的视图来操作。 在merge层的视图中,上层覆盖下层同名文件,上下关系不只是upper和lower之间,即便在多个lower层中,也是上层覆盖下层。 以上观点纯属我的猜测,因为还没来得及验证,如果有误请帮忙指出

    作者回复: @姜姜 可以用文档中的脚本稍微修改一下,就可以验证了

    2020-12-17
    2
  • 水蒸蛋
    老师,我没想通容器既然有内核文件为什么会依赖宿主机的内核,如果依赖宿主机内核那还要容器的内核干什么呢,这么多不同的linux版本难道内核版本都是一样的?

    作者回复: @水蒸蛋 容器和宿主机是共享内核的。不通的Linux版本内核不一样。

    2020-12-16
    2
  • 杨莉锋
    centos 7.3 容器节点tmpfs文件类型与 Overlayfs文件类型的区别

    作者回复: tmpfs只是用来存放一些临时文件的内存文件系统,比如/tmp目录可以使用tmpfs。

    2021-01-06
    1
  • Geek_c2089d
    老师,我想请教一个问题,就是已经创建的容器,怎么能新增一个挂载目录!

    作者回复: 容器不像虚拟机,不能动态的挂载volume.

    2020-12-25
    3
    1
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部