使用 CBT 进行性能基准测试:指南,设置 Ceph 集群。第一部分
CBT 性能基准测试 - 第一部分。什么是 CBT 以及如何使用它?
博客系列大纲 ¶
目录
简介:什么是 CBT(Ceph 基准测试工具)? ¶
CBT 可用于标准化性能评估过程,方法是
- 简化集群创建过程并让 CBT 完成
- 运行确定性测试套件,并提供具有各种工作负载的响应曲线(吞吐量与延迟)
- 工具可自动处理性能基准测试数据,生成性能报告和比较报告,能够比较两个或多个(最多 6 个)响应曲线运行,并识别响应曲线中的性能差异
以下是 CBT 比较报告的示例:(这些将在后面的 第三部分 中更详细地说明)

现在我理解上述曲线示例对于很多人来说可能是一个全新的概念,因此我会介绍它们的基础知识
- 理想的响应曲线是一条平坦的水平线,显示 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:构建容器。
现在我将删除我之前运行的集群,以便从头开始。
您需要删除两个区域才能完成此步骤
您的 yaml 文件中
tmp_dir行指向的位置tmp_dir: "/tmp/cbt"此目录包含 IO 激励器的临时日志文件,例如 FIO json 文件。
运行性能基准测试时的 -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
当然,将 sha1 和 ip_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-image 和 rbd_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 集群上运行的工作负载(测试)!