容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
4429 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
01 | 认识容器:容器的基本操作和实现原理
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
课程目录
已完结/共 31 讲
开篇词 (2讲)
开篇词 | 一个态度两个步骤,成为容器实战高手
01 | 认识容器:容器的基本操作和实现原理
容器进程 (6讲)
02 | 理解进程(1):为什么我在容器中不能kill 1号进程?
03|理解进程(2):为什么我的容器里有这么多僵尸进程?
04 | 理解进程(3):为什么我在容器中的进程被强制杀死了?
05|容器CPU(1):怎么限制容器的CPU使用?
06 | 容器CPU(2):如何正确地拿到容器CPU的开销?
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
容器内存 (3讲)
08 | 容器内存:我的容器为什么被杀了?
09 | Page Cache:为什么我的容器内存使用量总是在临界点?
10 | Swap:容器可以使用Swap空间吗?
容器存储 (4讲)
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
12 | 容器文件Quota:容器为什么把宿主机的磁盘写满了?
13 | 容器磁盘限速:我的容器里磁盘读写为什么不稳定?
14 | 容器中的内存与I/O:容器写文件的延时为什么波动很大?
容器网络 (4讲)
15 | 容器网络:我修改了/proc/sys/net下的参数,为什么在容器中不起效?
16 | 容器网络配置(1):容器网络不通了要怎么调试?
17|容器网络配置(2):容器网络延时要比宿主机上的高吗?
18 | 容器网络配置(3):容器中的网络乱序包怎么这么高?
容器安全 (2讲)
19 | 容器安全(1):我的容器真的需要privileged权限吗?
20 | 容器安全(2):在容器中,我不以root用户来运行程序可以吗?
结束语 (4讲)
结束语 | 跳出舒适区,突破思考的惰性
结课测试|这些容器技术的问题,你都掌握了么?
用户故事 | 莫名:相信坚持的力量,终会厚积薄发
加餐福利 | 课后思考题答案合集
专题加餐 (6讲)
加餐01 | 案例分析:怎么解决海量IPVS规则带来的网络延时抖动问题?
加餐02 | 理解perf:怎么用perf聚焦热点函数?
加餐03 | 理解ftrace(1):怎么应用ftrace查看长延时内核函数?
加餐04 | 理解ftrace(2):怎么理解ftrace背后的技术tracepoint和kprobe?
加餐05 | eBPF:怎么更加深入地查看内核中的函数?
加餐06 | BCC:入门eBPF的前端工具
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册
开通超级会员可免费学习本课程,还可解锁海量内容免费学特权。

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

你好,我是程远。从这一讲开始,我们进入容器存储这个模块。
这一模块我们所讲的内容,都和容器里的文件读写密切相关。因为所有的容器的运行都需要一个容器文件系统,那么我们就从容器文件系统先开始讲起。
那我们还是和以前一样,先来看看我之前碰到了什么问题。
这个问题具体是我们在宿主机上,把 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/1000字
划线
笔记
复制
01 | 认识容器:容器的基本操作和实现原理
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
13 | 容器磁盘限速:我的容器里磁盘读写为什么不稳定?
加餐03 | 理解ftrace(1):怎么应用ftrace查看长延时内核函数?
加餐05 | eBPF:怎么更加深入地查看内核中的函数?
开通超级会员免费畅看本课程
开通会员
该文章仅可免费阅读部分内容,如需阅读完整文章,请开通超级会员或单独购买本课程。
登录 后留言

精选留言(16)

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

    作者回复: 赞!

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

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

    2020-12-10
    7
  • 上邪忘川
    实验过程如下,结果是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
    4
    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
  • Alery
    老师,假如我将一个卷(宿主机上的某个目录)挂在到容器文件系统中的某个目录,我在容器中对这个卷中的数据做读写操作,因为这个挂载路径也是容器文件系统的一部分,性能是不是也是会有影响的?

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

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

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

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

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

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

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

    2020-12-10
    2
    2
  • closer
    请教老师一个关于容器真实的生产问题,我们在fio在openstack做性能测试ioengine labiao 和
    psync 的IOPS 差距巨大。但是在传统kvm架构上面labiao psync的IOPS差不多。导致在openstack上面的容器磁盘读写都很慢。这个确实是openstack的问题引起的吗?底层硬件配置都相同的条件下

    作者回复: @closer
    我没有理解你的测试环境比较,
    我的理解是openstack上应该是运行kvm的VM的,这个和你说的"在传统kvm架构上面", 是什么差别?

    2020-12-09
    1
  • tianfeiyu
    老师,你上面说的:
    “Linux 为了完善 OverlayFS,增加了 OverlayFS 自己的 read/write 函数接口,从而不再直接调用 OverlayFS 后端文件系统(比如 XFS,Ext4)的读写接口”
    OverlayFS 自己的 read/write 函数接口和直接调用后端文件系统的具体有什么区别?我理解OverlayFS本来就是存在于后端文件系统上,OverlayFS自己的 read/write函数接口最终还是要调用后端文件系统的read/write函数接口。
    2021-08-24
  • 🐭
    老师,在容器里修改数据,数据会存在upper dir,重启容器,改目录下数据没有了,这个动作是docker实现的还是overlayfs自身的功能

    作者回复: 是overlayfs的

    2021-08-03
    2
  • Unknown
    那是否容器不建议用ubuntu 20.04 lts?

    作者回复: ubuntu 20.04 挺好。

    2021-04-04
    2
  • Helios
    相同文件名只会保留一个,文件内容不同应该是按照顺序了吧
    2020-12-12
  • 良凯尔
    思考题:在这一讲 OverlayFS 的例子的基础上,建立 2 个 lowerdir 的目录,并且在目录中建立相同文件名的文件,然后一起做一个 overlay mount,看看会发生什么?

    做了 overlay mount之后,只能看到上面那一层lowerdir目录中的同名文件,是这样吗

    作者回复: @良凯尔
    可以动手试试。

    2020-12-09
    2
收起评论
16
返回
顶部