使用 CBT 进行性能基准测试:指南,设置 Ceph 集群。第一部分

Jake Squelch (IBM)

CBT 性能基准测试 - 第一部分。什么是 CBT 以及如何使用它?

博客系列大纲

  • 第一部分 - 如何使用 CBT 为性能基准测试启动 Ceph 集群
  • 第二部分 - 定义 YAML 内容
  • 第三部分 - 如何启动 CBT 性能基准测试

目录


简介:什么是 CBT(Ceph 基准测试工具)?

CBT 可用于标准化性能评估过程,方法是

  • 简化集群创建过程并让 CBT 完成
  • 运行确定性测试套件,并提供具有各种工作负载的响应曲线(吞吐量与延迟)
  • 工具可自动处理性能基准测试数据,生成性能报告和比较报告,能够比较两个或多个(最多 6 个)响应曲线运行,并识别响应曲线中的性能差异

以下是 CBT 比较报告的示例:(这些将在后面的 第三部分 中更详细地说明)

alt text

现在我理解上述曲线示例对于很多人来说可能是一个全新的概念,因此我会介绍它们的基础知识

  • 理想的响应曲线是一条平坦的水平线,显示 I/O 数量增加时延迟保持恒定,直到我们达到饱和点。这是我们达到系统瓶颈的地方,例如在 CPU、网络、驱动器利用率或软件中的其他资源限制。 此时,我们预计曲线将变成一条垂直线,表明尝试执行系统可以处理的更多 I/O,只会导致 I/O 排队,从而导致延迟增加。
  • 在实践中,响应曲线永远不会完美。 良好的响应曲线将具有一条相当水平的线,延迟随着 I/O 负载的增加而逐渐增加,向上弯曲到一条垂直线,我们达到饱和点。
  • 我们的比较曲线将在博客的 第三部分 中更详细地说明,因此现在对基本理解就足够了。

本博客的目标是演示如何使用 CBT(Ceph 基准测试工具)以确定性方式运行 Ceph 测试。 它的作用也是展示如何设置 Ceph 集群以与 CBT 一起使用,从而简化您的操作,通过自动化设置性能测试所需的许多手动工作。

为了举例说明,本博客将尝试回答这个问题:“使用 CLAY 擦除编码插件是否比使用默认 JErasure 插件提供更好的性能?” 展示如何使用 CBT 进行一组实验并生成报告以回答这个问题。

我希望您发现本教程易于理解,并能了解使用 CBT 使您的性能基准测试更加轻松的好处。


基准测试存储系统时需要考虑的事项?

在评估性能时,需要考虑的方面有很多,主要方面是衡量性能的目标是什么,这可能是

  • 回归测试修复程序,以查看性能是否下降或提高
  • 回归测试构建,以查看其他贡献者是否降低了性能
  • 比较功能
  • 比较扩展(向节点添加更多 OSD)或扩展(添加更多节点)的效果
  • 比较一种池类型与另一种池类型的性能
  • 额外的网络带宽的影响
  • 升级 Ceph 节点中的 CPU 的影响

因此,您需要考虑

  • 生成的结果必须与与原始结果以相同的方式重复的系统进行比较。

    • 这包括 相同的 cpu、OSD 数量、驱动器类型、RBD 卷数量、Ceph 节点、以太网端口/类型。
    • 即使客户端连接也很重要。
    • 两个看似完全相同的系统可能会产生不同的性能结果,因为一个驱动器可能具有不同代次的闪存存储。
    • 因此,理想情况下,为了获得像对像的比较,需要在相同的系统上运行测试。
  • 系统必须预填充(如果适用,可能对对象/RGW 评估不重要)并以相同的方式预调置。

    • 预填充涉及在进行任何性能基准测试之前,使用连续写入填充卷或池。 填充到物理容量的 100% 不需要,大多数生产系统将具有足够的可用容量以允许扩展。 因此,对于基准测试,填充到物理容量的 50% 左右足以满足实际存储需求。
    • 预调置是在预填充系统后添加随机覆盖,以模拟实际应用程序,以添加一些垃圾收集/碎片整理,因为大多数生产系统已经运行了几个月/年,因此会生成许多覆盖和数据更新。
    • 几乎为空的存储系统与具有大量数据的系统将由于元数据访问、垃圾收集、碎片整理等原因而表现出不同的性能。
  • 相同的负载量,例如 1M、4k、8k、64k 等。 这必须使用相同的方法进行顺序/随机处理。

  • 结果总会有一些差异,即使所有条件都相同。
    这可能是由于工作负载排序等微小因素造成的,这可能会影响后续工作负载的性能。 例如,如果先进行顺序写入然后进行读取,那么性能将明显优于先进行随机写入然后进行顺序读取。

    • 因此,如果测试结果为通过或失败,您需要允许一定的差异,通常 10% 在仅查看持续时间内平均性能时是可以接受的。
    • 运行时间越短,差异越大。
    • 此外,为了尽量减少差异,重要的是为每个测试选择适当的运行时间,通常 5 分钟就足够了。
  • 关闭均衡器、擦除、深度擦除、自动缩放器将有助于生成更可重复的结果,因为性能基准测试将仅测量客户端性能,而不会测量任何可能影响性能的 Ceph 后台进程,例如回填、pg 分割/合并和擦除。 启用这些功能将生成实际结果,但可能会生成更多的差异和性能的几个百分点差异。


