作者:她的马尔代夫 | 来源:互联网 | 2023-05-17 14:09
AUFS与DeviceMapper我们经常会听到说,在CentOS上运行docker与在Ubuntu上运行性能要差许多,甚至连启动都会更慢。这也是为什么在当前绝大多数的生产环境中,docker都被运行
AUFS与DeviceMapper
我们经常会听到说,在CentOS上运行docker与在Ubuntu上运行性能要差许多,甚至连启动都会更慢。这也是为什么在当前绝大多数的生产环境中,docker都被运行在ubuntu上而非centos上的原因。这是为什么呢?
简单来说,这就是DeviceMapper与AUFS的差别。在CentOS上,docker的默认存储驱动为DeviceMapper,而Ubuntu上,则使用的AUFS:
* AUFS是基于file-level的存储驱动,即所有的容器都直接使用的了宿主机的文件系统,所以可以获得与宿主机文件系统一样的性能;AUFS的缺点表现在应用第一次写上层docker image layer的文件会有延迟,而且延迟随文件的增大,layer的层数增多而变大
* DeviceMapper是基于block-level的存储驱动,可以理解为每个容器都有自己的文件系统,在block这一层做数据共享。DeviceMapper存储驱动进一步又分为loop-lvm与direct-lvm两种方式,前一种可以理解为LiveCD或者虚拟vmware镜像加载系统,后一种理解为原生磁盘加载系统,所以direct-lvm是docker官方推荐的生产环境配置,而loop-lvm又是centos环境下安装docker的默认配置,这也是刚接触docker的新人吐槽devicemapper不给力的主要原因。DeviceMapper的性能缺点表现在docker daemon启动慢,docker容器启动也相对较慢,频繁的小文件写入会有性能问题。DeviceMapper这些缺点中影响最大的是容器启动较慢的问题,但在配置了direct-lvm+volumn的情况下,创建并销毁1000个apache容器,也只需要900s。所以docker官方建议在生产环境使用DeviceMapper的direct-lvm模式,并且对于频繁读写的目录,建议挂载到数据盘。
其实从上面的说明我们不难看出,无论是DeviceMapper还是AUFS,亦或者其他的存储驱动,它们影响docker性能的前提是应用在频繁的读写容器里面的文件系统。也就是说一个一劳永逸的方式就是将数据盘挂载出来即可。
DeviceMapper的direct-lvm配置
从上面的分析,我们知道,在centos下运行docker,主要的性能缺陷表现在使用了DeviceMapper的loop-lvm存储驱动。如果在生产环境中,我们仍然使用centos的话,需要配置DeviceMapper的direct-lvm存储驱动。
详细的配置方法如下:
https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/