如何从池中删除重复数据删除而不会耗尽 RAM?

如何从池中删除重复数据删除而不会耗尽 RAM?

我有一台服务器,里面有 8 个磁盘托架,每个托架装有 3 TB 磁盘。使用 4 个镜像 vdev,每个镜像 vdev 有 2 个磁盘,这样我就有 12 TB 的冗余存储空间。

问题就在这里 - 我读到过一篇文章,说我需要“每 TB 的重复数据删除需要 x GB 的 RAM”(释义)。我愚蠢地认为这意味着如果我的池中包含的大部分数据都无法删除重复数据,那么它就不会占用太多的 RAM。令我沮丧的是,他所说的“重复数据删除”似乎是指池中启用了重复数据删除的所有数据。

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

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

有什么办法可以让我摆脱这个困境而不用毁掉整个游泳池并重新开始?

答案1

实际上,我通过摸索自己解决了这个问题。我的系统在启动时会自动挂载 ZFS 卷。如果我正常启动系统,它会在启动过程中冻结,并显示“正在运行挂载 ZFS 数据集的启动作业...”或类似内容。如果我以救援模式启动,它会正常启动并提示我,但 ZFS 会在后台默默尝试挂载我的数据集,最终在 10-15 分钟后锁定我的机器。此外,这阻止我对池进行任何更改。

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

但我的问题还没有解决。尽管我已禁用重复数据删除,将所有数据从重复数据删除数据集复制到新数据集并删除旧数据集,但我仍然有一个巨大的 DDT:

dedup:DDT 条目 29022001,磁盘上的大小为 975,核心中的大小为 315

桶 分配 引用
______ ____________________________ ____________________________
refcnt 块 LSIZE PSIZE DSIZE 块 LSIZE PSIZE DSIZE
------ ------ ----- ----- ----- ------ ----- ----- -----
     1 27.7米 2.78吨 2.78吨 2.78吨 27.7米 2.78吨 2.78吨 2.78吨
     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

相关内容