本站总访问量 Docker推拉自建仓库比较慢的问题 - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

背景及描述

内网是一个Kubernetes集群,在集群中部署一个自建的私有镜像仓库。启动一个业务Pod,拉取该私有镜像仓库的镜像(该镜像2GB左右,20层,其中有一层是1.73GB),发现该镜像拉取比较慢,需要3分钟左右。

结论

自建私有镜像仓库和业务pod运行在同一个pod,理论上拉取速度会比较快,但是同一时刻存在多个镜像正在被拉取,镜像的拉取过程需要先把镜像下载下来,然后再解压缩该镜像。在这个过程中可能由于节点资源受限而造成拉取镜像慢的现象。
Docker镜像的拉取是并发拉取镜像的每一层,但是对于单独的一层是单线程进行解压缩,Docker使用gzip库进行压缩和解压缩。
在镜像存在一个比较大的层的情况下,解压缩的效率比较慢会导致镜像推送和拉取比较慢。

社区解决方案

一篇比较早的解决方案:

使用pgzip库进行多线程压缩和解压缩,在这个Issue中提到,当使用了pgzip后,带宽利用效率提升3倍,推送时间可至少缩减至1/3。

作者随后提交了PR,将gzip替换为pgzip,但最终这个PR被废弃,被废弃的主要原因有几个:

  • pgzip相比gzip消耗更大,引入gzip会增加更多的依赖,给后续的维护带来更大的不确定性和风险
  • 测试不足,缺乏更多平台和场景下的测试结果
  • gzip仅限一个CPU内核,pgzip会用光所有的CPU资源容易影响其他服务运行,要控制它需要做多余的工作

compress/gzip作者表示,他将会进行压缩优化以加快拉取镜像速度。

评论