您希望从性能基准测试中获得什么?

如果在相同的系统上重复相同的性能测试,您希望能够测量相同的结果(或尽可能减少运行之间的差异)。 如果您要尝试比较不同的配置以查看哪个更好,那么这种可预测性非常重要。

理想情况下,您还应该能够 6 个月后在相同的系统上运行相同的测试,并获得相同的结果。 这更难实现,因为随着时间的推移,事情可能会发生变化。 理想情况下,如果有人配置与运行性能测试的系统等效的系统,您希望获得相同的结果。 如果操作正确,则回归测试性能所需的体力劳动将大大减少。


启动用于性能基准测试的 Ceph 集群

对于这些博客,我们将专注于使用 Cephadm 来启动我们的 Ceph 集群,尽管 vstart 或手动操作也是可行的选择。 同样重要的是要注意,我正在使用 RBD 卷 作为存储类型,并使用 FIO 作为 IO 激励接口。 容量填充等规则同样适用于其他存储类型,但计算池大小的数学公式会有所不同。

本节将介绍将 Ceph 集群启动并运行的基本步骤,以便开始进行性能基准测试。


步骤 1:设置

您将希望 ssh 到我们将要使用的机器。

我的系统具有以下设置

  • 6 个 SATA 驱动 SSD,210GB
  • ceph 版本 20.3.0-2198-gb0ae68b0 (b0ae68b0ccceed5a913d81c5a8cb0b4e9c5a5f6b) tentacle (dev)
  • 操作系统:Red Hat Enterprise Linux 9.6 (Plow)
    注意:这是一个单节点系统,您正在使用与 Ceph 相同的系统运行 IO 客户端。 但是,这并不妨碍您在多节点服务器上运行 CBT。 YAML 格式允许它通过 SSH 连接到 Ceph 节点。

步骤 2:清理

当您使用 cephadm 创建集群并运行 CBT 测试时,日志文件将在指定位置创建。

因此,如果您之前做过测试并知道特定位置存在旧日志文件,请首先删除它们。 如果您以前从未运行过 CBT,则可以转到 步骤 3:构建容器

现在我将删除我之前运行的集群,以便从头开始。

