cephfs简介
cephfs是ceph提供的兼容POSIX协议的文件系统,对比rbd和rgw功能,这个是ceph里最晚满足production ready的一个功能,它底层还是使用rados存储数据
cephfs的架构
使用cephfs的两种方式
- cephfs kernel module
- cephfs-fuse
从上面的架构可以看出,cephfs-fuse的IO path比较长,性能会比cephfs kernel module的方式差一些;
client端访问cephfs的流程
- client端与mds节点通讯,获取metadata信息(metadata也存在osd上)
- client直接写数据到osd
cephfs测试环境
三台物理机搭建了ceph集群,配置了Active-Standby的MDS,作为测试cephfs的cluster,详细配置如下:
模块 | 版本 |
---|---|
Ceph Version | Jewel 10.2.7 |
Ceph Cluster OS | CentOS Linux release 7.2.1511 (Core) |
Ceph Cluster kernel version | 3.10.0-327.el7.x86_64 |
Cephfs Client OS | CentOS Linux release 7.2.1511 (Core) |
Cephfs kernel version | 4.11.3-1.el7.elrepo.x86_64 |
三台物理机上,每个上面有10个4T 7200RPM SATA盘,两个480GB的SATA SSD盘做journal设备,每个SSD盘分出5个20GB的分区做5个OSD的journal。
三个物理机上部署了三个monitor,其中两台部署了两个MDS。
Ceph默认配置replica=3,所以三台物理机组成的Ceph Cluster的整体写性能约等于一台物理机上的硬件的性能。
每个物理机上,2个SSD做10个OSD的journal,其整体性能约为:2 * (单个ssd盘的性能)
或 10 * (单个sata盘的性能)
使用的SSD盘型号为:Intel S3500系列,其性能指标为:
参数 | 性能 |
---|---|
容量 | 480GB |
顺序读取(最高) | 500 MB/s |
顺序写入(最高) | 410 MB/s |
随机读取(100% 跨度) | 75000 IOPS |
随机写入(100% 跨度) | 11000 IOPS |
创建mds
使用ceph-deploy部署ceph mds很方便,只需要简单的一条命令就搞定,不过它依赖之前ceph-deploy时候生成的一些配置和keyring文件;
在之前部署ceph集群的节点目录,执行ceph-deploy mds create:
1 | # ceph-deploy --overwrite-conf mds create cephfs-host2:mds-daemon-37 |
创建测试cephfs
在上述的测试集群里搭建cephfs,因为都是内部使用,测试集群没有打开ceph的认证。
创建cephfs的步骤如下
1 | # ceph osd pool create cephfs_data 512 512 // 创建data pool |
查看cephfs对应的active MDS
1 | # ceph mds stat |
cephfs测试
为了评估cephfs的稳定性和性能,结合常用的测试场景和测试工具,我们对cephfs的测试进行了分类,然后在选定的另一台测试节点上mount并测试cephfs。
在测试节点mount上cephfs
1 | [root@cephfs-client yangguanjun]# mount -t ceph 10.1.1.6:6789:/ /home/yangguanjun/cephfs/ |
cephfs功能测试
cephfs是兼容POSIX协议的文件系统,这里通过手动和自动测试工具的方式来验证cephfs的可用性。
手动模式
通过手动模式测试常见的文件系统操作
1 | 创建测试dir和file |
自动测试工具
这里使用fstest测试工具对cephfs进行测试。
fstest是一套简化版的文件系统POSIX兼容性测试套件,它可以工作在FreeBSD, Solaris, Linux上用于测试UFS, ZFS, ext3, XFS and the NTFS-3G等文件系统。fstest目前有3601个回归测试用例,测试的系统调用覆盖chmod, chown, link, mkdir, mkfifo, open, rename, rmdir, symlink, truncate, unlink。
- 获取fstest
1 | 网站:http://www.tuxera.com/community/posix-test-suite/ |
- 安装fstest
1 | # yum install -y libacl-devel |
- 运行fstest
1 | # cd /home/yangguanjun/cephfs/ |
结论
cephfs的功能性验证通过。
cephfs性能测试
文件系统的性能测试工具有很多,这里我们选择常用的dd, fio, iozone和filebench。
cephfs的所有数据和元数据都是直接存在RADOS上的,并且cephfs支持stripe配置,这里我们做了以下stripe配置,作为测试cephfs性能的几种应用场景:
stripe_unit=1M, stripe_count=4, object_size=4M
条带大小为1M,条带数目为4,object大小为4M
1
2配置测试目录attr
setfattr -n ceph.dir.layout -v "stripe_unit=1048576 stripe_count=4 object_size=4194304" dir-1M-4-4Mstripe_unit=4M, stripe_count=1, object_size=4M
ceph的默认配置:无条带化
1
2配置测试目录attr
setfattr -n ceph.dir.layout -v "stripe_unit= 4194304 stripe_count=1 object_size=4194304" dir-4M-1-4Mstripe_unit=4M, stripe_count=4, object_size=64M
条带大小为4M,条带数目为4,object大小为64M
1
2配置测试目录attr
setfattr -n ceph.dir.layout -v "stripe_unit=4194304 stripe_count=4 object_size=67108864" dir-4M-4-64M
参考
dd
dd是linux系统常用的测试设备和系统性能的工具。
测试分类与测试命令
Direct IO
1
2写:dd if=/dev/zero of=tstfile bs=<bs-size> count=<2G/bs-size> oflag=direct
读:dd if=tstfile of=/dev/null bs=<bs-size> count=<2G/bs-size> iflag=directSync IO
1
2写:dd if=/dev/zero of=tstfile bs=<bs-size> count=<2G/bs-size> oflag=sync
读:dd if=tstfile of=/dev/null bs=<bs-size> count=<2G/bs-size> iflag=syncNormal IO
1
2写:dd if=/dev/zero of=tstfile bs=<bs-size> count=<2G/bs-size>
读:dd if=tstfile of=/dev/null bs=<bs-size> count=<2G/bs-size>
fio
fio是一个I/O标准测试和硬件压力验证工具,它支持13种不同类型的I/O引擎(sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio等),I/O priorities (for newer Linux kernels), rate I/O, forked or threaded jobs等等。fio可以支持块设备和文件系统测试,广泛用于标准测试、QA、验证测试等,支持Linux, FreeBSD, NetBSD, OS X, OpenSolaris, AIX, HP-UX, Windows等操作系统。
fio安装
1 | # yum install -y fio |
测试分类与测试命令
固定配置
1 | -filename=tstfile 指定测试文件的name |
测试bandwidth时
- -ioengine=libaio/sync
- -bs=512k/1M/4M/16M
- -rw=write/read
- -iodepth=64 -iodepth_batch=8 -iodepth_batch_complete=8
测试iops时:
- -ioengine=libaio
- -bs=4k
- -runtime=300
- -rw=randwrite/randread
- -iodepth=64 -iodepth_batch=1 -iodepth_batch_complete=1
命令示例:
1 | 测试bandwidth: |
iozone
iozone是目前应用非常广泛的文件系统测试标准工具,它能够产生并测量各种的操作性能,包括read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read, pread ,mmap, aio_read, aio_write等操作。Iozone目前已经被移植到各种体系结构计算机和操作系统上,广泛用于文件系统性能测试、分析与评估的标准工具。
iozone安装
1 | # wget http://www.iozone.org/src/current/iozone-3-465.i386.rpm |
测试分类与测试命令
iozone参数说明:
1 | 指定使用自动模式 |
测试DIRET IO / SYNC IO - 非throughput模式
不指定threads,测试单个线程的iozone性能
1
2iozone -a -i 0 -i 1 -i 2 -n 1m -g 10G -y 128k -q 16m -I -Rb iozone-directio-output.xls
iozone -a -i 0 -i 1 -i 2 -n 1m -g 10G -y 128k -q 16m -o -Rb iozone-syncio-output.xls测试系统吞吐量 - throughput模式
指定threads=16,获取整个系统的throughput
1
2iozone -a -i 0 -i 1 -i 2 -r 16m -s 2G -I -t 16 -Rb iozone-directio-throughput-output.xls
iozone -a -i 0 -i 1 -i 2 -r 16m -s 2G -o -t 16 -Rb iozone-syncio-throughput-output.xls
filebench
Filebench 是一款文件系统性能的自动化测试工具,它通过快速模拟真实应用服务器的负载来测试文件系统的性能。它不仅可以仿真文件系统微操作(如 copyfiles, createfiles, randomread, randomwrite ),而且可以仿真复杂的应用程序(如 varmail, fileserver, oltp, dss, webserver, webproxy )。 Filebench 比较适合用来测试文件服务器性能,但同时也是一款负载自动生成工具,也可用于文件系统的性能。
filebench安装
1 | 源码:https://github.com/filebench/filebench |
安装后,在目录 /usr/local/share/filebench/workloads/
下有很多定义好的workload,可以直接拿来使用。
配置里面的 $dir
为测试cephfs的目录,若文件后没有 run
测试分类
filebench有很多定义好的workload,如下:
1 | # ls /usr/local/share/filebench/workloads/ |
因为最新的filebench修改了变量的定义,所以这里面的一些workload并不能成功运行,只需选择可用的有代表性的workload测试即可。
参考
结论
- cephfs的direct IO性能有限
- cephfs读写能跑满ceph cluster集群性能
- 客户端缓存和OSD缓存对读写的影响很大
cephfs稳定性测试
为了测试cephfs是否能在线上提供服务,需要测试下其稳定性,这里采用两种方式测试。
读写数据模式
针对读写数据模式,我们选择工具fio
,在cephfs client端长时间运行,看会不会报错。
测试逻辑大概如下:
1 | # fio循环测试读写 |
读写元数据模式
针对读写元数据模式,我们采用自写脚本,大规模创建目录、文件、写很小数据到文件中,在cephfs client端长时间运行,看会不会报错。
测试逻辑大概如下:
1 | # 百万级别的文件个数 |
结论
通过几天的连续测试,cephfs一切正常,这说明cephfs是可以应用到生产环境的。
但在上亿级别的文件测试中,也遇到点问题,会在下面章节的问题里说明。
cephfs异常测试
cephfs的功能依赖于MDS和Ceph Cluster,关键的元数据都通过MDS获取,这里测试的异常也主要基于MDS的异常进行分类的。
查看ceph MDS与interl和timeout相关的配置有:
1 | OPTION(mds_tick_interval, OPT_FLOAT, 5) |
所以这里测试对MDS stop/start的时间间隔取为:2s,10s,60s
测试分类
- 主从MDS
- 单MDS
测试中启停MDS service的命令为:
1 | # systemctl stop ceph-mds.target |
测试结果
- fio随机写单个文件
MDS模式 | 启停interval | io影响 |
---|---|---|
单MDS | 2s, 10s | 无 |
60s | 约40s时影响IO | |
主从MDS | 2s, 10s | 无 |
60s | 主从不同时停止时无影响 同时停止主从MDS时,影响与单MDS一致 |
下面展示了单MDS停止约60s的时候,对fio测试的影响:
- iozone测试direct IO
MDS模式 | 启停interval | io影响 |
---|---|---|
单MDS | 2s,10s,60s | 对当前文件的IO影响同fio测试 对读写新文件的影响会立刻体现 |
主从MDS | 2s,10s,60s | 主从不同时停止时无影响 同时停止主从MDS时,影响与单MDS一致 |
结论
- 单MDS的情况下,短暂的MDS crush并不会影响客户端对一个file的读写
- 单MDS的情况下,MDS crush后,client端对没有缓存过caps的文件操作会hang住
- 主从MDS的情况下,只要有一个MDS正常,cephfs的服务就不会中断
- 主从MDS的情况下,两个MDS都crush后,影响与单MDS的一致
所以生产环境中,我们建议配置主从MDS的模式,提高cephfs的高可用性。
问题
cephfs配置较大stripe unit的问题
测试中,对于指定cephfs的laylout如下时,发现了一个cephfs的bug,已经提交给ceph社区.
1 | # setfattr -n ceph.dir.layout -v "stripe_unit=67108864 stripe_count=1 object_size=67108864" dir-64M-1-64M |
详情参阅:http://tracker.ceph.com/issues/20528
最新更新
cephfs client端的配置限制了read message的最大size为16M。
==所以实际使用中的 stripe_unit 不能大于16M==
cephfs读写上亿级文件
为了查看cephfs对大规模小文件应用的支持效果,我们这里通过脚本测试了5亿个文件的场景。
测试的脚本如下:
1 |
|
问题:
- 单线程运行耗时较长
- 单线程删除文件时,rm命令报
No space left on device
错误 - 单线程删除文件时,日志中报
_send skipping beacon, heartbeat map not healthy
- 多线程并发创建、删除测试和深目录层级测试待验证
总结
经过功能测试、性能测试、稳定性测试和异常测试后,我们得出如下结论:
- cephfs是production ready的,能满足基本生产环境对文件存储的需求
- cephfs的主从MDS是稳定的
- cephfs的direct IO性能有限,分析后明确是cephfs kernel client的IO处理逻辑限制的
- cephfs是能跑满整个ceph cluster集群性能的
- 默认的stripe模式下(stripe unit=4M, stripe count=1, object size=4M),cephfs的性能就挺好
- 受到cephfs client端的系统缓存影响,非direct IO的读写性能都会比较高,这个不具有太大参考意义