Docker五种存储驱动原理及应用场景和性能测试对比

  • 时间:
  • 浏览:2
  • 来源:大发彩神app—大发彩神8苹果版

用九时配(allocate-on-demand)

ZFS

Overlay是文件级存储,Device mapper是块级存储,当文件很糙大而修改的内容很小,Overlay不管修改的内容大小总要克隆好友整个文件,对大文件进行修改显示要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只克隆好友前要修改的块,不而且整个文件,在你这名场景下,显然device mapper要快一点。将会块级的是直接访问逻辑盘,适合IO密集的场景。而对于应用系统进程内部比较复杂,大并发但少IO的场景,Overlay的性能相对要强一点。

一、原理说明

Random Read:测试读一个多多文件中的随机偏移量的性能。

ZFS 文件系统是一个多多革命性的全新的文件系统,它从根本上改变了文件系统的管理方式,ZFS 完整版失去了“卷管理”,不再创建虚拟的卷,全都把所有设备集中到一个多多存储池中来进行管理,用“存储池”的概念来管理物理存储空间。过去,文件系统就有构建在物理设备之上的。为了管理哪此物理设备,并为数据提供冗余,“卷管理”的概念提供了一个多多单设备的映像。而ZFS创建在虚拟的,被称为“zpools”的存储池之上。每个存储池由若干虚拟设备(virtual devices,vdevs)组成。哪此虚拟设备可不前而是原始磁盘,也将会是一个多多RAID1镜像设备,或是非标准RAID等级的多磁盘组。于是zpool上的文件系统可不前要使用哪此虚拟设备的总存储容量。

我你会设置存储驱动,可不前要在dockerd启动的而是加入--storage-driver=,如dockerd --storage-driver=devicemapper &

Read:

Device mapper和Btrfs就有直接对块操作,就有支持共享存储,表示当有多个容器读同一个多多文件时,前要生活多个复本,全都你这名存储驱动不适合在高密度容器的PaaS平台上使用。而且在全都容器启停的状态下将会会意味磁盘溢出,造成主机不到工作。Device mapper不建议在生产使用。Btrfs在docker build可不前要很高效。

Device mapper是Linux内核2.6.9后支持的,提供的并就有从逻辑设备到物理设备的映射框架机制,在该机制下,用户可不前要很方便的根据此人 的前要制定实现存储资源的管理策略。前面讲的AUFS和OverlayFS就有文件级存储,而Device mapper是块级存储,所有的操作就有直接对块进行操作,而就有文件。Device mapper驱动会先在块设备上创建一个多多资源池,而且在资源池上创建一个多多暗含文件系统的基本设备,所有镜像就有你这名基本设备的快照,而容器则是镜像的快照。全都在容器里看了文件系统是资源池上基本设备的文件系统的快照,越多有为容器分配空间。当要写入一个多多新文件时,在容器的镜像内为其分配新的块并写入数据,你这名叫用九时配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据克隆好友到在容器快照中新的块里再进行修改。Device mapper 驱动默认会创建一个多多1000G的文件暗含镜像和容器。每一个多多容器被限制在10G大小的卷内,可不前要此人 配置调整。型态如下图所示:

Docker最而是刚结束了了采用AUFS作为文件系统,也得益于AUFS分层的概念,实现了多个Container可不前要共享同一个多多image。但将会AUFS未并入Linux内核,且只支持Ubuntu,考虑到兼容性问题图片,在Docker 0.7版本中引入了存储驱动, 目前,Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS并就有存储驱动。就如Docker官网上说的,没办法 单一的驱动适合所有的应用场景,要根据不同的场景选取为宜的存储驱动,无需 有效的提高Docker的性能。怎么才能 才能 选取适合的存储驱动,要先了解存储驱动原理无需 更好的判断,本文介绍一下Docker并就有存储驱动原理详解及应用场景及IO性能测试的对比。在讲原理前,先讲一下写时克隆好友和写九时配一个多多技术。

    ZFS整体的读写性能相比一点的存储驱动就有差一点。 简单的测试了一点数据,对测试出来的数据原理还前要进一步的解析。

测试方式:基于不同的存储驱动启动容器,在容器内安装IOzone,执行命令:

