在将Ceph集群用于生产工作之前,应该首先对它进行基准测试。基准测试提供关于群集在读、写、延迟和其他工作负载期间执行情况的大致结果。在进行真正的基准测试之前,最好通过测量连接到群集节点的硬件(如磁盘和网络)的性能,为预期的最大性能建立一个基准。磁盘性能基线测试将分两步完成。首先,我们将测量单个磁盘的性能,在此之后,将同时测量连接到一个Ceph OSD节点的所有磁盘性能。为了获得磁盘读写性能,我们可以使用dd命令并设置oflag参数以直接绕过磁盘缓存以获得真实的结果。
测试单磁盘写入性能
清空页面缓存;
echo 3 > /proc/sys/vm/drop_caches
使用dd编写一个大小为10G的名为deleteme的文件,该文件填充为0/dev/zero作为Ceph OSD安装目录的输入文件,即/var/lib/ceph/osd/cep-0/:
dd if=/dev/zero of=/var/lib/ceph/osd/ceph-0/zero bs=10G count=1
重复执行后取平均值,我这边没有绕过内核缓存,所以测试出来的结果会偏高,(ubuntu系统执行dd绕过内核缓存的参数好像不支持。)
接下来可以测试单个节点上所有的osd写入性能 我这边每台宿主机上osd只有一个,所以数据与上面相同;
for i in `mount | grep osd | awk '{print $3}'`; do (dd if=/dev/zero of=$i/zero bs=10G count=1 &) ; done
osd单盘读性能测试
清空页面缓存;
echo 3 > /proc/sys/vm/drop_caches
dd if=/var/lib/ceph/osd/ceph-0/deleteme of=/dev/null bs=10G count=1 iflag=direct
接下来可以测试单个节点上所有的osd写入性能 我这边每台宿主机上osd只有一个,所以数据与上面相同;
echo 3 > /proc/sys/vm/drop_caches
for i in `mount | grep osd | awk '{print $3}'`; do (dd if=$i/zero of=/dev/null bs=10G count=1 &); done
网络基线性能
测试Ceph OSD节点之间的网络的基线性能。需要在Ceph节点上安装了iper包。iperf是一个简单的点对点网络带宽测试器,工作在c/s模型上。要启动网络基准测试,可以在第一个Ceph节点上使用server选项,在第二个Ceph节点中使用client选项执行iperf。
安装iperf;
apt install iperf
node1节点作为server,使用6900端口;
node2节点作为client;
由于我这边是千兆网络,所以实际网络带宽不是很高,生产环境还是要用万兆网络进行连接;
rados bench基准测试
Ceph附带一个称为rados bench的内置基准测试工具,可以在池上测试Ceph集群的性能。rados bench工具支持写入、顺序读取和随机读取基准测试,并且它还允许清理临时基准数据。接下来我们对libvirt-pool池进行写10秒的测试,--no-cleanup写完之后不清里测试数据,后面的测试会用到这些测试数据;
rados bench -p libvirt-pool 10 write --no-cleanup
对libvirt-pool池进行顺序读取的测试;
rados bench -p libvirt-pool 10 seq
可以看到实际用了不到十秒的时间就已经读完了测试数据,原因就是读操作比写操作快,测试写数据用了十秒,度相同的数据肯定用不到十秒的;
随机读取数据测试;
rados bench -p libvirt-pool 10 rand
rados bench的语法如下;
rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t --no-cleanup
-p: -p或-poo指定池名.
<seconds>:测试时间(以秒为单位)。
<writelseqlrand>:测试类型,例如写入、顺序读取或随机读取。
-b: 块大小,默认情况下块大小为4M。
-t: 并发线程数;默认值为16
--no-clean up:由rados工作台写入池的临时数据,不被清除。当这些数据与顺序读取或随机读取一起使用时,它们将被用于读取操作。默认情况下数据会清理。
RADOS load-gen
rados load-gen 是CEPH提供的另一个测试工具, 像它的命名一样,rados load-gen 工具能用来在Ceph cluster上生成负载和用于模拟高负载场景。
rados -p libvirt-pool load-gen --num-objects 200 --min-object-size 4M --max-object-size 8M --max-ops 10 --read-percent 0 --min-op-len 1M --max-op-len 4M --target-throughput 2G --run-length 20
命令行格式及参数说明:
rados -p <pool-name> load-gen
--num-objects: 生成测试用的对象数,默认 200
--min-object-size: 测试对象的最小size,默认 1KB,单位byte
--max-object-size: 测试对象的最大size,默认 5GB,单位byte
--min-ops: 最小IO操作数,相当于iodepth
--max-ops: 最大IO操作数,相当于iodepth
--min-op-len: 压测IO的最小operation size,默认 1KB,单位byte
--max-op-len: 压测IO的最大operation size,默认 2MB,单位byte
--max-backlog: 一次提交IO的吞吐量上限,默认10MB/s (单位MB)
--percent: 读操作所占的百分百
--target-throughput: 目标吞吐量,默认 5MB/s (单位MB)
--run-length: 运行的时间,默认60s,单位秒
还可以使用watch ceph-s命令或ceph-w监视集群的读写速度/操作状态;同时,RADOS load-gen将运行,以查看运行情况。
块设备基准测试
ceph rbd命令行接口提供了一个称为bench-write的选项,这是一个在Ceph Rados Block Device上执行写基准测试操作的工具。可以使用bench-write工具的不通选项来调整块大小,线程数和io模式。首先创建一个块设备并将其映射至ceph客户端;
rbd create libvirt-pool/289 --size 10240 --image-feature layering
rbd info -p libvirt-pool --image 289
rbd map libvirt-pool/289
rbd showmapped
块设备上创建文件系统并挂载;
mkfs.xfs /dev/rbd2
mkdir -p /mnt/289
mount /dev/rbd2 /mnt/289
df -h /mnt/289
对289写入5G大小的测试;
rbd bench-write libvirt-pool/289 --io-total 5368709200
rbd bench-write 的语法为:
rbd bench-write <RBD image name>
--io-size:写入大小,单位 byte,默认4M;
--io-threads:线程数,默认 16;
--io-total:写入总字节,单位为字节,默认 1024M;
--io-pattern <seq|rand>:写模式,默认为 seq 即顺序写;
使用fio对ceph rbd进行基准测试;
安装fio;
apt install fio -y
写入fio配置文件;
vim write.fio
[write-4M]
ioengine=rbd
direct=1 # 排除OS的IO缓存机制的影响
size=5g # 每个fio进程/线程的最大读写
lockmem=1G # 锁定所使用的内存大小
runtime=30 # 运行时间
group_reporting # 多个job合并出报告
numjobs=1
iodepth=32
pool=libvirt-pool
clientname=admin
rbdname=289
rw=write #读写模式,支持随机读写、顺序读写
bs=4M
filename=/dev/rbd0
启动fio测试;
fio write.fio