如何在不耗尽 RAM 的情况下从池中删除重复数据删除?

Hub*_*bro 7 zfs zfsonlinux

我有一台装有 8 个磁盘托架的服务器,里面装满了 3 TB 磁盘。使用 4 个镜像 vdev,每个镜像有 2 个磁盘,这为我提供了 12 TB 的冗余存储。

这是问题所在 - 我在某处读到我需要“每 TB 去重数据需要 x GB 的 RAM”(释义)。我愚蠢地认为这意味着如果我的池包含大部分无法重复数据删除的数据,它就不会使用太多 RAM。令我沮丧的是,“重复数据删除”似乎是指池中已启用重复数据删除的所有数据。

结果是我的系统最近开始锁定,大概是由于 RAM 不足,需要重置。当我意识到我的错误时,我想我可以通过创建一个禁用重复数据删除的新数据集来修复它,将我的所有数据复制到新数据集,然后销毁旧数据集。幸运的是,我只填满了大约 35% 的游泳池。在尝试此之前,我禁用了所有数据集的重复数据删除。

不幸的是,每当我尝试从旧数据集中删除某些内容时,我系统上的所有 16 个线程都会变为 100%,并且所有 24 GB 的内存突然被填满(我看到了这一点htop)然后我的系统锁定。

有什么办法可以在不破坏我的整个游泳池并重新开始的情况下将自己挖出这个洞吗?

Hub*_*bro 5

实际上,我只是摸索着自己解决了这个问题。我的系统在启动时自动挂载 ZFS 卷。如果我正常启动我的系统,它会在启动过程中冻结并显示文本“A start job is running for Mount ZFS datasets...”或类似的内容。如果我以救援模式启动,它会正常启动并让我得到提示,但 ZFS 会默默地尝试在后台挂载我的数据集,最终在 10-15 分钟后锁定我的机器。此外,这使我无法对我的池进行任何更改。

我通过禁用 systemd 任务zfs-mount.service并重新启动进入救援模式来解决这个问题。现在我可以有选择地挂载数据集并对我的池进行更改,而无需锁定机器。

我仍然没有解决我的问题。即使我禁用了重复数据删除,将重复数据集中的所有数据复制到一个新数据集中并删除了旧数据集,我仍然有一个巨大的 DDT:

 重复数据删除:DDT 条目 29022001,磁盘大小为 975,核心大小为 315

存储桶已分配引用
______ ______________________________ ______________________________
refcnt 块 LSIZE PSIZE DSIZE 块 LSIZE PSIZE DSIZE
------ ------ ----- ----- ----- ------ ----- ----- -----
     1 27.7M 2.78T 2.78T 2.78T 27.7M 2.78T 2.78T 2.78T
     2 1.65K 191M 191M 191M 3.30K 382M 382M 383M
     4 71 4.27M 4.27M 4.39M 310 19.4M 19.4M 19.8M
     8 132 16.3M 16.3M 16.3M 1.18K 149M 149M 149M
    16 3 32.5K 32.5K 36K 51 537K 537K 600K
    4K 1 16K 16K 16K 6.61K 106M 106M 106M
  128K 1 128K 128K 128K 146K 18.3G 18.3G 18.3G
 总计 27.7M 2.78T 2.78T 2.78T 27.8M 2.80T 2.80T 2.80T

但是,由于我发现了“内存不足”部分,我认为这个问题已经解决,如果有必要,稍后再发布一个新问题。


快速编辑:我的 DDT 似乎正在缩小,而且速度非常快。也许它会在适当的时候枯萎并消失。我们会看到的。

另一个快速编辑:太棒了!DDT 缩小得越来越快,直到最后命令zpool status -D tank返回dedup: no DDT entries