如何从我的池中删除重复数据消除而不耗尽内存?

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

这就是问题所在 – 我在某处读到,我需要“每TB重复数据的x GB内存”(释义)。 我愚蠢地认为,如果我的池中大部分数据不能被重复的话,就不会使用太多的内存。 令我沮丧的是,通过“重复数据”,他似乎意味着池中所有已经启用了重复数据删除的数据。

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

不幸的是,任何时候我试图从旧的数据集中删除一些东西,我的系统上的所有16个线程都会达到100%,所有24 GB的内存突然被填满(我通过htop看到这个),然后我的系统被locking。

有没有什么办法可以把我自己从这个洞中挖出来,而不会破坏我的整个泳池并重新开始?

我实际上只是摸索一下,我自己就明白了这一点。 我的系统在启动时自动挂载ZFS卷。 如果我正常启动我的系统,它会在引导过程中冻结文本“正在运行ZFS数据集的启动作业…”或类似的东西。 如果我在救援模式下启动,它会启动罚款,让我到一个提示,但ZFS会默默地试图将我的数据集挂载在后台,最终在10-15分钟后locking我的机器。 此外,这使我无法对我的游泳池进行任何更改。

我通过禁用systemd任务zfs-mount.service并重新启动进入救援模式来解决这个问题。 现在,我可以select性地装入数据集,并在不locking机器的情况下更改我的池。

我仍然没有解决我的问题。 尽pipe我禁用了重复数据删除function,但是从重复数据集中将所有数据复制到新的数据集中,并删除了旧的数据集,但我仍然拥有巨大的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