-
Windows 上直接使用Ceph以及性能测试
云和安全管理服务专家新钛云服 祝祥原创
在 Windows 上本地使用 Ceph
由于Cloudbase Solutions和Suse 的合作,当前Ceph 16 (Pacific)提供了 Windows 原生支持。
Ceph 可能是最常用的软件定义存储解决方案。根据调查(
https://www.openstack.org/analytics),超过 70% 的 OpenStack 部署由 Ceph 提供支持。考虑到它可以在商用硬件上运行,而且能够扩展到数百个存储节点并提供不错的性能,这也就不足为奇了。在 Windows 上使用 Ceph 一直是一个痛点,以往需要iSCSI网关等代理或使用 Samba重新导出CephFS。这些方法提供了次优的性能并使部署架构过于复杂。现在所有麻烦都没有了,因为RBD和 CephFS 可以原生地在 Windows 上使用。
为获得最佳性能和功能,建议使用Windows Server 2019。Windows Server 2016也受支持,但有一些已知限制。较旧的 Windows Server 版本以及客户端版本(如 Windows 10)可能也能正常工作,但目前不受支持。
安装:
这个 MSI 安装程序(
https://cloudbase.it/ceph-for-windows/)是在 Windows 上安装 Ceph 的推荐方式。除了 Ceph 二进制文件,它还捆绑了WNBD驱动程序,用于映射 RBD 镜像。如果您更喜欢手动构建和安装Ceph(
https://github.com/ceph/ceph/blob/master/README.windows.rst)和WNBD(https://github.com/cloudbase/wnbd),请参考这些指南。配置:
在 Windows 上使用 Ceph 需要最少的配置。默认配置文件位置是`C:\ProgramData\ceph\ceph.conf*。
这是一个配置示例。不要忘记填写正确的 Ceph Monitor 地址并在指定位置提供 Ceph 密钥环文件。目前,必须使用斜杠“/”而不是反斜杠“\”作为路径分隔符。
[global] log to stderr = true ; Uncomment the following to use Windows Event Log ; log to syslog = true run dir = C:/ProgramData/ceph/out crash dir = C:/ProgramData/ceph/out ; Use the following to change the cephfs client log level ; debug client = 2 [client] keyring = C:/ProgramData/ceph/keyring ; log file = C:/ProgramData/ceph/out/$name.$pid.log admin socket = C:/ProgramData/ceph/out/$name.$pid.asok ; client_permissions = true ; client_mount_uid = 1000 ; client_mount_gid = 1000 [global] mon host = <ceph_monitor_addresses>
RBD:
Rados 块设备 (RBD)一直是这项工作的主要重点。您可能已经熟悉的相同 CLI 可用于创建 RBD 映像并将它们附加到主机和Hyper-V虚拟机。
以下 PowerShell 示例创建一个 RBD 映像,将其附加到主机并在顶部添加一个NTFS分区。
rbd create blank_image --size=1G rbd device map blank_image $mappingJson = rbd-wnbd show blank_image --format=json $mappingJson = $mappingJson | ConvertFrom-Json $diskNumber = $mappingJson.disk_number # The disk must be online before creating or accessing partitions. Set-Disk -Number $diskNumber -IsOffline $false # Initialize the disk, partition it and create a fileystem. Get-Disk -Number $diskNumber | ` Initialize-Disk -PassThru | ` New-Partition -AssignDriveLetter -UseMaximumSize | ` Format-Volume -Force -Confirm:$false
默认情况下,所有 RBD 映射都是持久的。可以使用上述 MSI 安装程序部署的“ ceph-rbd ”服务负责在主机重新启动后重新附加 RBD 映像。这还允许调整 Windows 服务启动顺序,以便在启动可能依赖它的服务之前映射 RBD 映像。
以下屏幕截图显示了附加到 Hyper-V 虚拟机的 RBD 镜像以及基准测试结果。我们将在以后的文章中深入研究基准测试。
WNBD:
RBD 映像通过使用WNBD Storport Miniport 驱动程序(
https://github.com/cloudbase/wnbd)公开为 SCSI 磁盘,作为此移植工作的一部分编写。WNBD 驱动程序提供的一项有趣功能是 NBD 客户端功能,允许它用于附加任意 NBD 导出。在实施更有效的机制之前,这是附加 RBD 图像的默认方式。由于它的实用性,这个特性被保留了下来,尽管它可能在某个时候被移到驱动程序之外,利用与rbd-wnbd相同的 API 。
要挂载独立的 NBD 映像,请使用以下命令:
wnbd-client map export_name $nbdAddress --port $nbdPort
CephFS:
Windows 上的CephFS支持是我们的第二个主要目标,目前处于试验阶段。我们正在使用类似于 FUSE 的Dokany以及看似废弃的 ceph-dokan项目的改进版本。
以下简单命令使用“X:”驱动器号挂载 CephFS:
ceph-dokan.exe -l x
当前限制:
虽然移植的当前状态已经涵盖了大多数的情况,但您应该注意一些限制。这些缺失的功能可能会在后续版本中实现。
- RBD镜像还不能用于备份群集共享卷(CSV)在Windows Server故障转移群集(WSFC) ,这需要SCSI永久保留的支持
- WNBD 磁盘无法实时调整大小
- Python 绑定不可用
- Ceph CLI工具还不能以本机方式使用。但是,它可以通过Windows Subsystem for Linux与正在运行的服务联系。
Windows 上的 Ceph – 性能
在此 Ceph Windows 移植之前,从 Windows 访问 Ceph 存储的唯一方法是使用Ceph iSCSI 网关,这很容易成为性能瓶颈。我们的目标是超越 iSCSI 网关并尽可能接近本机 Linux RBD 吞吐量。
测试环境:
在展示一些实际结果之前,让我们先谈谈测试环境。我们使用了 4 个相同的裸机服务器,具有以下规格:
- CPU
- Intel(R) Xeon(R) E5-2650 @ 2.00GHz
- 2 sockets
- 8 cores per socket
- 32 vcpus
- memory
- 128GB
- 1333Mhz
- network adapters
- Chelsio T420-C
- 2 x 10Gb/s
- LACP bond
- 9000 MTU
您可能已经注意到我们没有提到存储磁盘,那是因为 Ceph OSD 被配置为使用内存支持池。请记住,我们将重点放在 Ceph 客户端性能上,而不是 Linux OSD 端的存储 iops。
我们使用了一个运行在 Ubuntu 20.04 之上的一体化 Ceph 16 集群。在客户端,我们涵盖了Windows Server 2016、Windows Server 2019以及Ubuntu 20.04。
基准测试是使用fio工具执行的。它是高度可配置的,常用于 Ceph 基准测试,最重要的是,它是跨平台的。
下面是一个示例 FIO 命令行调用,供有兴趣重复测试的任何人使用。我们正在使用直接 IO、2MB 块、64 个并发异步 IO 操作,测试超过 8GB 块的各种 IO 操作。测试块设备时,我们使用原始磁盘设备,而不是使用 NTFS 或 ReFS 分区。请注意,这在 Windows 上可能需要 fio>=3.20。
fio --randrepeat=1 --direct=1 --gtod_reduce=1 --name=test --bs=2M --iodepth=64 --size=8G --readwrite=randwrite --numjobs=1 --filename=\\.\PhysicalDrive2
Windows 调优:
以下设置可以提高 IO 吞吐量:
- Windows 电源计划——很少有人认为这是服务器的问题,但默认情况下,“高性能”电源计划默认不启用,这会导致 CPU 节流
- 将 Ceph 和 FIO 二进制文件添加到 Windows Defender 白名单
- 使用巨型帧 – 我们注意到性能提高了 15%
- 在 Windows Server 2016 上启用 CUBIC TCP 拥塞算法
检测结果:
裸机 RBD 和 CephFS IO
让我们直接看 RBD 和 CephFS 基准测试结果。请注意,我们使用 MB/s 来测量速度(越高越好)。
值得一提的是,RBD 缓存已被禁用。正如我们所见,Windows Server 2019 设法提供了令人印象深刻的 IO 吞吐量。Windows Server 2016 没有那么快,但它仍然设法胜过 Linux RBD 客户端,包括 krbd。我们在 CephFS 方面看到了相同的模式。
我们已经使用多合一的 Ceph 集群测试了 iSCSI 网关。考虑到 iSCSI 网关不能很好地扩展,性能瓶颈可能会随着更大的 Ceph 集群变得更加严重。
+-----------+------------+--------+-------+--------+-------+ | OS | tool | rand_r | seq_r | rand_w | seq_w | +-----------+------------+--------+-------+--------+-------+ | WS2016 | rbd-wnbd | 854 | 925 | 807 | 802 | | WS2019 | rbd-wnbd | 1317 | 1320 | 1512 | 1549 | | WS2019 | iscsi-gw | 324 | 319 | 624 | 635 | | Ubuntu 20 | krbd | 696 | 669 | 659 | 668 | | Ubuntu 20 | rbd-nbd | 559 | 567 | 372 | 407 | | | | | | | | | WS2016 | ceph-dokan | 642 | 605 | 690 | 676 | | WS2019 | ceph-dokan | 988 | 948 | 938 | 935 | | Ubuntu 20 | ceph-fuse | 162 | 181 | 121 | 138 | | Ubuntu 20 | kern ceph | 687 | 663 | 677 | 674 | +-----------+------------+--------+-------+--------+-------+
虚拟机
提供虚拟机块存储也是 Ceph 的主要用例之一。以下是Ubuntu 20.04 上Hyper-V Server 2019和KVM的测试结果,它们都运行从 RBD 映像启动的Ubuntu 20.04和Windows Server 2019 VM。
+-----------------------+--------------+--------------+ | Hypervisor \ Guest OS | WS 2019 | Ubuntu 20.04 | +-----------------------+------+-------+------+-------+ | | read | write | read | write | +-----------------------+------+-------+------+-------+ | Hyper-V | 1242 | 1697 | 382 | 291 | | KVM | 947 | 558 | 539 | 321 | +-----------------------+------+-------+------+-------+
WS 2019 Hyper-V VM 设法获得了几乎原生的 IO 速度。有趣的是,即使在 KVM 上,它的表现也比 Ubuntu 客户机要好,这可能值得研究。
WINBD
如上文所述,我们最初的方法是使用 NBD 协议附加 RBD 镜像。这并没有提供我们希望的性能,主要是由于Winsock Kernel (WSK)框架,这就是我们从头开始实施更高效的 IO 通道的原因。为方便起见,您仍然可以将 WNBD 作为独立的 NBD 客户端用于其他目的,在这种情况下,您可能有兴趣了解它的性能如何。在此测试环境中,它设法在 WS 2019 上提供 933MB/s 的速度,在 WS 2016 上提供 280MB/s 的速度。
目前,rbd-wnbd使用DeviceIoControl来检索 IO 请求并将 IO 回复发送回 WNBD 驱动程序,这也称为反向调用。与 RBD NBD 服务器不同,libwnbd允许调整 IO 调度工作者的数量。下表显示了工人数量如何影响性能。请记住,在这种特定情况下,我们正在对驱动程序连接进行基准测试,因此没有数据从/传输到 Ceph 集群。这让我们大致了解了 WNBD 可以提供的最大理论带宽,使可用 CPU 完全饱和:
+---------+------------------+ | Workers | Bandwidth (MB/s) | +---------+------------------+ | 1 | 1518 | | 2 | 2917 | | 3 | 4240 | | 4 | 5496 | | 8 | 11059 | | 16 | 13209 | | 32 | 12390 | +---------+------------------+
RBD 命令
除了 IO 性能,我们还对确保可以同时管理大量磁盘感兴趣。为此,我们编写了一个简单的 Python 脚本(
https://raw.githubusercontent.com/petrutlucian94/ceph_test/master/scale_test.py),该脚本(https://raw.githubusercontent.com/petrutlucian94/ceph_test/master/scale_test.py)创建一个临时映像,将其附加到主机,执行各种 IO 操作,然后对其进行清理。这是 1000 次迭代的测试结果,每次 50 次。该测试对于提高 RBD 性能和稳定性至关重要。+---------------------------------------------------------------------------------+ | Duration (s) | +--------------------------+----------+----------+-----------+----------+---------+ | function | min | max | total | mean | std_dev | +--------------------------+----------+----------+-----------+----------+---------+ | TestRunner.run | 283.5339 | 283.5339 | 283.5339 | 283.5339 | 0.0000 | | RbdTest.initialize | 0.3906 | 10.4063 | 3483.5180 | 3.4835 | 1.5909 | | RbdImage.create | 0.0938 | 5.5157 | 662.8653 | 0.6629 | 0.6021 | | RbdImage.map | 0.2656 | 9.3126 | 2820.6527 | 2.8207 | 1.5056 | | RbdImage.get_disk_number | 0.0625 | 8.3751 | 1888.0343 | 1.8880 | 1.5171 | | RbdImage._wait_for_disk | 0.0000 | 2.0156 | 39.1411 | 0.0391 | 0.1209 | | RbdFioTest.run | 2.3125 | 13.4532 | 8450.7165 | 8.4507 | 2.2068 | | RbdImage.unmap | 0.0781 | 6.6719 | 1031.3077 | 1.0313 | 0.7988 | | RbdImage.remove | 0.1406 | 8.6563 | 977.1185 | 0.9771 | 0.8341 | +--------------------------+----------+----------+-----------+----------+---------+
总结:
在随着Ceph的快速发展,跨平台的兼容性会越来越好。
参考:
- https://cloudbase.it/ceph-on-windows-performance/
- https://cloudbase.it/ceph-on-windows-part-1/