ZFS系列补充(四)数据去重的真实代价


这篇文章其实应该放在系统管理的“预算和计划”部分。在规划ZFS存储池时,您需要决定空间效率以及构建它所需的成本。我们多次听说ZFS块数据去重非常昂贵,我甚至在本博客上提到过,但它到底有多昂贵呢?我们要花多少钱?这就是这篇文章的内容。我们将从两个角度来看待它——企业硬件和商用硬件。在调查之后,我们应该能得出一些像样的结论。

本文提到的成本只是存储的成本而不是总的成本,总成本将包括网线,主板,CPU等等,这些成本变化范围大,这可能会使本文变得相当复杂。所以,让我们从基础开始。我们将把企业硬件定义为15K SAS驱动器和MLC SSD,我们将把商品硬件定义为7200 SATA驱动器和MLC SSD。在这两种情况下,我们将坚持使用高质量的ECC DDR3 RAM模块,并使用10TB的基础ZFS池。

那么,闲话少说,我们开始吧。

确定硬盘需求

在我们开始购买硬件之前,我们需要知道我们在寻找什么数据去重技术,以及它是否适合我们的数据需求。因为还没有实际将所有数据存储在池中,所以这可能是一个难以解决的难题。不过本文将给出关于这个解决方案的想法(“三个S测试”):

  1. Sample test(抽样测试):获取具有代表性的数据样本,不需要太多,也许是整个数据的1/5。只是表示实际要存储的东西。这将是最准确的测试,只要你得到一个好的样品-越多越好。将这些数据样本存储在具有数据去重的池中,并查看最终的数据去重率是多少。
  2. Simulation test(模拟测试):这不如上面的抽样测试准确,但它仍然可以提供一个很好的想法,您将看到什么。运行“zfs -S”命令,看看输出的结果。这将花费一些时间,可能会给您的池带来压力,所以如果您必须在生产池上执行此命令,请在空闲时间运行该命令。它不会真的做数据去重,只是模拟它。以下是我个人ZFS产品服务器的实际模拟直方图:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # zdb -S
    Simulated DDT histogram:

    bucket allocated referenced
    ______ ______________________________ ______________________________
    refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
    ------ ------ ----- ----- ----- ------ ----- ----- -----
    1 5.23M 629G 484G 486G 5.23M 629G 484G 486G
    2 860K 97.4G 86.3G 86.6G 1.85M 215G 190G 190G
    4 47.6K 4.18G 3.03G 3.05G 227K 19.7G 14.2G 14.3G
    8 11.8K 931M 496M 504M 109K 8.49G 4.25G 4.33G
    16 3.89K 306M 64.3M 68.3M 81.8K 6.64G 1.29G 1.37G
    32 5.85K 499M 116M 122M 238K 17.9G 4.64G 4.86G
    64 1.28K 43.7M 20.0M 21.0M 115K 3.74G 1.69G 1.79G
    128 2.60K 50.2M 20.0M 22.0M 501K 9.22G 3.62G 3.99G
    256 526 6.61M 3.18M 3.62M 163K 1.94G 946M 1.06G
    512 265 3.25M 2.02M 2.19M 203K 2.67G 1.72G 1.86G
    1K 134 1.41M 628K 720K 185K 2.13G 912M 1.02G
    2K 75 1.16M 188K 244K 222K 3.37G 550M 716M
    4K 51 127K 85.5K 125K 254K 657M 450M 650M
    8K 2 1K 1K 2.46K 26.7K 13.3M 13.3M 32.8M
    16K 1 512 512 1.94K 31.3K 15.6M 15.6M 60.7M
    Total 6.15M 732G 574G 576G 9.38M 920G 708G 712G

    dedup = 1.24, compress = 1.30, copies = 1.01, dedup * compress / copies = 1.60
  3. Supposed Test(假定测试): 基本上只是猜测。到目前为止,这是我们测试中最不准确的,但您可能比自己想象的更了解您的数据。例如,这个10TB的服务器将是一个Debian或RPM包存储库吗?如果是这样,数据很可能是高度重复的,您可能会得到接近3:1的节省,甚至更好。也许该服务器将存储大量虚拟机映像,在这种情况下,基本操作系统将被大量复制。同样,你的比率可能会非常高。也就是说您知道您计划存储什么,以及会发生什么。

现在您将得到一个重复数据删除比率数字。在我的例子中,是1.24:1。这个数字将帮助我们“超额认购”我们的存储。为了确定购买多少磁盘,我们的方程应该是:

1
Savings = Need - (Need / Ratio)

