转载:Ceph分布式存储系统-性能测试与优化
摘要:
本文先介绍了各个节点的本地磁盘吞吐量和延迟测试(dd 命令),节点间的网络测试(dd+nc命令),及最后的rados bench测试(配置不同的块大小)。
测试环境
部署方案:整个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 node2 0 0.28819 osd.0 up 1.00000 1.00000 -3 0.28819 host node3 1 0.28819 osd.1 up 1.00000 1.00000 -4 0.28819 host node4 2 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 node2 0 0.28819 osd.0 up 1.00000 1.00000 -3 0.28819 host node3 1 0.28819 osd.1 up 1.00000 1.00000 -4 0.28819 host node4 2 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 0 total used 27044652 192 total avail 854232624 total 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_26604 sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s) 0 0 0 0 0 0 - 0 1 16 31 15 59.9966 60 0.953952 0.614647 2 16 38 22 43.9954 28 1.38736 0.781039 3 16 46 30 39.9958 32 1.87801 1.06765 4 16 61 45 44.9953 60 1.19344 1.23191 5 16 76 60 47.9949 60 0.993045 1.17022 6 16 91 75 49.9946 60 1.00303 1.1498 7 16 106 90 51.4231 60 0.999574 1.13609 8 16 119 103 51.4945 52 1.00504 1.12779 9 16 122 106 47.106 12 1.20668 1.13173 10 16 122 106 42.3954 0 - 1.13173 11 16 125 109 39.632 6 2.8996 1.18213 12 16 137 121 40.3289 48 3.90723 1.45272 13 16 151 135 41.5339 56 1.10043 1.47333 14 16 169 153 43.7096 72 0.927572 1.4129 15 16 181 165 43.9952 48 1.02879 1.38739 16 16 196 180 44.9951 60 1.08398 1.36665 17 16 209 193 45.4068 52 1.117 1.34742 18 16 212 196 43.5508 12 1.30703 1.3468 19 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.40039 sec 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.40039 21 16 225 209 39.8051 28 4.18987 1.48851 22 16 241 225 40.9046 64 1.00629 1.53148 23 16 256 240 41.7345 60 1.18098 1.49869 24 16 271 255 42.4953 60 1.0017 1.47319 25 16 286 270 43.1952 60 1.00118 1.45067 26 16 299 283 43.5337 52 1.19813 1.43348 27 16 302 286 42.3657 12 1.30607 1.43215 28 16 302 286 40.8527 0 - 1.43215 29 16 305 289 39.8577 6 3.00461 1.44847 30 16 316 300 39.9956 44 3.73721 1.54023 31 16 331 315 40.6407 60 0.97103 1.54526 32 16 346 330 41.2455 60 0.999926 1.5214 33 16 361 345 41.8136 60 1.00411 1.50169 34 16 376 360 42.3483 60 1.00089 1.48355 35 16 386 370 42.2811 40 1.20272 1.4727 36 16 389 373 41.4399 12 1.50616 1.47296 37 16 392 376 40.6442 12 3.1067 1.486 38 16 395 379 39.8903 12 3.90852 1.50518 39 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.56868 sec 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.56868 41 16 433 417 40.6784 60 0.999955 1.54939 42 16 448 432 41.1383 60 1.17664 1.53256 43 16 463 447 41.5768 60 1.00297 1.51695 44 16 478 462 41.9953 60 1.00466 1.50234 45 16 479 463 41.151 4 1.19512 1.50168 46 16 482 466 40.5172 12 2.6118 1.50882 47 16 485 469 39.9105 12 3.3123 1.52034 48 16 493 477 39.7456 32 4.00971 1.55901 49 16 508 492 40.1588 60 1.01054 1.57611 50 16 523 507 40.5555 60 0.996004 1.55869 51 16 538 522 40.9366 60 0.997722 1.54464 52 16 553 537 41.3031 60 1.19815 1.53113 53 16 568 552 41.6557 60 1.21298 1.51864 54 16 572 556 41.1806 16 1.49932 1.51797 55 16 572 556 40.4318 0 - 1.51797 56 16 575 559 39.9241 6 3.09559 1.52643 57 16 583 567 39.785 32 3.99229 1.55923 58 16 595 579 39.9266 48 1.37706 1.57952 59 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.56738 sec 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 rand sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s) 0 0 0 0 0 0 - 0 1 16 101 85 339.935 340 0.270579 0.147057 2 16 145 129 257.955 176 0.246583 0.220784 3 16 191 175 233.297 184 0.53086 0.253465 4 16 236 220 219.968 180 0.0326233 0.268682 5 16 281 265 211.971 180 0.528696 0.286853 6 16 328 312 207.973 188 0.0203012 0.295207 7 16 371 355 202.831 172 0.283736 0.303328 8 16 415 399 199.475 176 0.508335 0.30781 9 16 461 445 197.753 184 0.24398 0.312503 10 16 510 494 197.576 196 0.499586 0.31802 11 16 556 540 196.34 184 0.259304 0.320708 12 16 602 586 195.31 184 0.745053 0.320777 13 16 646 630 193.823 176 0.0422189 0.32386 14 16 692 676 193.12 184 0.0467997 0.326607 15 16 735 719 191.711 172 0.0272729 0.327432 16 16 777 761 190.228 168 0.0160831 0.326381 17 16 821 805 189.39 176 0.483385 0.330262 18 16 865 849 188.645 176 0.0279903 0.330038 19 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.332994 sec 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.332994 21 16 1009 993 189.121 188 0.26545 0.334135 22 16 1052 1036 188.342 172 0.502163 0.335411 23 16 1095 1079 187.631 172 0.191482 0.335954 24 16 1140 1124 187.312 180 0.0187187 0.33593 25 16 1187 1171 187.339 188 0.0128352 0.336301 26 16 1232 1216 187.056 180 0.0260001 0.336886 27 16 1278 1262 186.942 184 0.0148474 0.336478 28 16 1324 1308 186.836 184 0.723555 0.337355 29 16 1367 1351 186.324 172 0.0246515 0.339247 30 16 1412 1396 186.113 180 0.0120403 0.339659 31 16 1460 1444 186.302 192 0.569969 0.338129 32 16 1506 1490 186.229 184 0.0316037 0.340041 33 16 1551 1535 186.04 180 0.0273989 0.340237 34 16 1596 1580 185.862 180 0.525298 0.340735 35 16 1638 1622 185.351 168 0.0101045 0.34052 36 16 1686 1670 185.535 192 0.0159173 0.34091 37 16 1731 1715 185.385 180 0.986173 0.339939 38 16 1775 1759 185.138 176 0.0152587 0.340806 39 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.342772 sec 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.342772 41 16 1907 1891 184.468 176 0.539937 0.341949 42 16 1950 1934 184.17 172 0.501967 0.343196 43 16 1997 1981 184.259 188 0.258521 0.34255 44 16 2043 2027 184.253 184 0.0441231 0.343493 45 16 2088 2072 184.158 180 0.302963 0.343621 46 16 2135 2119 184.241 188 0.0198267 0.34337 47 16 2179 2163 184.065 176 0.26388 0.343744 48 16 2224 2208 183.98 180 0.274291 0.343872 49 16 2268 2252 183.817 176 0.0345847 0.343383 50 16 2314 2298 183.82 184 0.0555181 0.344454 51 16 2359 2343 183.745 180 0.288888 0.344362 52 16 2405 2389 183.749 184 0.280761 0.344848 53 16 2447 2431 183.452 168 0.0135715 0.34438 54 16 2496 2480 183.684 196 0.259152 0.344883 55 15 2542 2527 183.762 188 0.0231959 0.34473 56 15 2585 2570 183.552 172 0.235059 0.345157 57 16 2627 2611 183.208 164 0.272916 0.3454 58 16 2674 2658 183.29 188 0.534074 0.345242 59 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.344692 sec 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对性能有不错的提升。