对象存储低级性能测试

Low Level Performance Testing for Object Storage

评估企业对象存储的性能和可扩展性是一项复杂且耗时的工作。然而,性能测试是存储项目规划、概念验证和持续运营阶段中最重要的活动之一。如果没有性能测试,您将无法知道存储系统是否高效运行,以及它们是否能够满足应用程序的要求。

虽然我们性能测试的最终目标是验证对象存储的 GET 和 PUT 操作性能,但我们始终从评估驱动器、节点、操作系统和网络的性能开始。这种方法帮助我们全面地描述性能并查明瓶颈。当我们了解应用程序工作负载后,就可以进行测试以验证存储系统是否具有支持这些工作负载的吞吐量、延迟和 IO 配置文件。我们始终从为各个存储组件建立基准开始,以便快速发现潜在的问题区域,并方便地重现故障和最坏情况。

自然而然地,我们会关注存储介质,但存储系统不仅仅由 SSD 和/或 HDD 组成。系统包含多个设备和组件,可以将其视为层,每一层都有其自身的复杂性和特性。性能测试有助于查明几乎可能出现在任何地方的瓶颈:主板、主机总线适配器、存储控制器、CPU、网卡、交换机等网络设备以及操作系统。通过对整个系统和各个组件进行有条理且彻底的性能测试,可以发现许多潜在的瓶颈。

这篇博文向您展示了如何测量驱动器和网络性能,以验证底层基础设施组件是否能够支持 MinIO 的性能。MinIO 客户可以访问内置的自动化性能测试工具,这些工具可以将下面描述的故障排除步骤简化为单击操作。

使用 Dperf 测量驱动器性能

Dperf 是一款驱动器性能测量工具,任何人都可以使用它来评估驱动器性能并识别问题驱动器。默认情况下,此小型实用程序将多个文件路径作为输入,并对这些文件进行并行读写,类似于 fio 或 iozone。串行测试也是可能的,类似于 Linux 中的 dd 工具。读取和写入吞吐量显示在屏幕上,最快的驱动器显示在最前面。该工具为块大小、要读取/写入的总字节数等参数设置默认值,以及其他用于查找驱动器瓶颈的参数。

Dperf 使用 Go 编写,您需要一个 可用的 Go 环境。安装 Go 后,您只需运行以下命令:

go install github.com/minio/dperf@latest

如果您下载了 预构建的 dperf 二进制文件,则不需要可用的 Go 环境。

Dperf 通过命令行标志进行配置。

$ dperf --help

MinIO drive performance utility
--------------------------------
  dperf measures throughput of each of the drives mounted at PATH...

Usage:
  dperf [flags] PATH...

Examples:

# run dpref on drive mounted at /mnt/drive1
λ dperf /mnt/drive1

# run dperf on drives 1 to 6. Output will be sorted by throughput. Fastest drive is at the top.
λ dperf /mnt/drive{1..6}

# run dperf on drives one-by-one
λ dperf --serial /mnt/drive{1...6}

Flags:
  -b, --blocksize string   read/write block size (default "4MiB")
  -f, --filesize string    amount of data to read/write per drive (default "1GiB")
  -h, --help               help for dperf
      --serial             run tests one by one, instead of all at once.
      --version            version for dperf

对于 HDD,您可以预期看到大约 1 GiB/s 的 R/W(读取/写入组合)或更低。对于闪存存储,低端 SATA SSD 的 R/W 速度应在 2.0 到 4.0 GiB/s 之间,PCIe 4.0 SAS SSD 的 R/W 速度在 6 到 7 GiB/s 之间,PCIe 5.0 NVMe 的 R/W 速度在 7 到 10 GiB/s 之间。例如,以下是我在笔记本电脑的 SSD 上运行该实用程序时得到的输出:

$ ./dperf /mnt/c
┌───────────┬────────────┐
│ TotalREAD │ TotalWRITE │
1.0 GiB/s │ 1.1 GiB/s  │
└───────────┴────────────┘

以下是使用配备企业级 NVMe 的服务器运行该实用程序时的示例输出:

$ ./dperf /mnt/drive{1..3} –verbose

┌───────────┬────────────┐────────────┐
PATH      │ READ       │ WRITE      |
│/drive3    │ 6.6 GiB/s  │ 3.6 GiB/s  |

|/drive1    | 6.4 GiB/s  | 3.5 GiB/s  |

|/drive2    | 6.3 GiB/s  | 3.6 GiB/s
└───────────┴────────────┘────────────┘


┌───────────┬────────────┐
TotalREADTotalWRITE
│ 19.3 GiB/s│ 10.7 GiB/s │
└───────────┴────────────┘

使用 FIO 进行灵活且有洞察力的测试

FIO(灵活 I/O 测试器)用于模拟给定的 I/O 工作负载。作业文件定义了 FIO 必须顺序完成的任务。作业文件可以包含多个作业,并且可以通过命令行配置和启动单个作业。FIO 不需要以 root 身份运行,但当文件或设备需要 root 权限时,它可以以 root 身份运行。