Write:测试向一个多多新文件写入的性能。

Random Write:测试写一个多多文件中的随机偏移量的性能。

AUFS和Overlay就有联合文件系统,但AUFS有多层,而Overlay不到两层,全都在做写时克隆好友操作时,将会文件比较大且处于比较低的层,则AUSF将会会慢一点。而且Overlay并入了linux kernel mainline,AUFS没办法 ,全都将会会比AUFS快。但Overlay还太年轻,要谨慎在生产使用。而AUFS做为docker的第一个多多存储驱动,将会有很长的历史,比较的稳定,且在絮状的生产中实践过,有较强的社区支持。目前开源的DC/OS指定使用Overlay。

测试工具:IOzone(是一个多多文件系统的benchmark工具,可不前要测试不同的操作系统中文件系统的读写性能)

三、IO性能对比

AUFS VS Overlay

Device mapper VS Btrfs Driver VS ZFS

当要写一个多多新文件时,使用按需分配,一个多多新的数据快从zpool里生成,新的数据写入你这名块,而你这名新空间存于容器(ZFS的克隆好友)里。

通过以上的性能数据可不前要看了:

Overlay

AUFS

下面看一下在Docker里ZFS的使用。首先从zpool里分配一个多多ZFS文件系统给镜像的基础层,而一点镜像层则是你这名ZFS文件系统快照的克隆好友,快照是只读的,而克隆好友是可写的,当容器启动时则在镜像的最顶层生成一个多多可写层。如下图所示:

Device mapper

可不前要通过docker info命令来查看当前daemon使用着哪种存储驱动。

ZFS最初是为拥有絮状内存的Salaris服务器设计的,所在在使用时对内存会有影响,适合内存大的环境。ZFS的COW使碎片化问题图片更加严重,对于顺序写生成的大文件,将会而是随机的对其中的一次要进行了更改,没办法 你这名文件在硬盘上的物理地址就变得不再连续,未来的顺序读会变得性能比较差。ZFS支持多个容器共享一个多多缓存块,适合PaaS和高密度的用户场景。

Overlay vs Overlay2

本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/2073824,如需转载请自行联系原作者

Btrfs被称为下一代写时克隆好友文件系统,并入Linux内核,也是文件级级存储,但可不前要像Device mapper总爱接操作底层设备。Btrfs把文件系统的一次要配置为一个多多完整版的子文件系统,称之为subvolume 。没办法 采用 subvolume,一个多多大的文件系统可不前要被划分为多个子文件系统,哪此子文件系统共享底层的设备空间,在前要磁盘空间时便从底层设备中分配,相似应用应用系统进程调用 malloc()分配内存一样。为了灵活利用设备空间,Btrfs 将磁盘空间划分为多个chunk 。每个chunk可不前要使用不同的磁盘空间分配策略。比如一点chunk只存放metadata,一点chunk只存放数据。你这名模型有全都优点,比如Btrfs支持动态加在设备。用户在系统中增加新的磁盘而是,可不前要使用Btrfs的命令将该设备加在到文件系统中。Btrfs把一个多多大的文件系统当成一个多多资源池,配置成多个完整版的子文件系统,还可不前要往资源池里加新的子文件系统,而基础镜像则是子文件系统的快照,每个子镜像和容器就有此人 的快照,哪此快照则就有subvolume的快照。

Random Write:

loop-lvm和direct-lvm的最大不同是创建DM thin pool的不再是通过losetup挂载的一个多多稀疏文件,全都一个多多裸的真正的块设备。direct lvm的读写性能表现更加稳定。

二、存储驱动的对比及适应场景

  OverlayFS有并就有存储驱动,它们使用了相同的OverlayFS技术,但却有着不同的实现,在磁盘使用上全前要互相兼容。将会不兼容,两者之间的切换前要重新创建所有的镜像。overlay驱动是最原始的OverlayFS实现,而且,在Docker1.11而是是仅有的OverlayFS驱动选取。overlay驱动在inode消耗方面有着较明显的限制,而且会损耗一定的性能。overlay2驱动处里了你这名限制,不过不到在Linux kernel 4.0以上使用它。

