这是最近工作中投入精力较大的一个任务,今天是周五,本来想着放松一下,好好吃吃东西发发呆,可是自己这段时间内很多时间都被这件事情占用,不想着做一些什么让它留个回忆来纪念这段时间我的时间花费实在是不甘心呀。
目标:300k + 50k 同时读写,通过san开出的iscsi盘向存储读写,在千兆网传输下达到的100M左右
基础环境:
- 一号设备(服务器):4个SSD+20个HDD的ceph环境,其中4块ssd每块需要带5个hdd盘的db和wal分区
- 在一号部署san环境,开出一个块设备通过iscsi映射到到二号设备
- 二号发现一号,并建立iscsi连接,并向映射进来的块存储进行读写测试
以上描述大家肯定有很多不懂得地方,这里简单讲解一下我测试用到的一些与性能有关的东西
- hdd硬盘驱动器,就是我们常用的电脑C盘、D盘存储 ,读写速度较慢且无法直接在磁盘上提升。关于硬盘工作原理可以参考浅析硬盘工作原理
- ssd固态存储,速度较快
- ceph环境下的io是通过存储系统每秒的op操作数目向存储盘读写,每个op都会处理ceph数据存储的操作,总体是进行数据迁移,主osd向向副本osd分发备份事务(大哥向小弟布置任务),之后收集反馈(检查任务完成度),保证备份按照规则执行,最后收尾。这里缩短op操作时间来提升ceph底层io性能,难度较大,需要修改ceph源码
- san环境的封装,san环境底层通过hsand服务进行数据读写,交给ceph底层块设备
- 网络封装,二号设备执行的读写需要通过网络传输到一号设备,再次执行一号设备san的hsand服务
- 二号设备缓存的影响(我们测试的是磁盘读写,所以路径尽要可能接近磁盘,这里可将dirty_ratio和dirty_background_ratio两个系统缓存参数,即数据先按照dirty_background_ratio比例写入内存,然后超过这个参数的百分比才开始向存储中写),关于调整这两个参数的方式可以用命令
systcl -v vm.dirty_ratio=10
和sysctl -v vm.dirty_background_ratio=5
,同时该参数存放的位置在/proc/sys/vm/dirty_ratio
目录下,文章dirty_ratio与dirty_background_ratio的区别可以帮助你更好理解 - 执行的并发数是否达到cpu处理上限,(测试过程中短时间达到这样的结果是可以的,不要让cpu长时间处于满负荷状态)
开始执行io测试
我总共使用三个工具尝试 rbd bench
、fio
、我们同事的io工具small_io_tool
rbd bench(先避开网络因素和san环境的封装因素,直接向本地盘刷数据)
使用前提:
- 更换了一下写的方式,在一号设备本地开一块块设备
- 使用工具进行写(rbd bench-write),这个工具只支持写
rbd bench-write <RBD image name>语法如下,可带参数,这里可以参考ceph环境如何创建rbd块设备:
- --io-size:单位 byte,默认 4096 bytes = 4K
- --io-threads:线程数,默认 16
- --io-total:总写入字节,单位为字节,默认 1024M
- --io-pattern <seq|rand>:写模式,默认为 seq 即顺序写
执行
- 总共10000个300k文件,20个线程
[root@node1 ~]# rbd bench-write rbd_write --io-size 307200 --io-threads 20 --io-total 3072000000 -p data
rbd: bench-write is deprecated, use rbd bench --io-type write ...
bench type write io_size 307200 io_threads 20 bytes 3072000000 pattern sequential
SEC OPS OPS/SEC BYTES/SEC
1 1121 1117.59 343322870.14
2 2274 1144.97 351734522.67
3 3165 1061.21 326004583.38
4 4392 1102.90 338809422.25
5 5643 1132.43 347883129.70
6 6915 1163.65 357473906.08
7 8168 1179.55 362357900.50
8 9381 1243.27 381931405.42
elapsed: 8 ops: 10000 ops/sec: 1175.75 bytes/sec: 361190697.81
大概写速度达到了361M/s,1175ops/s 这个数据可以作为存储本身的写速度参考。
- 总共10000个300k文件,100个线程
[root@node1 ~]# rbd bench-write rbd_write --io-size 307200 --io-threads 100 --io-total 3072000000 -p data
rbd: bench-write is deprecated, use rbd bench --io-type write ...
bench type write io_size 307200 io_threads 100 bytes 3072000000 pattern sequential
SEC OPS OPS/SEC BYTES/SEC
1 1610 1708.05 524713872.88
2 3040 1569.89 482271716.97
3 4686 1594.22 489743682.92
4 6317 1603.63 492635848.49
5 7962 1611.33 494999281.40
6 9434 1564.90 480738745.75
elapsed: 6 ops: 10000 ops/sec: 1573.70 bytes/sec: 483440698.21
建议大家在写数据同时通过iotop
,iostat
,vmstat
,top
等命令查看系统状态如下,这里是用20个线程写的数据:
iostat -k -x 2
//我们平时关注的主要是 device 的await ,同时device 的io速度为rkb,wkb参数
//显然我们sd盘符作后端存储的写速度是接近我们rbd bench-write输出的值
avg-cpu: %user %nice %system %iowait %steal %idle
8.66 0.00 9.74 7.28 0.00 74.32
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 19.00 0.00 15.50 0.00 148.00 19.10 0.00 0.06 0.00 0.06 0.06 0.10
dm-0 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
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
sdb 0.00 133.00 0.00 149.50 0.00 53848.00 720.37 1.95 13.07 0.00 13.07 2.66 39.75
sdc 0.00 95.00 0.00 257.50 0.00 44502.00 345.65 0.64 2.48 0.00 2.48 0.75 19.30
sdd 0.00 94.50 0.00 239.50 0.00 43548.00 363.66 0.75 3.13 0.00 3.13 0.77 18.55
sde 0.00 69.50 0.00 188.00 0.00 32966.00 350.70 0.57 3.01 0.00 3.01 0.81 15.25
sdf 0.00 109.50 0.00 236.00 0.00 47104.00 399.19 0.92 3.91 0.00 3.91 0.89 20.95
sdg 0.00 96.00 0.00 234.50 0.00 43008.00 366.81 0.73 3.11 0.00 3.11 0.86 20.20
sdh 0.00 118.00 0.00 251.50 0.00 52744.00 419.44 3.12 13.00 0.00 13.00 1.86 46.85
sdi 0.00 85.50 0.00 173.00 0.00 35822.00 414.13 1.50 8.65 0.00 8.65 1.56 27.05
sdj 0.00 150.50 0.00 326.50 0.00 63638.00 389.82 1.24 3.81 0.00 3.81 0.84 27.55
sdk 0.00 87.50 0.00 206.50 0.00 38912.00 376.87 0.66 3.18 0.00 3.18 0.79 16.25
sdl 0.00 130.00 0.00 326.50 0.00 59542.00 364.73 1.17 3.57 0.00 3.57 0.83 27.20
sdm 0.00 115.50 0.00 282.50 0.00 50492.00 357.47 0.83 2.88 0.00 2.88 0.80 22.55
sdn 0.00 116.50 0.00 251.00 0.00 50308.00 400.86 1.18 4.71 0.00 4.71 0.94 23.50
sdo 0.00 71.00 0.00 189.50 0.00 33068.00 349.00 0.52 2.76 0.00 2.76 0.77 14.60
sdp 0.00 98.00 0.00 251.50 0.00 45344.00 360.59 0.72 2.87 0.00 2.87 0.75 18.80
sdq 0.00 97.00 0.00 208.50 0.00 41260.00 395.78 0.83 4.00 0.00 4.00 0.84 17.45
sdr 0.00 77.50 0.00 203.00 0.00 36020.00 354.88 0.56 2.75 0.00 2.75 0.79 15.95
sds 0.00 82.00 0.00 159.00 0.00 32768.00 412.18 0.67 4.19 0.00 4.19 0.92 14.65
sdt 0.00 95.00 0.00 207.00 0.00 40960.00 395.75 0.80 3.88 0.00 3.88 0.86 17.75
sdu 0.00 136.00 0.00 305.00 0.00 58838.00 385.82 1.11 3.62 0.00 3.62 0.81 24.85
sdv 0.00 0.00 2.50 1119.00 100.00 4756.00 8.66 0.19 0.17 2.20 0.17 0.14 15.20
sdw 0.00 0.00 0.00 1025.50 0.00 3070.00 5.99 0.15 0.15 0.00 0.15 0.14 14.25
sdx 0.00 0.00 0.00 1151.00 0.00 3330.00 5.79 0.18 0.15 0.00 0.15 0.14 16.35
sdy 0.00 0.00 0.00 932.50 0.00 2768.00 5.94 0.14 0.15 0.00 0.15 0.14 13.35
//iotop查看系统线程数,同样也会输出磁盘读写速度,这次就有点快了,速度变动较大,可以多次尝试,记录的时候取较为稳定的一段速率。
[root@node1 ~]# iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 962.01 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 963.28 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
15791 be/4 ceph 0.00 B/s 948.80 K/s 0.00 % 17.11 % ceph-osd -f --cluster ceph --id 8 --setuser ceph --setgroup ceph [bstore_kv_sync]
22597 be/4 ceph 0.00 B/s 865.39 K/s 0.00 % 12.04 % ceph-osd -f --cluster ceph --id 12 --setuser ceph --setgroup ceph [bstore_kv_sync]
358 be/4 ceph 0.00 B/s 733.32 K/s 0.00 % 11.66 % ceph-osd -f --cluster ceph --id 6 --setuser ceph --setgroup ceph [bstore_kv_sync]
23827 be/4 ceph 0.00 B/s 663.81 K/s 0.00 % 11.18 % ceph-osd -f --cluster ceph --id 15 --setuser ceph --setgroup ceph [bstore_kv_sync]
15070 be/4 ceph 0.00 B/s 496.99 K/s 0.00 % 10.77 % ceph-osd -f --cluster ceph --id 11 --setuser ceph --setgroup ceph [bstore_kv_sync]
16259 be/4 ceph 0.00 B/s 802.83 K/s 0.00 % 10.71 % ceph-osd -f --cluster ceph --id 16 --setuser ceph --setgroup ceph [bstore_kv_sync]
10249 be/4 ceph 0.00 B/s 934.90 K/s 0.00 % 10.35 % ceph-osd -f --cluster ceph --id 10 --setuser ceph --setgroup ceph [bstore_kv_sync]
7537 be/4 ceph 0.00 B/s 653.38 K/s 0.00 % 9.98 % ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph [bstore_kv_sync]
26524 be/4 ceph 0.00 B/s 344.07 K/s 0.00 % 9.96 % ceph-osd -f --cluster ceph --id 5 --setuser ceph --setgroup ceph [bstore_kv_sync]
7866 be/4 ceph 0.00 B/s 708.99 K/s 0.00 % 9.79 % ceph-osd -f --cluster ceph --id 19 --setuser ceph --setgroup ceph [bstore_kv_sync]
4523 be/4 ceph 0.00 B/s 865.39 K/s 0.00 % 9.10 % ceph-osd -f --cluster ceph --id 14 --setuser ceph --setgroup ceph [bstore_kv_sync]
18974 be/4 ceph 0.00 B/s 858.44 K/s 0.00 % 8.63 % ceph-osd -f --cluster ceph --id 4 --setuser ceph --setgroup ceph [bstore_kv_sync]
13833 be/4 ceph 0.00 B/s 521.32 K/s 0.00 % 8.36 % ceph-osd -f --cluster ceph --id 9 --setuser ceph --setgroup ceph [bstore_kv_sync]
16777 be/4 ceph 0.00 B/s 649.91 K/s 0.00 % 7.96 % ceph-osd -f --cluster ceph --id 17 --setuser ceph --setgroup ceph [bstore_kv_sync]
17246 be/4 ceph 0.00 B/s 354.50 K/s 0.00 % 7.30 % ceph-osd -f --cluster ceph --id 3 --setuser ceph --setgroup ceph [bstore_kv_sync]
635 be/4 ceph 0.00 B/s 636.01 K/s 0.00 % 7.18 % ceph-osd -f --cluster ceph --id 7 --setuser ceph --setgroup ceph [bstore_kv_sync]
16302 be/4 ceph 0.00 B/s 538.69 K/s 0.00 % 6.69 % ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph [bstore_kv_sync]
29237 be/4 ceph 0.00 B/s 514.37 K/s 0.00 % 6.35 % ceph-osd -f --cluster ceph --id 13 --setuser ceph --setgroup ceph [bstore_kv_sync]
5465 be/4 ceph 0.00 B/s 340.59 K/s 0.00 % 4.22 % ceph-osd -f --cluster ceph --id 18 --setuser ceph --setgroup ceph [bstore_kv_sync]
后面的两个命令top
主要是查看cpu以及各个进程状态,vmstat查看各个进程内存状态,当然也有cpu和io状态,用法可以去网络上查看,但是本次我们主要查看以上两个命令结果,因为内存占用较少,(内存相关两个参数做了调整)。
后续文章会对fio性能压力进行描述,总之,性能测试过程中寻找瓶颈以及后续的调优一定要在理解自己业务场景的前提下进行,否则只是盲目学习工具,没有什么经验或者调优思路的提升的。