我的比率是1.24:1,运行了大约12个虚拟机,我们不需要购买全部10TB的磁盘,实际上我们只需要购买8TB的磁盘。这是一个现实的期望。因此,我可以为这个设置节省2TB的存储。问题就变成了这些节省是否值得。

确定内存需求

好的,现在我们知道了要购买多少磁盘,我们现在需要确定要购买多少RAM。我们已经知道,默认情况下,重复数据删除表(DDT)占安装RAM的比例不会超过25%。这可以通过内核模块进行调整,但在本文中我们将坚持使用默认值。因此,我们只需要确定这25%有多大,这样我们就可以准确地了解需要多少RAM才能安全地存储ARC而不溢出到普通盘上。为了掌握这个指标,我们有两个选择:

  1. Counting Blocks(统计块数):用”zdb -b“命令就可以得到存储池中当前使用的blocks数量。与“zdb -S”命令一样,这将加重池的压力,但它将为您提供关于重复数据删除表的最准确的描述。下面是我的生产服务器上的实际块数:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # zdb -b pool

    Traversing all blocks to verify nothing leaked ...

    No leaks (block sum matches space maps exactly)

    bp count: 11975124
    bp logical: 1023913523200 avg: 85503
    bp physical: 765382441472 avg: 63914 compression: 1.34
    bp allocated: 780946764288 avg: 65214 compression: 1.31
    bp deduped: 0 ref>1: 0 deduplication: 1.00
    SPA allocated: 780946764288 used: 39.19%

在本例中,有11975124个已使用的块,我的2TB的池已使用39.19%,即784GB。因此,每个块的大小约为70KB。你可能会看到一些不同的东西。根据Oracle的说法,每个重复数据删除的块将占用大约320字节的RAM。因此,2TB除以70KB块得到的总存储空间约为30,700,000块。30,700,000块乘以320字节,是9824,000,000字节,或9.8GB RAM的DDT。 因为DDT不超过ARC的25%,而ARC通常是25%的RAM,所以需要至少156.8GB,或基本上160GB的RAM,以防止DDT溢出到磁盘。

  1. 经验法则:这是我们的“经验法则”,您已经在本系列文章和互联网上的其他地方读过。规则是每1TB磁盘分配5GB RAM。这个比率来自于这样一个事实:一个重复数据删除的块在RAM中占用大约320字节的存储空间,而您的块占用的空间可能在512字节到128KB之间,通常平均约为64KB。所以,这个比率大约是1:208,这就是我们提出的“每1TB磁盘5GB RAM”指标。因此,对于10TB的池,我们可以预计DDT需要50GB的RAM, ARC需要200GB的RAM。

在这两种情况下,需要的RAM可能只是物理限制上和成本限制上太高。在我的服务器中,主板不允许物理安装超过32GB的RAM模块。所以40GB是不行的。因此,数据去重是不可能的吗?不一定。如果您有一个快速的SSD,能够达到100k IOPS,或者大致相当于你安装的RAM,那么您可以让DDT从RAM溢出到L2ARC,并且性能不会受到影响。从物理限制和成本限制来看,256GB SSD比200GB的物理RAM模块更实用。

企业硬件

没有SSD

15k SAS硬盘可不便宜。目前,希捷猎豹硬盘售价约为每3GB 1美元,或每1TB 330美元。所以,对于8TB我们将花费在磁盘上,我们将花费2600美元用于磁盘。我们已经确定ARC需要大约200GB的空间。如果我们需要在RAM中安装所有东西,结合我们的主板将支持的安装尺寸,那么ECC RAM大约为320美元每16GB(多么方便)。我需要至少14个16GB内存模块。这将使我的内存成本在4480美元左右。因此,我的存储总账单只有7080美元。我只节省了670美元,省了两块盘。

带SSD

不购买14个16GB内存模块,我们可以很容易用500美元购买一个企业级的256GB快速SLC SSD。256GB的SSD很有吸引力,因为作为L2ARC,它将存储的不仅仅是DDT,而是磁盘上的其他缓存。此外,SSD也可以被分区来存储ZIL,作为一个SLOG。所以,我们可能只需要安装16GB的RAM(双通道的2x8GB模块),这将使我们的RAM成本为320美元,SSD成本为500美元,硬盘成本为2600美元,总安装成本为3420美元。这是只使用ECC RAM来存DDT的配置价格的一半,在我看来,这是划算的。同样,我少买了2块盘,节省了670美元。

商业硬件

不带SSD