您需要删除两个区域才能完成此步骤

  1. 您的 yaml 文件中 tmp_dir 行指向的位置

    tmp_dir: "/tmp/cbt"
    

    此目录包含 IO 激励器的临时日志文件,例如 FIO json 文件。

  2. 运行性能基准测试时的 -a 参数

    -a /tmp/cbt
    

    此参数目录包含性能基准测试的性能结果。 正如您所看到的,我的 YAML 和参数指向相同的目录,因此在我的 CBT 运行之前,我总是会确保

    rm -rf /tmp/cbt/*
    

    我们删除这些文件,因为如果您不这样做,CBT 会假定已经有一个运行正在进行,并且 CBT 将尝试保护以前的数据并跳过 YAML 中的测试。


步骤 3:构建容器

接下来,您将获得一个用于构建 Ceph 集群的构建容器。 您可以从 Ceph 构建 获取此容器 ID。 点击您想要的构建,然后复制 sha1,这也被称为 容器 ID。 我正在使用的构建可以在之前的 步骤 1:设置 部分中看到。

  • 您现在将使用 podman 下载所需的构建容器
点击查看上游详情
podman pull quay.ceph.io/ceph-ci/ceph:<sha1>

请务必将您的特定 sha1 粘贴到上面的命令中!

注意:以上使用的是开发构建容器。 您还可以从 此处 拉取已发布构建容器(用于 Squid/Reef 等)。

点击查看下游详情
podman pull quay.ceph.io/ceph/ceph:v19.2.3

以上是最新 squid 构建的示例

podman pull quay.ceph.io/ceph/ceph:v20.1

以上是 tentacle RC 候选版本的示例


步骤 4:创建集群

首先,运行命令 lsblk 以查看您将用于 Ceph 的块设备上是否存在任何 Ceph 分区。 如果是,您需要运行下面的 removevgs 脚本来删除卷组

点击查看 removevgs 脚本
for i in /dev/ceph*
do
lvremove -y $i
done

接下来,使用带有您之前下载的容器 id 的 cephadm 来创建您的 Ceph 集群,如下所示

cephadm --image quay.ceph.io/ceph-ci/ceph:<sha1> bootstrap --single-host-defaults --log-to-file --mon-ip <ip_of_node> --allow-mismatched-release

当然,将 sha1ip_of_node 替换为相应的值。 您正在指定容器镜像,使用 bootstrap 初始化新的 Ceph 集群。 --single-host-defaults 正在优化单节点的 bootstrap,请注意,如果您正在创建多节点 Ceph 集群,则不需要此选项。 --log-to-file 使 Ceph 守护程序将日志记录到磁盘上的文件中。 --mon-ip 告诉将第一个监视器绑定到哪个 IP 地址。 --allow-mismatched-release 允许您使用与主机 cephadm 版本不匹配的镜像进行 bootstrap。

在性能基准测试中,通常建议在开始任何基准测试之前将系统重置为已知状态,因为诸如存储数据碎片化之类的因素会影响结果。 因此,建议在每次运行之间删除并重新创建集群。


步骤 5:配置集群现在您已经设置了一个基本的集群,您可以查看您的集群以确保它正在运行
  • ceph orch device ls 以检查是否可用所有需要的 OSD
  • 如果不可用,您必须使用 ceph orch zap device <osd> 使它们可用。 像这样脚本可以解决 OSD 不可用问题
点击查看 zap OSD 脚本
#! /bin/bash
file=/tmp/$$.out
out=/tmp/$$b.out
cephadm shell ceph orch device ls 2>&1 | grep ssd >$file

cat $file | while read -a line_array; do

host=${line_array[0]}
device=${line_array[1]}

echo ceph orch device zap ${host} ${device} --force >>$out
done

echo exit >>$out

cephadm shell <$out

rm -f $file
rm -f $out
  • 接下来,您将创建我们的擦除编码 (EC) 设置。 此脚本可以根据您的需要自定义 EC 设置,我将在此处提供一个简单的示例版本
点击查看详情
ceph osd erasure-code-profile set reedsol plugin=isa k=4 m=2 technique=reed_sol_van stripe_unit=4K crush-failure-domain=osd
ceph osd pool create rbd_erasure 64 64 erasure reedsol
ceph osd pool create rbd_replicated 64 64 replicated
ceph osd pool set rbd_erasure allow_ec_overwrites true
ceph osd pool set rbd_erasure allow_ec_optimizations true
rbd pool init rbd_erasure
rbd pool init rbd_replicated
rbd create –pool rbd_replicated –data-pool rbd_erasure –size 10G test-image

重要的是要注意您创建的 卷名称池名称,在我的示例中,这是 test-imagerbd_replicated。 由于我们正在创建一个擦除编码配置文件,我们使用复制的池名称。 (在 第二部分基准测试模块 部分中,您需要引用这些名称)

所以以上是一个类似于我运行的脚本的例子。它定义了一个 4 + 2 EC 配置,名为 reedsol。EC 配置本质上是一个模板,定义了 Ceph 应该如何使用 EC 编码和存储数据。您创建两个池(rbd_erasure & rbd_replicated),启用 EC 覆盖和 EC 优化,然后初始化池并创建一个由 EC 池支持的 RBD 镜像。

在创建 EC 设置的过程中,您将

  • 定义数据 OSD 的数量 (k) 和奇偶校验 OSD 的数量 (m)
  • 定义驱动器的大小
  • 定义预填充的百分比
  • 定义卷的数量
  • 定义卷的大小
  • 定义 EC 配置,指定插件、技术、条带宽度等
  • 创建您的 EC 池

我的 EC(纠删编码)设置如下

  • 4 + 2 设置 (k=4, m=2)
  • 210gb 驱动器大小
  • 50% 预填充
  • 8 个卷
  • 52.5gb 卷大小
  • 单个 EC 池
  • 块大小 = 4K

现在您已经设置并配置了一个纠删编码的 Ceph 集群!

我将在这里更深入地探讨预填充,如上所述,您的目标是预填充 50% 的物理容量。您需要选择一个 工作集(在基准测试过程中使用的逻辑容量),这非常重要,这样所有 IO 就不直接进入具有大量内存的系统的缓存中。因此,重要的是使总工作集明显大于系统中的 RAM。

在此示例中,您使用的是带有纠删编码的 RBD 卷。这是您用来计算需要写入多少数据才能将物理容量填充到 50%(由 0.5 表示)的计算方法,这被称为 RBD 卷大小。(物理驱动器大小 * K * 0.5 / 卷数 因此,对于上面的示例,您将得到:(210000 * 4 * 0.5) / 8 因此,RBD 卷大小 = 52500 (52.5GB)

然后,您可以计算 总工作集,方法是:RBD 卷大小 * 卷数 这将导致,对于我们的示例:52500 x 8 因此,工作集 = 420000 (420GB)

您可以看到,对于我们的示例,工作集为 420GB,RAM 为 210GB,因此这令人满意。

如果您不使用带有 EC 的 RBD 卷,而是使用副本池,那么计算 RBD 卷大小 的公式如下:(物理驱动器大小 * OSD 数量 / 副本数量 * 0.5) / 卷数


现在,如果您愿意,请转到 第二部分 的博客,在那里您可以查看定义一个 YAML 文件,该文件将概述您将在 Ceph 集群上运行的工作负载(测试)!