合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
最近,很多人都会问:如何设置 QEMU/KVM 以获取最高的性能?
虽然,过去很多人都在测试或者使用 Ceph 过程中进行调优设置以获取最佳性能,但到目前而言,还没有一个最优的最新数据。通常,我们在使用 Ceph 的时候,有经验的工程师往往会通过消除系统高级别的性能瓶颈来优化。
这可能意味着可能会通过 librbd 与同步 IO 隔离测试单个OSD的延迟,或者使用大量有高 IO 深度的客户端在裸机上的 OSD 集群上产生大量IO。在这种情况下,请求是用大量并发 IO 驱动由 librbd 支持的单个 QEMU/KVM,并查看其速度。
下文,我们将了解 QEMU/KVM 在使用 Ceph 的 librbd 驱动程序时的执行速度。
所有节点都位于同一个 Juniper QFX5200 交换机上,并通过单个 100GbE QSFP28 链路连接。虽然集群有 10 个节点,但在决定最终设置之前我们也评估了各种配置。最终使用 5 个节点作为 OSD 主机,总共有 30 个 NVMe 支持的 OSD。
此设置的预期总体性能约为 1M 随机读取 IOPS 和至少 250K 随机写入 IOPS(在 3 副本的场景下),这足以测试单个 VM 的 QEMU/KVM 性能。集群中剩余的一个节点用作 VM 客户端主机。不过,在配置 VM 之前,使用 CBT (https://github.com/ceph/cbt/) 构建了几个测试集群,并使用 fio 的 librbd 引擎运行测试工作负载以获得基线结果。
CBT 的配置为匹配 Ceph 环境修改了一些,而不是使用默认的配置。首先,禁用了 rbd 缓存 (1),每个 OSD 被分配了一个 8GB 的 OSD 内存 traget,并且在初始测试中禁用了 cephx ,并且使用 msgr V1(但在以后的测试中使用安全模式下的 msgr V2 启用了 cephx)。创建集群后,CBT 配置为使用带有 librbd 引擎的 fio 创建一个 6TB RBD 卷,然后通过 iodepth=128 的 fio 执行 16KB 随机读取 5 分钟。由于使用 CBT 重新创建集群和运行多个基线测试非常简单,因此,下面测试了几种不同的集群大小以获得 librbd 引擎和基于 kernel-rbd 的 libaio 引擎的基线结果。
在集群级别禁用 RBD 缓存将对使用 librbd 引擎的 fio 有效,但不会对 QEMU/KVM 的 librbd 驱动程序有效。相反,cache=none 必须通过 qemu-kvm 的驱动部分显式传递。
Kernel-RBD 在从单个 OSD 读取时表现非常出色,但 Librbd 在完整的 30 个 OSD Ceph 集群中以略高于 122K IOPS 的速度实现了最高性能。librbd 和 kernel-rbd 在 5 OSD Ceph 集群上的表现几乎一样。
尽管如此,在 5 个节点、30 个 OSD Ceph 集群上我们执行了进一步的测试。此场景更好地模仿了用户在小规模但更贴近真实环境并且配置 NVMe 的 Ceph 集群上可能看到的结果。
使用 RBD 部署和引导 QEMU 虚拟机镜像相当简单了。
1. 下载镜像
使用了 CentOS8 Stream qcow2 映像,并注入了 root 密码和公钥以便于访问:
wget https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20220913.0.x86_64.qcow2
virt-sysprep -a ~/CentOS-Stream-GenericCloud-8-20220913.0.x86_64.qcow2 --root-password password:123456 --ssh-inject root:file:/home/nhm/.ssh/id_rsa.pub
TOP