现在7200 SATA硬盘很便宜。ZFS在设计时考虑到了普通磁盘,知道它经常故障和静默数据损坏。我现在可以花80美元购买一个全新的2TB磁盘。4块硬盘的总成本是320美元。然而,ECC RAM不会改变,如果我需要14个16GB的棒,就像我的企业设置一样,那么可以计算出商品设置的总成本为4800美元。但是,对于“普通”设置装那么多内存没有意义,所以让我们减少RAM使用,并添加SSD。

带SSD

256GB的三星840 Pro目前售价为180美元,IOPS为10万,可以与DDR3 RAM相媲美。所以,还是用4个2TB的SATA硬盘,合计320美元,16GB的RAM是320美元,三星的SSD是180美元,我们这个设置的总成本是820美元,节省了80美元,因为少买了一个2TB SATA硬盘。这是目前为止最便宜的解决方案。

额外的隐形成本 & SSD性能考虑

当我们制定这些购买RAM的计划时,我们只考虑了储存ARC和DDT的成本。我们没有考虑到你的操作系统仍然需要ARC之外的空间来运行。我认识的大多数ZFS管理员在内存密集的设置中不会给ARC超过25%的RAM,在内存较少的设置中不会超过50%。因此,对于我们200GB的ARC要求,它可能需要多达400GB的RAM,甚至800GB。我还没有管理过安装这么大RAM的服务器。因此,SSD突然变得更有吸引力了。

如果您决定为L2ARC使用SSD,则需要确保它的性能与安装的RAM相当,否则在使用DDT进行查找时将会看到性能下降。预计DDR3 RAM的持续顺序读/写IOPS为100k到150k。

但是,假设您没有购买与DDR3模块性能相同的SSD。假设你的DDR3维持100k IOPS,但是你的SSD只有20k IOPS。这是DDR3慢的5倍(旋转7200转的磁盘只能维持大约100 IOPS)。由于ZFS将频繁地执行DDT查找,这将对性能造成重大影响。因此,您的L2ARC能够匹配与RAM相同的带宽是至关重要的。

此外,ssd还有一个隐性成本,那就是可靠性。典型的企业SLC SSD在芯片开始磨损之前,可以承受约10k的写周期,。然而,对于普通的、更“消费级”的ssd,它们只能维持大约3000 -5k的写周期。不要欺骗自己,对于我们的256GB SSD,这意味着您可以在SLC SSD上写入256GB 10,000次,或2.56PB的数据,或在MLC SSD上写入256GB 3,000次,或768TB的数据。这是大量的写,假设SSD在芯片上有磨损均衡算法。但是,SSD可能过早失效,这意味着DDT溢出到磁盘,完全扼杀存储池的性能。通过将一部分DDT放在SSD上,当ZFS为新的重复数据删除块扩展DDT表时,L2ARC将变得更加密集。在没有重复数据删除的情况下,L2ARC的写密集程度较低,读密集程度应该很高。因此,通过不使用重复数据删除,可以延长SSD的寿命。

总结

所以,现在当你以1.24:1的去重率向首席财务官提供硬件报价时,你就很难说服他了。对于使用SSD的普通硬件,您在磁盘上的节省非常接近(10.25:1),而在企业硬件上,您要要花更多的钱来节省空间(5.10:1)。但是,对于普通硬件,你的花费是企业级硬件的四分之一。在我看来,还是太贵了。

然而,如果你能让你的比例接近2:1,或者更好,那么它可能是一个很好的选择。你真的需要了解你的数据,你真的需要能够证明你会得到可靠的比率。虚拟机的存储服务器可能是一个很好的选择,或者您有几乎完全相同的冗余数据。对于一般用途的存储,尤其是在比率为1.24:1的情况下,似乎不值得这么做。但是,如果您希望节省磁盘,也不一定要这么做。

为了节省磁盘空间,我强烈建议压缩。即使是在高负载的情况下,压缩不会多消耗多少CPU,也可以提供类似的空间节省(在上面的示例中,压缩比为1.3:1,而dedup比为1.24:1),不需要昂贵的DDT,实际上还提供了增强的性能。额外的性能来自于这样一个事实,即高度压缩的数据不需要物理地写入同样多的数据到慢速旋转的硬盘,也不需要从物理硬盘读取同样多。旋转磁盘是基础设施中最慢的瓶颈,因此任何优化读和写的操作都可以带来很大的收益。压缩带来的性能收益正是来源于此。(简单的说,如果压缩前数据大小为2MB,压缩后数据大小为1MB,你只需要写1MB数据到硬盘,读也只需要读1MB,这样性能得到了提升)。

希望这篇文章能帮助您分析数据去重计划,并确定必要的成本。

参考资料

https://pthree.org/2013/12/18/zfs-administration-appendix-d-the-true-cost-of-deduplication/

如果你觉得本文对你有帮助,欢迎打赏