0

一篇学会 Ceph 性能测试

 2 years ago
source link: https://www.51cto.com/article/716909.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一篇学会 Ceph 性能测试

作者:wanger 2022-08-23 08:00:59
在进行真正的基准测试之前,最好通过测量连接到群集节点的硬件(如磁盘和网络)的性能,为预期的最大性能建立一个基准。磁盘性能基线测试将分两步完成。

在将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
图片

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK