cephfs的测试简报

cephfs简介

cephfs是ceph提供的兼容POSIX协议的文件系统,对比rbd和rgw功能,这个是ceph里最晚满足production ready的一个功能,它底层还是使用rados存储数据

cephfs的架构

cephfs arch

使用cephfs的两种方式

  1. cephfs kernel module
  2. cephfs-fuse

从上面的架构可以看出,cephfs-fuse的IO path比较长,性能会比cephfs kernel module的方式差一些;

client端访问cephfs的流程

mds work

  1. client端与mds节点通讯,获取metadata信息(metadata也存在osd上)
  2. 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。

mds work

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
2
3
4
5
# ceph-deploy --overwrite-conf mds create cephfs-host2:mds-daemon-37
# ceph-deploy --overwrite-conf mds create cephfs-host3:mds-daemon-38
// 去节点检查下daemon
[root@cephfs-host2 yangguanjun]# ps ax | grep ceph-mds
283564 ? Ssl 0:38 /usr/bin/ceph-mds -f --cluster ceph --id mds-daemon-37 --setuser ceph --setgroup ceph

创建测试cephfs

在上述的测试集群里搭建cephfs,因为都是内部使用,测试集群没有打开ceph的认证。

创建cephfs的步骤如下

1
2
3
4
5
6
7
8
# ceph osd pool create cephfs_data 512 512 // 创建data pool
pool 'cephfs_data' created
# ceph osd pool create cephfs_metadata 512 512 // 创建metadata pool
pool 'cephfs_metadata' created
# ceph fs new tstfs cephfs_metadata cephfs_data // 创建cephfs
new fs with metadata pool 1 and data pool 2
# ceph fs ls
name: tstfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

查看cephfs对应的active MDS

1
2
# ceph mds stat
e229: 1/1/1 up {0=mds-daemon-37=up:active}, 1 up:standby

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
创建测试dir和file
# cd /home/yangguanjun/cephfs/
# mkdir tstdir
# cd tstdir
# touch tstfile

测试file的读写
# echo "hello cephfs" > tstfile
# cat tstfile
hello cephfs

测试file的chmod
# ll tstfile
-rw-r--r-- 1 root root 13 Jul 7 10:33 tstfile
# chmod 755 tstfile
# ll tstfile
-rwxr-xr-x 1 root root 13 Jul 7 10:33 tstfile

测试file的chown
# chown yangguanjun:yangguanjun tstfile
# ll tstfile
-rwxr-xr-x 1 yangguanjun yangguanjun 13 Jul 7 10:33 tstfile

测试file的symlink
# ln -s tstfile lnfile
# ll lnfile
lrwxrwxrwx 1 root root 7 Jul 7 10:31 lnfile -> tstfile

删除测试dir和file
# rm -f tstfile
# cd ../
# rm -rf tstdir

自动测试工具

这里使用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
2
网站:http://www.tuxera.com/community/posix-test-suite/
# wget http://tuxera.com/sw/qa/pjd-fstest-20090130-RC.tgz
  • 安装fstest
1
2
3
4
5
# yum install -y libacl-devel
# tar -zxf pjd-fstest-20090130-RC.tgz
# cd pjd-fstest-20090130-RC
# make
gcc -Wall -DHAS_ACL -lacl fstest.c -o fstest
  • 运行fstest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# cd /home/yangguanjun/cephfs/
# prove -r /home/yangguanjun/pjd-fstest-20090130-RC/
/home/yangguanjun/pjd-fstest-20090130-RC/tests/chflags/00.t ... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/chflags/13.t ... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/chmod/00.t ..... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/chmod/11.t ..... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/chown/00.t ..... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/chown/10.t ..... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/link/00.t ...... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/link/17.t ...... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/mkdir/00.t ..... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/mkdir/12.t ..... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/mkfifo/00.t .... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/mkfifo/12.t .... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/open/00.t ...... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/open/23.t ...... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/rename/00.t .... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/rename/20.t .... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/rmdir/00.t ..... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/rmdir/15.t ..... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/symlink/00.t ... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/symlink/12.t ... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/truncate/00.t .. ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/truncate/14.t .. ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/unlink/00.t .... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/unlink/13.t .... ok
/home/yangguanjun/pjd-fstest-20090130-RC/tests/xacl/00.t ...... ok
...
/home/yangguanjun/pjd-fstest-20090130-RC/tests/xacl/06.t ...... ok
All tests successful.
Files=191, Tests=1964, 92 wallclock secs ( 0.63 usr 0.11 sys + 4.58 cusr 10.40 csys = 15.72 CPU)
Result: PASS

结论

cephfs的功能性验证通过。

