[TOC]
ceph 压力测试报告
此文档最新版本地址
概述
对ceph文件集群进行性能测试, 以确认满足我们业务需求. 此次测试主要测试S3接口读写文件性能.
测试环境
网络拓扑结构
如下图, client和三台OSD集群在同一个内网, 每台OSD机器上, 分别装有MON和RGW. 测试时同时使用多个RGW, 由客户端控制将请求分发到不同RGW服务. 因部署遗留原因, 三台OSD机器编号从2开始, 分别是 DFS2, DFS3, DFS4.
软硬件环境
OSD服务器
服务器 | 硬件配置 | 软件配置 |
---|---|---|
DFS2 | Intel Core i7-4790@ 3.60GHz 四核八线程 8G DDR3内存 1T 7200转硬盘, 1000M网口 | centos 7.2, ceph 10.2.2 |
DFS3 | Intel Core i7-4790@ 3.60GHz 四核八线程 8G DDR3内存 1T 7200转硬盘, 1000M网口 | centos 7.2, ceph 10.2.2 |
DFS4 | Intel Core i7-4790@ 3.60GHz 四核八线程 16G DDR3内存 1T 7200转硬盘, 1000M网口 | centos 7.2, ceph 10.2.2 |
测试客户端服务器
服务器 | 硬件配置 | 软件配置 |
---|---|---|
10.141.5.63 | 双核 Intel Xeon CPU E7- 4850 @ 2.00GHz, 4G内存, 1000M网口 | centos 6.8, java 1.7.0_79 |
10.141.4.83 | 四核 Intel(R) Xeon(R) CPU E5-2658 v2 @ 2.40GHz, 8G内存, 1000M网口 | centos 6.7, java 1.8.0_92 |
测试软件
基于aws api自己写的 java 客户端. 另外, 有推荐 cosbench 的. 以后可以看看.
maven依赖:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.9.0</version>
</dependency>
压测数据
注意: 压测过程中, index副本数设置为1, 会比默认的3效率高些.
中等文件写入压测
测试内容: 文件大小95M,上传50次
在客户端5个线程,20个线程,50个线程 3种情况下得出数据:
1个副本 1个RGW
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
5 | 75.731 | 62.96 | 0.66 |
20 | 65.947 | 72.306 | 0.758 |
50(一条请求超时) | 83.37 | 57.195 | 0.5997 |
数据简单分析: |
- 最高写入速度也在70 M/s左右.
- 三台OSD中的两台磁盘io几乎达到100%, 一台在90%左右. 磁盘成为性能瓶颈.
- 线程数过多(50), 性能不升反降, 还会有超时现象.
2个副本 1个RGW
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
5 | 139.247 | 34.2439 | 0.359 |
20 | 147.913 | 32.237 | 0.338 |
50 | 138.832 | 34.346 | 0.360 |
数据简单分析: 瓶颈与1个副本1个RGW类似, 瓶颈在磁盘io. 两个副本最大写入速度在35M/s左右.
3个副本 1个RGW
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
1 | 223.859 | 21.30 | 0.223 |
5 | 227.563 | 20.954 | 0.2197 |
20 | 234.088 | 20.37 | 0.21359 |
数据简单分析: 瓶颈与1个副本1个RGW类似, 瓶颈在磁盘io. 三个副本最大写入速度在30M/s左右.
小文件写入压测
测试内容: 文件大小30 000字节,上传5000次
客户端在启用20个线程,100个线程,200个线程 3种情况下得出数据:
设置了 index 分片为16. 默认index不分片, 会造成写索引时单台OSD成为瓶颈, 磁盘io占满(大约每秒写30个对象).
两个副本, 1个RGW
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
20 | 52.426 | 2.796 | 95.37 |
100 | 34.78 | 4.2158 | 143.76 |
200 | 34.417 | 4.26 | 145.277 |
资源占用 dstat信息:
20个线程:
100个线程:
200个线程:
磁盘占用 iostat信息:
20个线程:
100个线程:
200个线程:
数据简单分析:
- 最高文件上传速度在每秒145个文件左右. 从20个线程到100个线程过程中, 写入速度明显提升; 100个线程后, 达到峰值.
- 在压测过程中, 系统CPU占用很低. 从20个线程增长到200个线程, CPU占用增长不明显, 系统空闲CPU一直维持在80%以上.
- 到100个线程以后, 磁盘 io 占用率达到100%, 成为系统瓶颈. 尽管写入量并不大, 但是因为大量小文件导致大量写入, 使磁盘时间占满.
- 客户端在线程少的情况下, 不足以达到最高吞吐量.
单副本, 1个RGW
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
20 | 41.833 | 3.505 | 119.523 |
100 | 30.929 | 4.741 | 161.66 |
200 | 40.984 | 3.577 | 122 |
数据简单分析:
- 系统占用情况和磁盘占用情况和两个副本时相似, 这里省略.
- 单副本最高文件写入速度在每秒160个左右. 从客户端20个线程到100个线程过程增长明显, 100个线程达到峰值, 从100到200之间有下降趋势.
- 在200个线程时, 比100个线程速度要下降. 再数据出来以后又测试了多次, 200个线程一般和100个线程速度持平. 这个数据是一个特例.
- 和两个副本相比, 因为要一份数据不需要保存两份到不同机器上, 减少了了网络和磁盘开销. 导致速度要比两个副本快.
三个副本, 1个RGW
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
20 | 74.018 | 1.98 | 67.55 |
100 | 47.283 | 3.101 | 105.746 |
200 | 45.983 | 3.1887 | 108.7 |
- 系统占用情况和磁盘占用情况和两个副本时相似, 这里省略.
- 三个副本情况下, 最高文件写入速度在每秒105个左右. 从客户端20个线程到100个线程过程中, 增长明显; 100个线程达到峰值; 超过100个线程, 写入速度保持在105个左右.
- 和两个副本相比, 因为一份数据需要保存到三台机器上, 增大了网络和磁盘开销. 导致速度要比两个副本慢.
大文件读取压测
因文件读取耗费大量CPU, 所以使用83测试机, 不让客户端配置成为性能瓶颈.
压测方式: 上传30个100M的文件, 下载时随机选取文件下载.
三个副本, 1个RGW
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
20 | 44.875 | 1.1142 | 106.259 |
100 | 44.286 | 1.129 | 107.672 |
200 | 44.4 | 1.126 | 107.395 |
内存占用 free -g:
[root@dfs2 ~]# free -g
total used free shared buff/cache available
Mem: 7 1 2 0 3 5
Swap: 7 0 7
磁盘占用 iostat:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 2.00 0.00 3.00 0.00 0.02 16.00 0.03 10.50 0.00 10.50 10.50 3.15
dm-0 0.00 0.00 0.00 4.00 0.00 0.02 12.00 0.03 7.88 0.00 7.88 7.88 3.15
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 2.00 0.00 6.00 0.00 0.03 10.67 0.06 10.17 0.00 10.17 10.17 6.10
dm-0 0.00 0.00 0.00 6.00 0.00 0.03 10.67 0.06 10.50 0.00 10.50 10.17 6.10
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
系统资源占用 dstat:
数据简单分析:
- 大文件读取, 单个rgw, 最高在107M左右. 从客户端20线程增加到200线程, 读取速度增长不明显.
- 内存还有足够余量, 磁盘io占用也不高.
- 从系统资源占用上来看, RGW所在机器网卡接收和发送已经达到114M/s左右, 1000M网卡理论最快速度在 1000M bit/8 = 125M 每秒. 所以可以认为网卡已经跑满, 瓶颈在1000M网卡上.
一个副本, 1个RGW
两个副本, 1个RGW
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
20 | 44.663 | 1.119 | 106.763 |
100 | 43.932 | 1.138 | 108.5398 |
200 | 43.961 | 1.137 | 108.468 |
数据简单分析:
- 数据和三个副本下情况相似. 瓶颈在网卡上.
小文件读取压测
压测方式: 上传100 000个小文件, 下载时随机选取文件下载, 下载100000次.
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
20 | 30.437 | 3285.4749 | 96.347 |
100 | 28.186 | 3547.86 | 104.04 |
200 | 28.578 | 3499.19 | 102.61 |
rgw机器内存占用情况.
[root@dfs2 ~]# free -g
total used free shared buff/cache available
Mem: 7 1 0 0 6 5
Swap: 7 0 7
rgw机器, 磁盘占用情况
[root@dfs2 ~]# iostat -mdx 2
Linux 3.10.0-327.22.2.el7.x86_64 (dfs2) 08/29/2016 _x86_64_ (8 CPU)
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.01 3.09 1.06 13.40 0.14 0.56 98.73 0.51 35.16 4.11 37.63 7.69 11.13
dm-0 0.00 0.00 1.07 13.96 0.14 0.56 94.99 0.76 50.65 4.26 54.21 7.41 11.13
dm-1 0.00 0.00 0.00 0.04 0.00 0.00 8.05 0.00 21.78 5.51 22.67 0.71 0.00
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 5.50 0.00 10.00 0.00 0.08 17.20 0.10 10.40 0.00 10.40 10.40 10.40
dm-0 0.00 0.00 0.00 12.50 0.00 0.08 13.76 0.11 8.56 0.00 8.56 8.32 10.40
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
RGW机器资源占用情况 dstat:
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
18 7 74 0 0 2| 0 108k| 78M 116M| 0 0 | 29k 191k
18 6 73 0 0 2| 0 116k| 76M 115M| 0 0 | 29k 191k
18 6 74 0 0 2| 0 48k| 77M 116M| 0 0 | 30k 189k
18 6 74 0 0 2| 0 36k| 80M 116M| 0 0 | 30k 189
数据简单分析:
- 小文件读取速度可达每秒100M, 每秒可以读取3500个大约3K的文件. //TODO 内存策略? 这些数据已经缓存到内存中?
- 从硬件使用情况来看, 读取瓶颈在1000M网口上.
硬盘参数优化, 写入压测(nobarrier)
开启/关闭 xfs nobarrier 参数:
# 开启
mount -o remount,nobarrier {/dev/mapper/cl_bogon-root} {/}
# 关闭
mount -o remount,barrier {/dev/mapper/cl_bogon-root} {/}
压测数据:
副本数为3, index分片为8, 分别在barrier和nobarrier上传文件:
barrier 文件大小30k, 上传5000次
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
1 | 225.018 | 0.65 | 22.22 |
20 | 55.719 | 2.63 | 89.7 |
100 | 46.484 | 3.154 | 107.56 |
nobarrier 文件大小30k, 上传5000次
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
1 | 48.147 | 3.045 | 103.848 |
20 | 11.237 | 13.0486 | 444.958 |
100 | 9.969 | 14.708 | 501.55 |
barrier 文件大小100M, 上传50次
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
1 | 223.859 | 21.30 | 0.223 |
5 | 227.563 | 20.954 | 0.2197 |
20 | 234.088 | 20.37 | 0.21359 |
nobarrier 文件大小100M, 上传50次
thread cnt | time used(s) | write speed(M/s) | object speed(obj/s) |
---|---|---|---|
1 | 144.14 | 33.08 | 0.3468 |
5 | 135.583 | 35.169 | 0.3687 |
20 | 141.82 | 33.62 | 0.3525 |
数据简单分析:
- 关闭 xfs文件系统 barrier 选项以后, 使小文件写入性能提升5倍左右. 效果非常可观. 100M左右文件, 性能提升为以前的1.65倍左右(网卡还没跑满, 瓶颈在磁盘io).
- 官方虽然不建议关闭nobarrier选项, 但是我们有数据多机器写入多个副本. 但是存在OSD机器在一个机房, 当遭遇同一机房停电情况, 数据就会损坏的极端情况. 这个视具体情况而定. 如果写入确实是系统瓶颈, 则建议使用nobarrier选项. 也可以临时不使用nobarrier选项, 当达到性能瓶颈以后, 再使用.
压测总结
- 100M文件写最高 入单副本 70M/s, 两个副本35M/s, 三个副本20M每秒, 瓶颈在磁盘io. //TODO 进一步分析哪个环节影响效率(文件数据写入/索引写入/日志写入) 这块可以通过加入更多OSD服务器, 升级SSD硬盘来进一步优化.
- 30K文件写入在index分片(16个分片)的情况下, 单副本写入每秒能达到160个文件, 两副本最高能达到每秒145个文件写入, 三副本最高能达到每秒 105个文件. 性能瓶颈在磁盘io上. index不分片, 写入index让对应机器磁盘成为瓶颈. 最高在每秒30个文件左右.
- 100M文件读取, 1~3个副本, 都能达到 100M/s 的读取速度. 性能瓶颈在1000M网卡上.
- 30K文件读取, 1~3个副本, 都能达到100M/s的速度. 性能瓶颈在1000M网卡上. //TODO 这个会对缓存进行清理再测测试.
- 测试过程中千兆网络很容易成为系统瓶颈. 在生产部署时, 最好使用万兆网络. 考虑client网络和cluster网络分离(http://docs.ceph.com/docs/master/rados/configuration/network-config-ref/)
- 测试过程中, index 副本数设置为1, 没有找到index丢失的情况下(概率低), 从数据文件重建的方法, 建议线上环境设置大于等于2.
- 关闭 xfs文件系统 barrier 选项以后, 使文件写入性能提升明显. 如果对写入要求较高的场景, 建议使用nobarrier选项.
- 因文件写入瓶颈在磁盘io上, 测试过程中, 还增加OSD 操作线程数, OSD操作硬盘线程数, 小文件写入都没有提升.
- 因为测试过程中, RGW部署在OSD服务器上, RGW和同一台机器上的OSD访问网络开销会小很多. 分开部署网络开销会高一些. 网络影响很大.