ceph性能测试

2022-09-15 10:26:41 浏览数 (1)

在将Ceph集群用于生产工作之前,应该首先对它进行基准测试。基准测试提供关于群集在读、写、延迟和其他工作负载期间执行情况的大致结果。在进行真正的基准测试之前,最好通过测量连接到群集节点的硬件(如磁盘和网络)的性能,为预期的最大性能建立一个基准。磁盘性能基线测试将分两步完成。首先,我们将测量单个磁盘的性能,在此之后,将同时测量连接到一个Ceph OSD节点的所有磁盘性能。为了获得磁盘读写性能,我们可以使用dd命令并设置oflag参数以直接绕过磁盘缓存以获得真实的结果。

测试单磁盘写入性能

清空页面缓存

代码语言:javascript复制
echo 3 > /proc/sys/vm/drop_caches

使用dd编写一个大小为10G的名为deleteme的文件,该文件填充为0/dev/zero作为Ceph OSD安装目录的输入文件,即/var/lib/ceph/osd/cep-0/:

代码语言:javascript复制
dd if=/dev/zero of=/var/lib/ceph/osd/ceph-0/zero   bs=10G count=1   

重复执行后取平均值,我这边没有绕过内核缓存,所以测试出来的结果会偏高,(ubuntu系统执行dd绕过内核缓存的参数好像不支持。)

接下来可以测试单个节点上所有的osd写入性能 我这边每台宿主机上osd只有一个,所以数据与上面相同

代码语言:javascript复制
for i in `mount | grep osd | awk '{print $3}'`;   do (dd if=/dev/zero   of=$i/zero bs=10G count=1  &) ; done 

osd单盘读性能测试

清空页面缓存

代码语言:javascript复制
echo 3 > /proc/sys/vm/drop_caches
代码语言:javascript复制
dd if=/var/lib/ceph/osd/ceph-0/deleteme of=/dev/null bs=10G     count=1 iflag=direct

接下来可以测试单个节点上所有的osd写入性能 我这边每台宿主机上osd只有一个,所以数据与上面相同

代码语言:javascript复制
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

代码语言:javascript复制
apt install iperf

node1节点作为server,使用6900端口

node2节点作为client

由于我这边是千兆网络,所以实际网络带宽不是很高,生产环境还是要用万兆网络进行连接

rados bench基准测试

Ceph附带一个称为rados bench的内置基准测试工具,可以在池上测试Ceph集群的性能。rados bench工具支持写入、顺序读取和随机读取基准测试,并且它还允许清理临时基准数据。接下来我们对libvirt-pool池进行写10秒的测试,--no-cleanup写完之后不清里测试数据,后面的测试会用到这些测试数据

代码语言:javascript复制
 rados bench -p libvirt-pool 10 write --no-cleanup

对libvirt-pool池进行顺序读取的测试

代码语言:javascript复制
rados bench -p libvirt-pool 10 seq

可以看到实际用了不到十秒的时间就已经读完了测试数据,原因就是读操作比写操作快,测试写数据用了十秒,度相同的数据肯定用不到十秒的

随机读取数据测试

代码语言:javascript复制
rados bench -p libvirt-pool 10 rand

rados bench的语法如下

代码语言:javascript复制
rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t  --no-cleanup
代码语言:javascript复制
-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上生成负载和用于模拟高负载场景。

代码语言:javascript复制
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

命令行格式及参数说明:

代码语言:javascript复制
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客户端

代码语言:javascript复制
rbd create libvirt-pool/289 --size 10240 --image-feature layering       
rbd info -p libvirt-pool --image 289      
rbd map  libvirt-pool/289  
rbd showmapped

块设备上创建文件系统并挂载

代码语言:javascript复制
mkfs.xfs /dev/rbd2        
mkdir -p /mnt/289  
mount /dev/rbd2 /mnt/289   
df -h /mnt/289

对289写入5G大小的测试

代码语言:javascript复制
rbd bench-write libvirt-pool/289 --io-total 5368709200

rbd bench-write 的语法为:

代码语言:javascript复制
rbd bench-write <RBD image name>
代码语言:javascript复制
--io-size:写入大小,单位 byte,默认4M;
--io-threads:线程数,默认 16;
--io-total:写入总字节,单位为字节,默认 1024M;
--io-pattern <seq|rand>:写模式,默认为 seq 即顺序写;

使用fio对ceph rbd进行基准测试

安装fio

代码语言:javascript复制
apt install fio -y

写入fio配置文件

代码语言:javascript复制
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测试

代码语言:javascript复制
fio write.fio

image.png

公众号:运维开发故事

github:https://github.com/orgs/sunsharing-note/dashboard

博客:https://www.devopstory.cn

爱生活,爱运维

我是wanger,《运维开发故事》公众号团队中的一员,一线运维农民工,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!

关注我,不定期维护优质内容

温馨提示

如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!

你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。

0 人点赞