在设置 FIO I/O 工作负载时,第一步是编写一个描述该工作负载的作业文件。作业文件可以包含任意数量的线程和/或文件——作业文件的典型内容是一个定义共享参数的全局部分,以及一个或多个部分来描述各个作业。作业包含以下参数

  • I/O 类型:定义发出到文件(s) 的 I/O 模式。我们可能只从这些文件(s) 顺序读取,或者我们可能随机写入。甚至混合读取和写入,顺序或随机。我们是否应该进行缓冲 I/O 或直接/原始 I/O?
  • 块大小:我们以多大的块大小发出 I/O?这可能是一个单一的值,也可能描述一个块大小的范围。
  • I/O 大小:我们将读取/写入多少数据。
  • I/O 引擎:我们如何发出 I/O?我们可以将文件内存映射,可以使用常规的读取/写入,可以使用 splice、异步 I/O,甚至可以使用 SG(SCSI 通用 sg)。
  • I/O 深度:如果 I/O 引擎是异步的,我们希望保持多大的排队深度?
  • 目标文件/设备:我们将工作负载分散到多少个文件上。
  • 线程、进程和作业同步:我们应该将此工作负载分散到多少个线程或进程上。

此列表仅仅是定义工作负载所需的基本参数。作业文件或通过命令行标志可以包含另外几十个选项。请参阅 examples/ 目录以获取有关如何编写作业文件的灵感。如果您遇到问题,--cmdhelp 选项也会列出所有选项。如果与命令参数一起使用,--cmdhelp 将详细说明给定的命令。

使用 Hperf 测量 HTTP 速度

Hperf 是一种工具,用于测量指定数量的对等体之间可达到的最大带宽,并报告每个对等体的接收和发送带宽。该实用程序可以从命令行安装和运行,也可以通过 Helm 或 YAML 安装到 Kubernetes 中。Hperf 使用的默认端口为999910000,因此您的防火墙必须允许这些端口上的流量。您可以在./hperf 中使用NPERF_PORT= 选项选择配置自定义端口。

在将 hperf 下载并安装到您的本地 Go 环境后,只需从您要测试的服务器的命令行运行它,包括您要测量网络吞吐量的每个端点的 IP 地址即可


./hperf-linux-amd64 10.0.0.10 10.0.0.209
2023/07/10 16:15:44 启动HTTP服务以跳过自身..等待等待 10等待服务准备就绪
带宽:  54 MB/s RX   |  71 MB/s TX
带宽:  78 MB/s RX   |  80 MB/s TX
带宽:  82 MB/s RX   |  76 MB/s TX
带宽:  80 MB/s RX   |  85 MB/s TX
带宽:  82 MB/s RX   |  76 MB/s TX
带宽:  84 MB/s RX   |  87 MB/s TX
带宽:  80 MB/s RX   |  84 MB/s TX

以上结果来自我 1 Gbps 家庭网络上的两个节点。结果在可用总带宽的 50%-75% 范围内,这对于非托管家庭网络来说是可以预期的。

MinIO 的性能通常受网络吞吐量的限制。当我们测试性能时,我们发现网络几乎完全被利用。至少,我们建议使用 25 Gbps 网络,而且我们主要看到客户部署在 100 Gbps 网络上。提高整体性能的一种快速简便的方法是在单独的网络上隔离客户端和节点间流量。MinIO 充分利用了可用的底层硬件 - 瓶颈几乎总是网络。当 MinIO 在更高带宽的网络上运行时,性能会得到提升。

综合起来

通过逐层评估存储性能,我们能够找出并解决瓶颈问题。首先我们测量了驱动器的性能,然后测量了网络性能,最后测量了驱动器执行我们工作负载的能力。在测量单个驱动器时,我们可以开始跟踪有缺陷/故障的硬件。

MinIO 订阅者可以访问自动化、易于使用的性能测试工具,这些工具提供了简化的故障排除体验和简洁的结果。MinIO 管理员只需点击一下即可运行其集群的分布式性能评估。运行健康检查后,结果将上传到 MinIO SUBNET。健康检查使用 PUT 操作评估对象存储性能,然后使用 GET 操作,逐步增加负载以确定最大聚合吞吐量,使用 dperf 评估驱动器性能,最后使用 hperf 评估网络性能。测试执行时间从几秒到几分钟不等,具体取决于您的 MinIO 集群,并且可以在 SUBNET 门户的“性能”选项卡中查看,并与我们的工程师讨论。

验证对象存储性能

一个设计良好的对象存储产品应该能够轻松获得准确一致的性能测试结果,而无需进行大量异乎寻常的调整或跳过繁琐的步骤。目标是使性能测试变得简单且可重复——而无限地调整则不可重复。同样,请确保记录整个存储环境的详细信息,以便在需要时其他人可以完全且精确地重建它。

接下来,您可能希望开始尝试影响存储性能的变量。您可以模拟重负载下的驱动器故障并测量其对性能的影响。您可以添加/删除整个节点、内存、网卡和驱动器来测量其影响,甚至可以在您负担得起的最快网络上进行测试,以查看性能改进是否具有现实意义。
您是否正在为 MinIO 部署调整硬件?查看我们的擦除码计算器,以帮助您了解各种部署选项下的原始容量和可用容量。