Zfs: 由于 ZFS 上缺少 renameat2/overlayfs,Docker 构建性能极其缓慢

创建于 2019-04-20  ·  4评论  ·  资料来源: openzfs/zfs

系统信息


类型 | 版本/名称
--- | ---
分布名称 | 任何
发行版 | 任何
Linux 内核 | 任何
建筑 | 任何
ZFS 版本 | 任何
声压级版本 | 任何

描述你观察到的问题

这更像是一个功能请求而不是一个错误。 我找不到任何人积极跟踪这个问题,但是我知道 docker 的用户在声明 ZFS 有问题之后已经停止使用 ZFS,这很不幸。

在 zfs 数据集上使用 docker 时,唯一的选择是 docker 的“zfs 驱动程序”,它使用 zfs 数据集操作来创建分层文件系统。 在 ext4 和 btrfs 等其他文件系统上,可以使用“overlay2 驱动程序”(利用内核的 overlayfs 模块),速度非常快。 Docker 构建时间可以从 ext4/overlay2 上的几分之一秒到 zfs/zfs 上的几分钟。

overlay2 驱动程序选择当前被 docker 在 zfs 上列入黑名单:
https://github.com/moby/moby/blob/master/daemon/graphdriver/overlay2/overlay.go#L165

请注意,btrfs 在内核 4.7 中添加了必要的支持:
https://github.com/moby/moby/blob/master/daemon/graphdriver/overlay2/overlay.go#L169

描述如何重现问题

从性能的角度来看:
构建具有多个层的 Dockerfile 的时间如下:

time docker build . -t date_image

```Dockerfile

date_image Dockerfile

从头开始
CMD [日期]
CMD [日期]
CMD [日期]
CMD [日期]
CMD [日期]

重复日期层以放大性能下降

From a functional perspective:
```c
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <linux/fs.h>
#include <sys/syscall.h>

int main()
{
  int ret;

  ret = syscall(SYS_renameat2, 0, "/zfs/file1", 0, "/zfs/file2", RENAME_EXCHANGE);
  fprintf(stderr, "renameat2 ret=%d errno=%d\n", ret, errno);
  return ret;
}

对 RENAME_WHITEOUT 标志也重复测试。

我相信在 renameat2() 中实现了 RENAME_EXCHANGE 和 RENAME_WHITEOUT 之后,我们应该能够在 ZFS 上使用 docker w/overlay2

Feature

最有用的评论

是的,我终于开始为 ZFS 回滚编写测试了,在 #9600 中需要……至少给我几天的时间来制作原型 :)

所有4条评论

我一直在研究这个, renameat2(2)标志支持不足以让 overlayfs-on-ZFS 工作。 主要的障碍是当前 ZFS 使用d_revalidate ,这意味着 overlayfs 拒绝将其用作上层目录。 为了修复它(除了#8667),我们需要重新编写大量移植的dcache -interacting 代码,以便不再需要d_revalidate

此问题已被自动标记为“陈旧”,因为它已经有一段时间没有任何活动了。 如果没有进一步的活动,它将在 90 天内关闭。 感谢你的贡献。

太糟糕了 stalebot 没有完成相关工作 - 似乎@snajpa即将完成。

是的,我终于开始为 ZFS 回滚编写测试了,在 #9600 中需要……至少给我几天的时间来制作原型 :)

此页面是否有帮助?
0 / 5 - 0 等级