cephfs性能测试

文件系统的性能测试工具有很多,这里我们选择常用的dd, fio, iozone和filebench。

cephfs的所有数据和元数据都是直接存在RADOS上的,并且cephfs支持stripe配置,这里我们做了以下stripe配置,作为测试cephfs性能的几种应用场景:

  1. 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-4M
  2. stripe_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-4M
  3. stripe_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

参考

cephfs的stripe配置

dd

dd是linux系统常用的测试设备和系统性能的工具。

测试分类与测试命令

  1. 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=direct
  2. Sync 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=sync
  3. Normal 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
2
3
4
5
-filename=tstfile   指定测试文件的name
-size=20G 指定测试文件的size为20G
-direct=1 指定测试IO为DIRECT IO
-thread 指定使用thread模式
-name=fio-tst-name 指定job name

测试bandwidth时

  1. -ioengine=libaio/sync
  2. -bs=512k/1M/4M/16M
  3. -rw=write/read
  4. -iodepth=64 -iodepth_batch=8 -iodepth_batch_complete=8

测试iops时:

  1. -ioengine=libaio
  2. -bs=4k
  3. -runtime=300
  4. -rw=randwrite/randread
  5. -iodepth=64 -iodepth_batch=1 -iodepth_batch_complete=1

命令示例:

1
2
3
4
5
测试bandwidth:
fio -filename=tstfile -size=10G -direct=1 -ioengine=libaio -thread -bs=512k -rw=write -iodepth=64 -iodepth_batch_submit=8 -iodepth_batch_complete=8 -name=write-bw-tst

测试iops:
fio -filename=tstfile -size=10G -direct=1 -ioengine=libaio -thread -bs=4k -rw=randwrite -iodepth=64 -runtime=300 -iodepth_batch=1 -iodepth_batch_complete=1 -name=randwrite-iops-tst

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
2
3
# wget http://www.iozone.org/src/current/iozone-3-465.i386.rpm
# rpm -ivh iozone-3-465.i386.rpm
# ln -s /opt/iozone/bin/iozone /usr/bin/iozone

测试分类与测试命令

iozone参数说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
指定使用自动模式
-a

指定测试模式
-i 0 -i 1 -i 2
0=write/rewrite
1=read/re-read
2=random read/random write

指定自动模式测试文件的大小范围,会依次翻倍
-n 1m -g 2G
-n 1m : 指定测试文件的最小值为1m
-g 2G : 指定测试文件的最大值为2G

指定自动模式下记录块的大小范围,会依次翻倍;记录块大小类似于dd的bs
-y 128k -q 16m
-y 128k : 指定记录块的最小值为128k
-q 16m : 指定记录块的最小值为16m

指定使用DIRECT IO
-I

指定写用O_SYNC
-o

指定threads个数测试系统吞吐量
-t

指定创建Excel reqport
-R

指定创建的Excel文件的name
-b

指定测试使用的record size
-r

指定测试文件的size
-s
  1. 测试DIRET IO / SYNC IO - 非throughput模式

    不指定threads,测试单个线程的iozone性能

    1
    2
    iozone -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
  2. 测试系统吞吐量 - throughput模式

    指定threads=16,获取整个系统的throughput

    1
    2
    iozone -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
2
3
4
5
6
7
8
9
10
11
12
13
14
源码:https://github.com/filebench/filebench
下载后在测试节点解压缩

# yum install libtool automake
# libtoolize
# aclocal
# autoheader
# automake --add-missing
# autoconf

# yum install gcc flex bison
# ./configure
# make
# make install

安装后,在目录 /usr/local/share/filebench/workloads/ 下有很多定义好的workload,可以直接拿来使用。
配置里面的 $dir 为测试cephfs的目录,若文件后没有 run 命令,添加:run

测试分类

filebench有很多定义好的workload,如下:

1
2
3
4
5
6
7
8
9
10
11
# ls /usr/local/share/filebench/workloads/
compflow_demo.f filemicro_rwrite.f fivestreamreaddirect.f openfiles.f singlestreamwrite.f
copyfiles.f filemicro_rwritefsync.f fivestreamread.f randomfileaccess.f tpcso.f
createfiles.f filemicro_seqread.f fivestreamwritedirect.f randomread.f varmail.f
cvar_example.f filemicro_seqwrite.f fivestreamwrite.f randomrw.f videoserver.f
filemicro_create.f filemicro_seqwriterand.f listdirs.f randomwrite.f webproxy.f
filemicro_createfiles.f filemicro_seqwriterandvargam.f makedirs.f ratelimcopyfiles.f webserver.f
filemicro_createrand.f filemicro_seqwriterandvartab.f mongo.f removedirs.f
filemicro_delete.f filemicro_statfile.f netsfs.f singlestreamreaddirect.f
filemicro_rread.f filemicro_writefsync.f networkfs.f singlestreamread.f
filemicro_rwritedsync.f fileserver.f oltp.f singlestreamwritedirect.f

