docker build
在我称之为标准设置环境中,速度非常慢。环境如下:
- 虚拟机
- docker CE 18.09.0,git commit 4d60db4 在 linux amd64(Ubuntu 16.04.5 LTS)上运行
- 支持文件系统为 ext4
- 存储驱动程序是 overlay2
- 该机器有 4 GB 的 RAM、2 个 vCPU(Xeon E7-8880 v4)
我所做的是运行以下 Dockerfile
FROM ubuntu:18.04
ARG uid=1000
ARG gid=1000
RUN echo "${gid} ${uid}"
# Some further ENV stuff
RUN DEBIAN_FRONTEND=noninteractive && \
apt-get update && apt-get -y install -y tzdata && \
ln -fs /usr/share/zoneinfo/UTC /etc/localtime && \
dpkg-reconfigure --frontend noninteractive tzdata && \
apt-get -y install -y apt-transport-https ca-certificates \
wget curl unzip vim git less mc jed \
python python-openstackclient && \
apt-get -q autoremove && \
apt-get -q clean -y && \
rm -f /var/lib/apt/lists/*
# There are further RUN commands below, but they don't matter
然后我通过调用来构建docker镜像
$ docker build -t test:latest .
显然,安装 python(和其他东西)将在构建容器/镜像上创建大量小文件。然而,实际发生的情况如下:
- FROM/ARGs 和第一个 RUN 命令顺利通过(正如预期的那样)
- 点击第二个 RUN 命令,预计这会花费一点时间,因为我们通过包管理器安装了相当多的应用程序。apt 和所有工具大约需要两分钟才能完成(我完全可以接受这个运行时间)。
在将最后一行写入控制台后
0 upgraded, 0 newly installed, 0 to remove and 14 not upgraded
系统需要很长时间才能完成。我已经让它运行了 4 个多小时,但下一层(下一个 RUN)命令尚未到达。
在该状态下,检查系统负载,您会看到整个系统处于空闲状态(loadavg < 0.1)。有超过 1GB 的可用 RAM。偶尔您会看到dockerd
短暂地执行某些操作,但 CPU 负载 <2%。此外,检查 IO 负载(使用iotop
)我看到Total DISK READ
和Total DISK WRITE
都在 30 K/s 左右(这不算什么)。已知备份文件系统下的底层磁盘是 SSD(因此,我们可以安全地假设 80+ MB/s 的 I/O 吞吐量应该是可能的)。此外,如果我手动测试读取和测试写入 /var/lib/docker(备份文件系统的挂载位置),我会得到 200+ MB/s 的写入速度。备份文件系统仍有超过 10 GB 的可用空间。
另外检查ps auxw | grep docker
我发现docker build处于阻塞状态并且子进程
docker-untar /var/lib/docker/overlay2/0475df....07/diff
正在运行,但处于“停止”状态。总的来说,经过 2 多个小时的挂钟时间,到目前为止,此过程消耗的 CPU 时间不到 2 秒。查看上面 docker-untar 提到的 diff 目录,制作几个快照du -sh .
,我可以看到该目录中的数据量增加非常缓慢(速率约为 1 MB / 3 分钟,大约为 5.5 kb/s - 即使是古老的软盘也比这更快!)。在撰写本文时,其中有 103 MB。Afind . | wc -l
导致值为 5157,同样仅以非常缓慢的速度增长(在生成 1 MB 数据的 3 分钟内已写入 162 个文件)。
在同一台机器上运行容器并读取/写入容器的附加图像没有问题。
我还可以访问非常相似的虚拟机(甚至具有更多的 CPU/RAM)。但是,在那里,也可以观察到相同的图像。
有谁知道这里可能配置错误,导致docker没有使用机器的可用CPU和I/O容量?
答案1
只是为了完整性:经过无数个小时的调试,结果发现服务器上使用的 McAfee 病毒扫描程序存在资源泄漏,这导致其整体运行速度变慢。我一开始没有注意到这一点,因为服务器上没有运行其他 I/O 密集型操作。我采用的解决方法是每晚“定时”重新启动病毒扫描程序。从那时起,这个问题再也没有出现过。