Docker存储驱动device-mapper与voerlay2性能对比
第3章 overlya2特性使用说明(对比overlay驱动)
1. 文档目的
当前公司集群所用docker存储驱动为devicemapper,为了优化性能目前有打算切换驱动为社区所使用的overlay2,本文针对二者进行了性能对比测试。
2. 测试说明
2.1 测试环境
1)测试工具Iozone说明
Iozone主要用来测试操作系统中文件系统性能的测试工具,使用iozone可以在多线程、多cpu,并指定cpu cache空间大小以及同步或异步I/O读写模式的情况下进行测试文件操作性能;
Iozone提供测试功能全面,本次只对文件系统的读写、重复读写和随机读写能力做了测试
2)测试场景说明
目前集群linux内核版本为3.10,而overlay2从linux内核3.18起并入内核,为了测试数据的准确性,测试采取在3.10和4.19两种内核下分别对2种驱动做测试。3.10版本只做了单线程测试,4.19做了多线程测试。
其中在测试devicemapper驱动时,采用direct-lvm模式,该模式为官方推荐模式,性能较高,当前集群采用的正式该模式,不需要改动配置;
在测试overlay2驱动时,需要把devicemapper驱动改为overlay2驱动。
修改/etc/docker/daemon.json如下重启docker即可
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"]
}
重启完成后可以通过docker info 查看Storage Driver: overlay2确认配置是否生效
2.2 linux内核3.10测试
测试1: 内核3.10单线程测试devicemapper 消除linux缓存对测试数据的影响
说明: 在iozone安装目录中执行如上命令,可生成单线程devicemapper的性能测试
参数说明:
-a:全面测试,输出细节数据
-n:测试文件的最小大小 单位可指定kb、m、g等
-g:测试文件的最大大小 单位同上
-i:可选指令,0=write/rewrite,1=read/re-read,2=random-read/write
-r:指定每次读取的数据块大小,一般为2的幂指数 该数据会影响读取速率,本测试经过对比后统一使用64kb 不指定时会从2开始枚举2的幂指数
-f:指定要测试的文件(要测试哪块设备,便在该设备下提前创建改文件,测试完会自动删除,本测试中不需指定)
-I:对所有文件操作使用VxFS VX_DIRECT 。告诉VXFS 文件系统所有对文件的操作将跨过缓存直接在磁盘上进行。
-p:同上,清除缓存影响
-R:输出结果为Excel格式
-b:指定文件名
Ps:linux缓存的测试结果影响较大,解决方式有:1.指定测试文件的大小为linux内存的2倍;2.执行命令时指定-Ip参数,可以清除缓存
生成的excel部分内容如下:
测试2: 内核3.10单线程测试overlay2 消除linux缓存对测试数据的影响
说明: 命令同上。不会上传excel,对比文件就不放了。
2.3 linux内核4.19测试
测试1: 单线程 读取块为64kb 测试devicemapper生成对应excel
说明:命令同上
测试2: 单线程 读取块为64kb测试overlay2 生成excel
说明:同上
测试3: 线程数17 读取块为64kb 测试devicemapper生成excel
测试4: 线程数17 读取块为64kb 测试overlay2生成excel
3. overlya2特性使用说明(对比overlay驱动)
3.1 验证在centos kernel 3.10开启overlay2驱动特性
说明:配置完成overlay2驱动后,要保证d_type是支持的,不然不会使用overlay特性
3.2 查看overlay2驱动文件系统层级结构
说明:拉取nginx镜像,查看overlays2文件保存情况
说明:l目录下包含了很多软连接,通过应用短名指向镜像层,避免在挂载的时候,超过名字长度限制
说明:查看最下层目录,包含diff目录和link文件,其中diff目录包含了镜像的内容,link文件里是该层应用的短名称。
说明:倒数第二层的目录
说明:更上层的目录结构
通过mount查看挂载目录结构:
说明:从lowerdir中的分层结构可以看出,overlay2驱动原生所支持的多层lower OverlayFs特性生效(最多128层,每层之间用 : 分割)
Overlay特性:overlay驱动只工作在一个lower OverlayFS层之上,因此需要硬链接来实现多层镜像,过多的硬链接会消耗较大inode,这是overlay性能不如overlay2的关键原因之一。
通过mount查看overlay的挂载目录结构:
说明:overlay只会有一层挂载目录,通过硬链接指向不同的镜像层。
总结
测试文件大小限制在8m-4g,从测试数据对比结果来看,devicemapper驱动在第一次对文件读写时性能稍微优越于overlay2,但是对已有文件的重复读写来看,overlay2性能优越于devicemapper,对于随机读写来说,overlay2性能优越于devicemapper。
由于devicemapper是基于block复制,并且每次修改数据时,都会进行复制,这会造成磁盘空间和内存的浪非甚至会出现磁盘和内存溢出等问题,对于overlay2驱动来说,只在第一次修改的时候复制文件,后续更在都在该文件上进行。自从Docker1.12起,Docker也支持overlay2存储驱动,目前社区更推荐使用overlay2。
通过对overlay2和overlay存储结构的对比,可以看出overlay2在centos kernel3.10上是支持的,overlay2所支持的多层lowerdir特性也被支持。