测试环境
部署方案:整个Ceph Cluster使用4台ECS,均在同一VPC中,结构如图:
以下是 Ceph 的测试环境,说明如下:
- Ceph 采用 10.2.10 版本,安装于 CentOS 7.4 版本中;系统为初始安装,没有调优。
- 每个 OSD 存储服务器都是4核8GB,挂载1块300G高效云盘(非SSD硬盘);操作系统和OSD存储均用同一个磁盘。
[root@node1 ~]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-6 0 rack test-bucket
-5 0 rack demo
-1 0.86458 root default
-2 0.28819 host node20 0.28819 osd.0 up 1.00000 1.00000
-3 0.28819 host node31 0.28819 osd.1 up 1.00000 1.00000
-4 0.28819 host node42 0.28819 osd.2 up 1.00000 1.00000
- 使用 Test pool,此池为 64 个 PGs,数据存三份;
[root@node1 ~]# ceph osd pool create test 64 64
pool 'test' created[root@node1 ~]# ceph osd pool get test size
size: 3[root@node1 ~]# ceph osd pool get test pg_num
pg_num: 64
- Ceph osd 采用 xfs 文件系统(若使用 brtf 文件系统读写性能将翻 2 倍,但brtf不建议在生产环境使用);
- Ceph 系统中的Block采用默认安装,为 64K;
- 性能测试客户端运行在node1上,在同一VPC下使用同一网段访问 Ceph 存贮系统进行数据读写;
本次测试中,发起流量的客户端位于Ceph Cluster中,故网络延时较小,真正生产环境中还需要考虑网络瓶颈。生产环境的网络访问图如下:
磁盘性能测试
测试磁盘写吞吐量
使用dd命令对磁盘进行标准写测试。使用一下命令行读取和写入文件,记住添加oflag参数以绕过磁盘页面缓存。
node1:
[root@node1 ~]# dd if=/dev/zero of=here bs=1G count=1 oflag=direct
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,15.466 秒,69.4 MB/秒
node2:
[root@node2 ~]# dd if=/dev/zero of=here bs=1G count=1 oflag=direct
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,13.6518 秒,78.7 MB/秒
node3:
[root@node3 ~]# dd if=/dev/zero of=here bs=1G count=1 oflag=direct
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,13.6466 秒,78.7 MB/秒
node4:
[root@node4 ~]# dd if=/dev/zero of=here bs=1G count=1 oflag=direct
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,13.6585 秒,78.6 MB/秒
可以看出,除了node1节点外,磁盘吞吐量在 78 MB/s 左右。node1上没有部署osd,最终不作为ceph的读写性能评判参考。
测试磁盘写延迟
使用dd命令,每次写512字节,连续写1万次。
node1:
[root@node1 test]# dd if=/dev/zero of=512 bs=512 count=10000 oflag=direct
记录了10000+0 的读入
记录了10000+0 的写出
5120000字节(5.1 MB)已复制,6.06715 秒,844 kB/秒
node2:
[root@node2 test]# dd if=/dev/zero of=512 bs=512 count=10000 oflag=direct
记录了10000+0 的读入
记录了10000+0 的写出
5120000字节(5.1 MB)已复制,4.12061 秒,1.2 MB/秒
node3:
[root@node3 test]# dd if=/dev/zero of=512 bs=512 count=10000 oflag=direct
记录了10000+0 的读入
记录了10000+0 的写出
5120000字节(5.1 MB)已复制,3.88562 秒,1.3 MB/秒
node4:
[root@node4 test]# dd if=/dev/zero of=512 bs=512 count=10000 oflag=direct
记录了10000+0 的读入
记录了10000+0 的写出
5120000字节(5.1 MB)已复制,3.60598 秒,1.4 MB/秒
平均耗时4秒,平均速度1.3MB/s。
集群网络I/O测试
由于客户端访问都是通过rgw访问各个osd(文件存储服务除外),主要测试rgw节点到各个osd节点的网络性能I/O。
rgw到osd.0
在osd.0节点上使用nc监听17480端口的网络I/O请求:
[root@node2 ~]# nc -v -l -n 17480 > /dev/null
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::17480
Ncat: Listening on 0.0.0.0:17480
Ncat: Connection from 192.168.0.97.
Ncat: Connection from 192.168.0.97:33644.
在rgw节点上发起网络I/O请求:
[root@node2 ~]# time dd if=/dev/zero | nc -v -n 192.168.0.97 17480
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.0.97:17480.
^C记录了121182456+0 的读入
记录了121182455+0 的写出
62045416960字节(62 GB)已复制,413.154 秒,150 MB/秒real 6m53.156s
user 5m54.626s
sys 7m51.485s
网络I/O总流量62GB,耗时413.154秒,平均速度150 MB/秒。
rgw到osd.1
在osd.1节点上使用nc监听17480端口的网络I/O请求:
[root@node3 ~]# nc -v -l -n 17480 > /dev/null
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::17480
Ncat: Listening on 0.0.0.0:17480
Ncat: Connection from 192.168.0.97.
Ncat: Connection from 192.168.0.97:35418.
在rgw节点上发起网络I/O请求:
[root@node2 ~]# time dd if=/dev/zero | nc -v -n 192.168.0.98 17480
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.0.98:17480.
^C记录了30140790+0 的读入
记录了30140789+0 的写出
15432083968字节(15 GB)已复制,111.024 秒,139 MB/秒real 1m51.026s
user 1m21.996s
sys 2m20.039s
网络I/O总流量15GB,耗时111.024秒,平均速度139 MB/秒。
rgw到osd.2
在osd.2节点上使用nc监听17480端口的网络I/O请求:
[root@node4 ~]# nc -v -l -n 17480 > /dev/null
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::17480
Ncat: Listening on 0.0.0.0:17480
Ncat: Connection from 192.168.0.97.
Ncat: Connection from 192.168.0.97:39156.
在rgw节点上发起网络I/O请求:
[root@node2 ~]# time dd if=/dev/zero | nc -v -n 192.168.0.99 17480
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.0.99:17480.
^C记录了34434250+0 的读入
记录了34434249+0 的写出
17630335488字节(18 GB)已复制,112.903 秒,156 MB/秒real 1m52.906s
user 1m23.308s
sys 2m22.487s
网络I/O总流量18GB,耗时112.903秒,平均速度156 MB/秒。
总结:集群内不同节点间,网络I/O平均在150MB/s左右。跟实际情况相符,因为本集群是千兆网卡。
rados集群性能测试
准备工作
- 查看ceph cluster的osd分布情况:
[root@node1 ~]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-6 0 rack test-bucket
-5 0 rack demo
-1 0.86458 root default
-2 0.28819 host node20 0.28819 osd.0 up 1.00000 1.00000
-3 0.28819 host node31 0.28819 osd.1 up 1.00000 1.00000
-4 0.28819 host node42 0.28819 osd.2 up 1.00000 1.00000
可见该cluster部署了3个osd节点,3个都处于up状态(正常work)。
- 为rados集群性能测试创建一个test pool,此池为 64 个 PGs,数据存三份;
[root@node1 ~]# ceph osd pool create test 64 64
pool 'test' created[root@node1 ~]# ceph osd pool get test size
size: 3[root@node1 ~]# ceph osd pool get test pg_num
pg_num: 64
- 查看test pool默认配置:
[root@node1 test]# ceph osd dump | grep test
pool 12 'test' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 37 flags hashpspool stripe_width 0
- 查看test poll资源占用情况:
[root@node1 test]# rados -p test df
pool name KB objects clones degraded unfound rd rd KB wr wr KB
test 0 0 0 0 0 0 0 0 0total used 27044652 192total avail 854232624total space 928512000
写性能测试
- 测试写性能
[root@node1 ~]# rados bench -p test 60 write --no-cleanup
Maintaining 16 concurrent writes of 4194304 bytes to objects of size 4194304 for up to 60 seconds or 0 objects
Object prefix: benchmark_data_node1_26604sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)0 0 0 0 0 0 - 01 16 31 15 59.9966 60 0.953952 0.6146472 16 38 22 43.9954 28 1.38736 0.7810393 16 46 30 39.9958 32 1.87801 1.067654 16 61 45 44.9953 60 1.19344 1.231915 16 76 60 47.9949 60 0.993045 1.170226 16 91 75 49.9946 60 1.00303 1.14987 16 106 90 51.4231 60 0.999574 1.136098 16 119 103 51.4945 52 1.00504 1.127799 16 122 106 47.106 12 1.20668 1.1317310 16 122 106 42.3954 0 - 1.1317311 16 125 109 39.632 6 2.8996 1.1821312 16 137 121 40.3289 48 3.90723 1.4527213 16 151 135 41.5339 56 1.10043 1.4733314 16 169 153 43.7096 72 0.927572 1.412915 16 181 165 43.9952 48 1.02879 1.3873916 16 196 180 44.9951 60 1.08398 1.3666517 16 209 193 45.4068 52 1.117 1.3474218 16 212 196 43.5508 12 1.30703 1.346819 16 215 199 41.8902 12 2.79917 1.36874
2018-03-20 17:06:48.745397 min lat: 0.229762 max lat: 4.09713 avg lat: 1.40039sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)20 16 218 202 40.3956 12 3.49784 1.4003921 16 225 209 39.8051 28 4.18987 1.4885122 16 241 225 40.9046 64 1.00629 1.5314823 16 256 240 41.7345 60 1.18098 1.4986924 16 271 255 42.4953 60 1.0017 1.4731925 16 286 270 43.1952 60 1.00118 1.4506726 16 299 283 43.5337 52 1.19813 1.4334827 16 302 286 42.3657 12 1.30607 1.4321528 16 302 286 40.8527 0 - 1.4321529 16 305 289 39.8577 6 3.00461 1.4484730 16 316 300 39.9956 44 3.73721 1.5402331 16 331 315 40.6407 60 0.97103 1.5452632 16 346 330 41.2455 60 0.999926 1.521433 16 361 345 41.8136 60 1.00411 1.5016934 16 376 360 42.3483 60 1.00089 1.4835535 16 386 370 42.2811 40 1.20272 1.472736 16 389 373 41.4399 12 1.50616 1.4729637 16 392 376 40.6442 12 3.1067 1.48638 16 395 379 39.8903 12 3.90852 1.5051839 16 402 386 39.5854 28 4.12175 1.551
2018-03-20 17:07:08.747628 min lat: 0.229762 max lat: 4.29984 avg lat: 1.56868sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)40 16 418 402 40.1956 64 1.07659 1.5686841 16 433 417 40.6784 60 0.999955 1.5493942 16 448 432 41.1383 60 1.17664 1.5325643 16 463 447 41.5768 60 1.00297 1.5169544 16 478 462 41.9953 60 1.00466 1.5023445 16 479 463 41.151 4 1.19512 1.5016846 16 482 466 40.5172 12 2.6118 1.5088247 16 485 469 39.9105 12 3.3123 1.5203448 16 493 477 39.7456 32 4.00971 1.5590149 16 508 492 40.1588 60 1.01054 1.5761150 16 523 507 40.5555 60 0.996004 1.5586951 16 538 522 40.9366 60 0.997722 1.5446452 16 553 537 41.3031 60 1.19815 1.5311353 16 568 552 41.6557 60 1.21298 1.5186454 16 572 556 41.1806 16 1.49932 1.5179755 16 572 556 40.4318 0 - 1.5179756 16 575 559 39.9241 6 3.09559 1.5264357 16 583 567 39.785 32 3.99229 1.5592358 16 595 579 39.9266 48 1.37706 1.5795259 16 612 596 40.4022 68 0.89873 1.56855
2018-03-20 17:07:28.749935 min lat: 0.229762 max lat: 4.29984 avg lat: 1.56738sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)60 16 624 608 40.5288 48 1.65518 1.56738
Total time run: 60.821654
Total writes made: 625
Write size: 4194304
Object size: 4194304
Bandwidth (MB/sec): 41.1038
Stddev Bandwidth: 23.0404
Max bandwidth (MB/sec): 72
Min bandwidth (MB/sec): 0
Average IOPS: 10
Stddev IOPS: 5
Max IOPS: 18
Min IOPS: 0
Average Latency(s): 1.55581
Stddev Latency(s): 0.981606
Max latency(s): 4.29984
Min latency(s): 0.229762
如果加上可选参数 --no-cleanup
,那么测试完之后,不会删除该池里面的数据。里面的数据可以继续用于测试集群的读性能。
从以上测试数据可以看出:数据写入时的平均带宽是41MB/sec,最大带宽是72,带宽标准差是23(反应网络稳定情况)。
读性能测试
- 测试读性能
[root@node1 ~]# rados bench -p test 60 randsec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)0 0 0 0 0 0 - 01 16 101 85 339.935 340 0.270579 0.1470572 16 145 129 257.955 176 0.246583 0.2207843 16 191 175 233.297 184 0.53086 0.2534654 16 236 220 219.968 180 0.0326233 0.2686825 16 281 265 211.971 180 0.528696 0.2868536 16 328 312 207.973 188 0.0203012 0.2952077 16 371 355 202.831 172 0.283736 0.3033288 16 415 399 199.475 176 0.508335 0.307819 16 461 445 197.753 184 0.24398 0.31250310 16 510 494 197.576 196 0.499586 0.3180211 16 556 540 196.34 184 0.259304 0.32070812 16 602 586 195.31 184 0.745053 0.32077713 16 646 630 193.823 176 0.0422189 0.3238614 16 692 676 193.12 184 0.0467997 0.32660715 16 735 719 191.711 172 0.0272729 0.32743216 16 777 761 190.228 168 0.0160831 0.32638117 16 821 805 189.39 176 0.483385 0.33026218 16 865 849 188.645 176 0.0279903 0.33003819 16 913 897 188.82 192 0.237649 0.332631
2018-03-20 17:08:51.231039 min lat: 0.00844047 max lat: 0.964959 avg lat: 0.332994sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)20 16 962 946 189.178 196 0.0115256 0.33299421 16 1009 993 189.121 188 0.26545 0.33413522 16 1052 1036 188.342 172 0.502163 0.33541123 16 1095 1079 187.631 172 0.191482 0.33595424 16 1140 1124 187.312 180 0.0187187 0.3359325 16 1187 1171 187.339 188 0.0128352 0.33630126 16 1232 1216 187.056 180 0.0260001 0.33688627 16 1278 1262 186.942 184 0.0148474 0.33647828 16 1324 1308 186.836 184 0.723555 0.33735529 16 1367 1351 186.324 172 0.0246515 0.33924730 16 1412 1396 186.113 180 0.0120403 0.33965931 16 1460 1444 186.302 192 0.569969 0.33812932 16 1506 1490 186.229 184 0.0316037 0.34004133 16 1551 1535 186.04 180 0.0273989 0.34023734 16 1596 1580 185.862 180 0.525298 0.34073535 16 1638 1622 185.351 168 0.0101045 0.3405236 16 1686 1670 185.535 192 0.0159173 0.3409137 16 1731 1715 185.385 180 0.986173 0.33993938 16 1775 1759 185.138 176 0.0152587 0.34080639 16 1818 1802 184.8 172 0.216865 0.342337
2018-03-20 17:09:11.233088 min lat: 0.0080755 max lat: 1.20072 avg lat: 0.342772sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)40 16 1863 1847 184.68 180 0.298863 0.34277241 16 1907 1891 184.468 176 0.539937 0.34194942 16 1950 1934 184.17 172 0.501967 0.34319643 16 1997 1981 184.259 188 0.258521 0.3425544 16 2043 2027 184.253 184 0.0441231 0.34349345 16 2088 2072 184.158 180 0.302963 0.34362146 16 2135 2119 184.241 188 0.0198267 0.3433747 16 2179 2163 184.065 176 0.26388 0.34374448 16 2224 2208 183.98 180 0.274291 0.34387249 16 2268 2252 183.817 176 0.0345847 0.34338350 16 2314 2298 183.82 184 0.0555181 0.34445451 16 2359 2343 183.745 180 0.288888 0.34436252 16 2405 2389 183.749 184 0.280761 0.34484853 16 2447 2431 183.452 168 0.0135715 0.3443854 16 2496 2480 183.684 196 0.259152 0.34488355 15 2542 2527 183.762 188 0.0231959 0.3447356 15 2585 2570 183.552 172 0.235059 0.34515757 16 2627 2611 183.208 164 0.272916 0.345458 16 2674 2658 183.29 188 0.534074 0.34524259 16 2717 2701 183.099 172 0.261746 0.345621
2018-03-20 17:09:31.235266 min lat: 0.0080755 max lat: 1.20072 avg lat: 0.344692sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)60 16 2765 2749 183.247 192 0.213941 0.344692
Total time run: 60.297422
Total reads made: 2765
Read size: 4194304
Object size: 4194304
Bandwidth (MB/sec): 183.424
Average IOPS: 45
Stddev IOPS: 5
Max IOPS: 85
Min IOPS: 41
Average Latency(s): 0.346804
Max latency(s): 1.20072
Min latency(s): 0.0080755
从以上测试数据可以看出:数据读取时的平均带宽是183MB/sec,平均延时是0.3 sec,平均IOPS是45。
- 测试数据清除
rados -p test cleanup
- 删除test池:
[root@node1 ~]# ceph osd pool delete test test --yes-i-really-really-mean-it
pool 'test' removed
结论
针对不同大小的block对Rados、RBD进行了读写性能测试,最终统计结果如下:
block | 读写顺序 | 读写数据 | 线程数 | IOPS | 带宽速度 | 运行时间 s |
---|---|---|---|---|---|---|
4K Rados | 随机读 | 174M | 16 | 15563 | 60.7961MB/s | 2 |
顺序读 | 174M | 16 | 13199 | 51.5621MB/s | 2 | |
随机写 | 174M | 16 | 1486 | 5.80794MB/s | 30 | |
4K RBD | 随机读 | 17.6G | 16 | 104000 | 587.7MB/s | 30 |
顺序读 | 2.2G | 16 | 23800 | 74MB/s | 30 | |
随机写 | 571M | 16 | 2352 | 19MB/s | 30 | |
顺序写 | 43M | 16 | 352 | 1.4MB/s | 30 | |
16K Rados | 随机读 | 615m | 16 | 13530 | 211.416MB/s | 2 |
顺序读 | 615m | 16 | 10842 | 169.419MB/s | 3.7 | |
随机写 | 615M | 16 | 1313 | 20.52864MB/s | 30 | |
16K RBD | 随机读 | 56G | 16 | 120000 | 1881MB/s | 30 |
顺序读 | 10G | 16 | 25600 | 363MB/s | 30 | |
随机写 | 1.9G | 16 | 2854 | 65.8MB/s | 30 | |
顺序写 | 170M | 16 | 384 | 5.7MB/s | 30 | |
512K Rados | 随机读 | 8.88G | 16 | 4218 | 2109.11MB/s | 3 |
顺序读 | 8.88G | 16 | 4062 | 2031.33MB/s | 4 | |
随机写 | 8.88G | 16 | 592 | 296.0093MB/s | 30 | |
512K RBD | 随机读 | 54G | 16 | 3719 | 1814.6MB/s | 30 |
顺序读 | 56G | 16 | 2834 | 1879.8MB/s | 30 | |
随机写 | 32G | 16 | 1649 | 1082.5MB/s | 30 | |
顺序写 | 9G | 16 | 1650 | 303.8KB/s | 30 |
- ceph 针对大块文件的读写性能非常优秀,高达2GB/s。
- rados读比写高出10倍的速率,适合读数据的高并发场景。
- pool配置:2个副本比3个副本的性能高出很多,但官方推荐使用3个副本,因为2个不够安全;
- 若机器配置不算很差(4核8G以上),ceph很容易达到1G带宽的限制阀值,若想继续提升ceph性能,需考虑提升带宽阀值。
- 设置更多的PG值可以带来更好的负载均衡,但从测试来看,设置较大的PG值并不会提高性能。
- 将fileStore刷新器设置为false对性能有不错的提升。