一篇学会 Ceph 性能测试

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

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

图片

责任编辑:武晓燕 来源: 运维开发故事
相关推荐

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2022-03-02 11:37:57

参数性能调优

2021-06-02 08:25:44

性能优化Repository

2021-05-11 08:54:59

建造者模式设计

2021-07-06 08:59:18

抽象工厂模式

2023-01-03 08:31:54

Spring读取器配置

2021-07-02 09:45:29

MySQL InnoDB数据

2021-07-05 22:11:38

MySQL体系架构

2022-08-26 09:29:01

Kubernetes策略Master

2023-11-28 08:29:31

Rust内存布局

2022-04-12 08:30:52

回调函数代码调试

2021-10-27 09:59:35

存储

2021-07-02 08:51:29

源码参数Thread

2021-07-16 22:43:10

Go并发Golang

2021-09-28 08:59:30

复原IP地址

2023-11-01 09:07:01

Spring装配源码

2023-03-13 21:38:08

TCP数据IP地址

2021-10-29 07:35:32

Linux 命令系统

2021-10-14 10:22:19

逃逸JVM性能
点赞
收藏

51CTO技术栈公众号