因为最新的filebench修改了变量的定义,所以这里面的一些workload并不能成功运行,只需选择可用的有代表性的workload测试即可。

参考

filesystem测试工具之filebench

结论

  1. cephfs的direct IO性能有限
  2. cephfs读写能跑满ceph cluster集群性能
  3. 客户端缓存和OSD缓存对读写的影响很大

cephfs稳定性测试

为了测试cephfs是否能在线上提供服务,需要测试下其稳定性,这里采用两种方式测试。

读写数据模式

针对读写数据模式,我们选择工具fio,在cephfs client端长时间运行,看会不会报错。

测试逻辑大概如下:

1
2
3
4
5
# fio循环测试读写
while now < time
fio write 10G file
fio read 10G file
delete file

读写元数据模式

针对读写元数据模式,我们采用自写脚本,大规模创建目录、文件、写很小数据到文件中,在cephfs client端长时间运行,看会不会报错。

测试逻辑大概如下:

1
2
3
4
5
6
7
# 百万级别的文件个数
while now < time
create dirs
touch files
write little data to each file
delete files
delete dirs

结论

通过几天的连续测试,cephfs一切正常,这说明cephfs是可以应用到生产环境的。
但在上亿级别的文件测试中,也遇到点问题,会在下面章节的问题里说明。

cephfs异常测试

cephfs的功能依赖于MDS和Ceph Cluster,关键的元数据都通过MDS获取,这里测试的异常也主要基于MDS的异常进行分类的。

查看ceph MDS与interl和timeout相关的配置有:

1
2
3
OPTION(mds_tick_interval, OPT_FLOAT, 5)
OPTION(mds_mon_shutdown_timeout, OPT_DOUBLE, 5)
OPTION(mds_op_complaint_time, OPT_FLOAT, 30)

所以这里测试对MDS stop/start的时间间隔取为:2s,10s,60s

测试分类

  1. 主从MDS
  2. 单MDS

测试中启停MDS service的命令为:

1
2
# systemctl stop ceph-mds.target
# systemctl start ceph-mds.target

测试结果

  • fio随机写单个文件
MDS模式 启停interval io影响
单MDS 2s, 10s
60s 约40s时影响IO
主从MDS 2s, 10s
60s 主从不同时停止时无影响
同时停止主从MDS时,影响与单MDS一致

下面展示了单MDS停止约60s的时候,对fio测试的影响:

fio rw bw

  • iozone测试direct IO
MDS模式 启停interval io影响
单MDS 2s,10s,60s 对当前文件的IO影响同fio测试
对读写新文件的影响会立刻体现
主从MDS 2s,10s,60s 主从不同时停止时无影响
同时停止主从MDS时,影响与单MDS一致

结论

  1. 单MDS的情况下,短暂的MDS crush并不会影响客户端对一个file的读写
  2. 单MDS的情况下,MDS crush后,client端对没有缓存过caps的文件操作会hang住
  3. 主从MDS的情况下,只要有一个MDS正常,cephfs的服务就不会中断
  4. 主从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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

# 5000个目录,每个目录10万个文件
round=5000

echo `date` >> /root/mds_testlog

for j in `seq $round`;do
mkdir /mnt/test$j
for i in `seq 100000`;do
echo hello > /mnt/test$j/file${i};
done
done

for j in `seq $round`;do
rm -rf /mnt/test$j
done

问题:

  1. 单线程运行耗时较长
  2. 单线程删除文件时,rm命令报No space left on device错误
  3. 单线程删除文件时,日志中报_send skipping beacon, heartbeat map not healthy
  4. 多线程并发创建、删除测试和深目录层级测试待验证

总结

经过功能测试、性能测试、稳定性测试和异常测试后,我们得出如下结论:

  1. cephfs是production ready的,能满足基本生产环境对文件存储的需求
  2. cephfs的主从MDS是稳定的
  3. cephfs的direct IO性能有限,分析后明确是cephfs kernel client的IO处理逻辑限制的
  4. cephfs是能跑满整个ceph cluster集群性能的
  5. 默认的stripe模式下(stripe unit=4M, stripe count=1, object size=4M),cephfs的性能就挺好
  6. 受到cephfs client端的系统缓存影响,非direct IO的读写性能都会比较高,这个不具有太大参考意义
支持原创