MinIO 中擦除编码对 CPU 利用率的影响

Erasure Coding Impact on CPU Utilization in MinIO

擦除编码是 MinIO 核心功能之一。它是为分布式设置提供高可用性的基石之一。简而言之,写入 MinIO 的对象会被分成多个数据分片 (M)。为了补充这些数据分片,我们会创建一定数量的奇偶校验分片 (K)。然后,这些分片会分布在多个磁盘上。只要有 M 个分片可用,就可以重建对象数据。这意味着我们可以丢失 K 个分片而不会丢失数据。更多详细信息,请参阅 擦除编码 101

传统上,擦除编码被认为是一项 CPU 密集型任务。因此,存在专门用于创建擦除码的硬件。但是,MinIO 不使用此类硬件,那么这是否应该成为性能方面需要关注的问题呢?

2006 年,英特尔发布了补充流式 SIMD 扩展 3,通常称为 SSSE3。几年后,人们发现 SSSE3 中的特定指令可以用来将擦除编码的速度提高近一个数量级。从那时起,英特尔发布了 伽罗华域新指令 (GFNI),进一步将这些计算加速了大约 2 倍。

这些创新,加上可以利用这些扩展的软件,使得擦除编码在没有专用硬件的情况下成为可能。这对我们来说很重要,因为我们的主要目标之一是在通用硬件上使 MinIO 性能良好。也就是说,让我们来探讨一下实际性能。

测试设置

为了测试各种平台的性能,我们创建了一个 小型应用程序 和一个配套的 脚本,该脚本在一个对 MinIO 来说现实的场景中对性能进行了基准测试。

  • 块大小:1MiB
  • 块数:1024
  • M/K:12/4、8/8、4/4
  • 线程:1->128

所有 MinIO 对象都以最大 1MiB 的块写入,该块大小除以我们要写入数据分片的驱动器数量。因此,我们在测试中保持此数字不变。

基准测试对 1024 个块进行操作。这意味着输入数据为 1GiB。这样做是为了消除 CPU 缓存的影响。我们这样做是为了测试最坏情况下的性能,而不仅仅是数据位于 L1/L2/L3 缓存时的性能。

选择 CPU 以全面了解各种平台的性能。

请参阅文章末尾,了解测量数据的链接。

基准测试

我们测量了三种不同的擦除码配置下的编码和解码速度。

编码 12+4

首先,我们查看对象跨 16 个磁盘分片时的编码速度。使用默认设置,MinIO 会将数据分成 12 个分片并创建 4 个奇偶校验分片。我们将查看使用不同数量的核心进行计算的速度。这是将对象上传到 MinIO 时执行的操作。为了使其易于与 NIC 速度进行比较,我们以每秒千兆位显示速度。

在此图表中,我们可以看到我们很快就超过了顶级 400Gibps NIC 的速度——事实上,所有 x86-64 平台都可以使用少于 4 个线程来做到这一点,而 Graviton 3 需要大约 16 个核心。

较旧的双插槽英特尔 CPU 几乎可以跟上新一代单插槽英特尔 CPU 的速度。AMD 紧随英特尔,尽管此 CPU 代没有提供 GFNI 支持。出于好奇,我们还在没有 GFNI 的情况下测试了英特尔 CPU,仅使用 AVX2。

我们看到 Graviton 3 在达到其核心数量时达到峰值,正如我们预期的那样。

解码 12+4

接下来,我们查看重建对象时的性能。即使在本地分片包含奇偶校验以减少远程调用的情况下,MinIO 也会重建对象,即使这并非严格必要。

设置与上面类似。对于每个操作,从剩余数据中重建 1 到 K(此处为 4)个分片。

首先,我们观察到我们很快就超过了我们可以遇到的最大 NIC 速度。实际上,这意味着擦除编码的 CPU 利用率在任何设置中都不会消耗超过几个核心。

我们还可以看到,随着使用核心数量的增加,性能略有下降。这可能是内存带宽竞争的结果。如上所述,由于其他系统瓶颈,任何服务器都不太可能达到此利用率范围。

8 个数据 + 8 个奇偶校验

我们调查的另一个设置是 16 个驱动器设置,其中每个对象被分成 8 个数据分片并创建 8 个奇偶校验分片。

我们观察到类似的模式,速度下降幅度略高。可能这是由于每次操作写入的数据量更大造成的。但速度下降幅度并不令人担忧,达到 400 GbE NIC 的速度应该不成问题。

4 个数据 + 4 个奇偶校验

最后,我们对对象被分成 4 个数据分片和 4 个擦除分片的设置进行基准测试

情况仍然类似。同样,读写操作都不会对这些现代 CPU 中的任何一个造成明显的负载。

您可以在 此处 找到完整的测试结果。

分析和结论

通过此测试,我们希望确认在通用硬件上进行擦除编码可以与专用硬件一样快——而无需付出成本或锁定。我们很高兴地确认,即使在顶级 NIC 速度下运行,我们也只会占用所有最流行平台上用于擦除编码的少量 CPU 资源。

这意味着 CPU 可以将资源用于处理 IO 和请求的其他部分,并且我们可以合理地预期,任何外部流处理器处理至少需要等量的资源。

我们很高兴看到英特尔在其最新平台上提高了吞吐量。我们期待测试最新的 AMD 平台,并预计其 AVX512 和 GFNI 支持将进一步提高性能。即使 Graviton 3 的表现稍逊一筹,我们也不认为它会成为一个重要的瓶颈。
有关在任何环境中安装、运行和使用 MinIO 的更多详细信息,请参阅我们的 文档。要详细了解 MinIO 或参与我们的社区,请访问 min.io 或加入我们的 公共 Slack 频道