所有驱动都用到的技术——写时克隆好友(CoW)。CoW全都copy-on-write,表示只在前要写时才去克隆好友,你这名是针对已有文件的修改场景。比如基于一个多多image启动多个Container,将会为每个Container都去分配一个多多image一样的文件系统,没办法 将会占用絮状的磁盘空间。而CoW技术可不前要让所有的容器共享image的文件系统,所有数据都从image中读取,不到当要对文件进行写操作时,才从image里把要写的文件克隆好友到此人 的文件系统进行修改。全都无论有有哪几个个容器共享同一个多多image,所做的写操作就有对从image中克隆好友到此人 的文件系统中的复本上进行,越多会修改image的源文件,且多个容器操作同一个多多文件,会在每个容器的文件系统里生成一个多多复本,每个容器修改的就有此人 的复本,相互隔离,相互不影响。使用CoW可不前要有效的提高磁盘的利用率。

当写入一个多多新文件时,为在容器的快照里为其分配一个多多新的数据块,文件写在你这名空间里,你这名叫用九时配。而当要修改已有文件时,使用CoW克隆好友分配一个多多新的原始数据和快照,在你这名新分配的空间变更数据,变而是结束了了再更新相关的数据型态指向新子文件系统和快照,没办法 的原始数据和快照没办法 指针指向,被覆盖。

devicemapper默认会在/var/lib/docker/devicemapper/devicemapper目录下生成data和metadata一个多多稀疏文件,并将一个多多文件挂为loop设备作为块设备来使用。

Re-Read:

    btrfs在512M以上的文件读写性能都非常好,但在512M以下的文件读写性能相比一点的存储驱动都比较差。

Re-write:测试向一个多多已处于的文件写入的性能。

Overlay VS Device mapper

Btrfs

Write:

Overlay是Linux内核3.18后支持的,也是并就有Union FS,和AUFS的多层不同的是Overlay不到两层:一个多多upper文件系统和一个多多lower文件系统,分别代表Docker的镜像层和容器层。当前要修改一个多多文件时,使用CoW将文件从只读的lower克隆好友到可写的upper进行修改,结果也保处于upper层。在Docker中,上端的只读层全都image,可写层全都Container。型态如下图所示:

写时克隆好友(CoW)

Re-write:

Re-Read:测试读一个多多最近读过的文件的性能。

Read:测试读一个多多已处于的文件的性能。

    AUFS在读的方面性能相比Overlay要差一点,但在写的方面性能比Overlay要好。

测试场景:从4K到1G文件的顺序和随机IO性能

./iozone -a -n 4k -g 1g -i 0 -i 1 -i 2 -f /root/test.rar -Rb ./iozone.xls

AUFS(AnotherUnionFS)是并就有Union FS,是文件级的存储驱动。AUFS能透明覆盖一或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说全都支持将不同目录挂载到同一个多多虚拟文件系统下的文件系统。你这名文件系统可不前要一层一层地叠加修改文件。无论上端有有哪几个层就有只读的,不到最上层的文件系统是可写的。当前要修改一个多多文件时,AUFS创建该文件的一个多多副本,使用CoW将文件从只读层克隆好友到可写层进行修改,结果也保处于可写层。在Docker中,上端的只读层全都image,可写层全都Container。型态如下图所示:

而写九时配是用在没办法 没办法 你这名文件的场景,不到在要新写入一个多多文件时才分配空间,没办法 可不前要提高存储资源的利用率。比如启动一个多多容器,越多会为你这名容器预分配一点磁盘空间,全都当有新文件写入时,才按需分配新空间。

测试项的定义和解释

devicemapper是Red Hat Enterprise Linux下Docker Engine的默认存储驱动,它有并就有配置模式:loop-lvm和direct-lvm,loop-lvm是默认的模式,但将会是在生产环境的部署Docker,官方不推荐使用该模式。direct-lvm是Docker推荐的生产环境的推荐模式,他使用块设备来构建精简池来存放镜像和容器的数据。

测试数据对比

Random Read:

    device mapper在512M以上文件的读写性能都非常的差,但在512M以下的文件读写性能都比较好。

当要修改一个多多已处于的文件时,使用写时克隆好友,分配一个多多新空间并把原始数据克隆好友到新空间完成修改。