Shuo
Shuo I'm a DBA(Database Administrator), we can share and discuss MySQL, MongoDB, Redis and other databases here, also including learning Python, Shell, Golang together.

MySQL手记2 — sysbench测试磁盘IO


MySQL手记2 — sysbench测试磁盘IO

一、磁盘性能测试

对于基础硬件资源的性能测试,刚工作时,我也是人云亦云,不知道为什么要这么去做。在后面的工作中,逐渐意识到了性能压测,又或称其为基准测试的重要性。在MySQL数据库界的一个宝藏书籍:《高性能MySQL》中,就有详细的介绍。

二、Sysbench测试磁盘IO

很多人性能压测,就是按照文档跑一遍,这种做法比较差强人意,在生产环境中,上线前对于机器的压测显得尤为重要。

1. 文件大小的选择

光是这一点列出来,想必大部分人都有恍然大悟的感觉,对于测试IO时候,应当选取多大的数据文件,也是有讲究的:例如线上实际是500GB的数据文件,但是在测试时候只生成了10GB的文件进行IO测试,这样得到的结果,就与实际结果具有较大的误差。

2.测试过程

Sysbench测试的过程为:
(1)生成指定大小和数目的数据文件;
(2)按照指定算法运行IO测试;
(3)清除数据文件

2.1 生成文件

1
2
sysbench --test=fileio --file-total-size=1GB  --file-num=128 prepare

1
2
3
​显而易见,生成128个总大小为1GB的文件进行IO测试。
​sysbench还有很多的指标,可供测试的时候选用,用以得到最为符合线上情况的效果。


​在生成文件时,是顺序写入,可以看出该磁盘的顺序写入性能为:179 MiB/s。

2.2 run

1
2
sysbench fileio --num-threads=32 --file-total-size=1GB  --file-num=10 --file-test-mode=rndrw  run

主要关注:
–file-test-mode,可选的算法有:seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw,即顺序写、顺序读写、顺序读、随机读、随机写、随机读写
虽然MySQL的数据在逻辑上,是按照主键(聚集索引)进行排布的,但是实际在物理,为随机读写rndrw。这点也是在基准测试时,需要着重注意的,而不是当被问到:为什么使用随机读写的时候,自己也一脸懵
由于MySQL的这个属性,所以我们在测试IO的时候同样选择随机读写rndrw进行测试。

1
2
​sysbench在运行时,会打印相关的信息

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
45
46
47
48
49
50
51
52
53
54
[admin@ws_001 sysbench]$ sysbench fileio --num-threads=32 --file-total-size=1GB  --file-num=128  --file-test-mode=rndrw  run
WARNING: --num-threads is deprecated, use --threads instead
sysbench 1.0.17 (using system LuaJIT 2.0.4)
​
Running the test with following options:
Number of threads: 32
Initializing random number generator from current time
​
​
Extra file open flags: (none)
128 files, 8MiB each
1GiB total file size
Block size 16KiB
Number of IO requests: 0
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Initializing worker threads...
​
​
Threads started!
​
​
File operations:
    reads/s:                      2070.70
    writes/s:                     1379.97
    fsyncs/s:                     4819.37
​
​
Throughput:
    read, MiB/s:                  32.35
    written, MiB/s:               21.56
​
​
General statistics:
    total time:                          10.1124s
    total number of events:              79547
​
​
Latency (ms):
         min:                                    0.00
         avg:                                    4.03
         max:                                  263.72
         95th percentile:                       23.52
         sum:                               320278.15
​
​
Threads fairness:
    events (avg/stddev):           2485.8438/187.43
    execution time (avg/stddev):   10.0087/0.02
​

1
2
3
4
5
6
​Mbit/s:每秒传输10^6 bit的数据,也写成Mbps
​MB/s:每秒传输10^6 byte的数据
​MiB/s:每秒传输2^20 byte的数据

​可以看到,读写速率为2070reads/s、1379writes/s,读写吞吐量为:32MiB/s、21MiB/s,并且读写的延迟为23.52毫秒。对比在上个步骤中顺序写入的性能,可以大致猜测该磁盘为机械盘,而非SSD,因为SSD的随机读写的性能很高,并且SSD的随机读写和顺序读写不会相差那么高(这个结论也是多次在机房做基准测试得到的结论)。

此次测试的误差其实较大,因为使用较小的文件进行测试,往往很容易受硬件资源抖动的影响。本案例只是用来说明测试需要关注的要点。

参考:https://en.wikipedia.org/wiki/Data-rate_units

根据读写量、吞吐量、延迟的情况,可以初步得出结论:该磁盘是否能满足生产环境的要求

此外,通过查看sysbench –help信息,sysbench还可以用来测试CPU、内存等的信息:

至此,sysbench测试磁盘IO的介绍到一段落。测试不是目的,而为什么测试、想要获得什么样的结果,才是我们应该着重关注的,只有测试多种场景,才能使我们的系统在生产环境中更加稳健。
欢迎关注公众号:朔的话

comments powered by Disqus