前言
本文采用 MySQL 沙盒实例作为测试目标,使用 sysbench-1.20 对其做 OLTP 基准测试。
有关 MySQL 沙盒的更多信息,请参阅 玩转 MySQL Shell 沙盒实例,【MySQL Shell】6.8 AdminAPI MySQL 沙盒 。
1、部署一个 MySQL 沙盒实例
使用 mysqlsh
部署一个 MySQL 沙盒实例用于测试 OLTP 。
MySQL JS > dba.deploySandboxInstance(3310);
A new MySQL sandbox instance will be created on this host in
/root/mysql-sandboxes/3310
Warning: Sandbox instances are only suitable for deploying and
running on your local machine for testing purposes and are not
accessible from external networks.
Please enter a MySQL root password for the new instance: ********
Deploying new MySQL instance...
Instance localhost:3310 successfully deployed and started.
Use shell.connect('root@localhost:3310') to connect to the instance.
2、创建 sysbench oltp 测试的基础配置文件
为什么要使用配置文件?方便快捷啊!配置文件可以简化操作,省着在命令行中指定这些参数时至少还要多打 --
和空格。如果一些参数可以复用,建议创建一个配置文件。
$ cat mysql-sb.cnf
threads=2
time=600
db-driver=mysql
mysql-host=localhost
mysql-port=3310
mysql-socket=/root/mysql-sandboxes/3310/sandboxdata/mysqld.sock
mysql-user=root
mysql-password=Ro123ot$
mysql-db=sbtest
在创建时读者可能遇到一个问题,在配置文件中指定诸如 tables
选项时不生效,并且会报 Unknown argument type: 0
。而在命令行中指定时则有效。原因是什么呢?
因为这个参数是 Lua 脚本的参数,而不是 sysbench
这个二进制可执行文件的参数!
所以应该在命令行中使用诸如 --tables=N
这样的 Lua 脚本参数来测试。
3、准备测试数据
笔者准备了 100 个包含 10000 行数据的测试表,库名和表名都是用默认值。
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_common prepare
注意此阶段的屏幕打印信息,多线程时可能出现争用,导致部分表未创建成功,或写入的数据不全。
sbtest6
创建失败报错:
计划创建 100 张表,实际只创建了 53 个,上面的 sbtest6
表虽然最后创建成功了,但插入的数据不全。
4、运行测试
1) oltp_read_write
建议先对支持 prewarm
选项的 Lua 脚本使用 prewarm
选项,以预热数据到内存,提高性能。
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_read_write.lua prewarm
因输出过长,以下仅截取部分信息。
预热后:
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_read_write.lua run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 2272046
write: 530149
other: 443585
total: 3245780
transactions: 162289 (270.47 per sec.)
queries: 3245780 (5409.35 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0289s
total number of events: 162289
Latency (ms):
min: 4.40
avg: 7.39
max: 427.68
95th percentile: 10.09
sum: 1199185.78
Threads fairness:
events (avg/stddev): 81144.5000/31.50
execution time (avg/stddev): 599.5929/0.00
未预热,同时使用周期报告来每 5 秒生成一次报告信息:
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_read_write run --report-interval=5
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Report intermediate results every 5 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!
[ 5s ] thds: 2 tps: 137.01 qps: 2747.56 (r/w/o: 1923.71/549.43/274.42) lat (ms,95%): 23.52 err/s: 0.00 reconn/s: 0.00
[ 10s ] thds: 2 tps: 199.67 qps: 3993.69 (r/w/o: 2795.44/798.90/399.35) lat (ms,95%): 14.73 err/s: 0.00 reconn/s: 0.00
[ 15s ] thds: 2 tps: 204.00 qps: 4080.05 (r/w/o: 2856.03/816.01/408.00) lat (ms,95%): 12.52 err/s: 0.00 reconn/s: 0.00
...
[ 590s ] thds: 2 tps: 285.00 qps: 5698.37 (r/w/o: 3989.18/1139.19/570.00) lat (ms,95%): 9.06 err/s: 0.00 reconn/s: 0.00
[ 595s ] thds: 2 tps: 285.80 qps: 5714.78 (r/w/o: 3999.39/1144.00/571.40) lat (ms,95%): 9.06 err/s: 0.00 reconn/s: 0.00
[ 600s ] thds: 2 tps: 281.97 qps: 5641.39 (r/w/o: 3949.97/1127.28/564.14) lat (ms,95%): 9.22 err/s: 0.00 reconn/s: 0.00
SQL statistics:
queries performed:
read: 2126824
write: 607664
other: 303832
total: 3038320
transactions: 151916 (253.18 per sec.)
queries: 3038320 (5063.66 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0218s
total number of events: 151916
Latency (ms):
min: 4.70
avg: 7.89
max: 1579.23
95th percentile: 9.91
sum: 1199355.27
Threads fairness:
events (avg/stddev): 75958.0000/101.00
execution time (avg/stddev): 599.6776/0.00
2) oltp_point_select.lua
注意,
.lua
后缀加不加都行。
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_point_select.lua run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Report intermediate results every 5 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!
[ 5s ] thds: 2 tps: 13309.18 qps: 13309.18 (r/w/o: 13309.18/0.00/0.00) lat (ms,95%): 0.21 err/s: 0.00 reconn/s: 0.00
[ 10s ] thds: 2 tps: 12990.77 qps: 12990.77 (r/w/o: 12990.77/0.00/0.00) lat (ms,95%): 0.22 err/s: 0.00 reconn/s: 0.00
[ 15s ] thds: 2 tps: 13777.54 qps: 13777.54 (r/w/o: 13777.54/0.00/0.00) lat (ms,95%): 0.20 err/s: 0.00 reconn/s: 0.00
...
[ 590s ] thds: 2 tps: 13479.94 qps: 13479.94 (r/w/o: 13479.94/0.00/0.00) lat (ms,95%): 0.20 err/s: 0.00 reconn/s: 0.00
[ 595s ] thds: 2 tps: 13402.69 qps: 13402.69 (r/w/o: 13402.69/0.00/0.00) lat (ms,95%): 0.20 err/s: 0.00 reconn/s: 0.00
[ 600s ] thds: 2 tps: 13573.04 qps: 13573.04 (r/w/o: 13573.04/0.00/0.00) lat (ms,95%): 0.20 err/s: 0.00 reconn/s: 0.00
SQL statistics:
queries performed:
read: 8165259
write: 0
other: 0
total: 8165259
transactions: 8165259 (13608.60 per sec.)
queries: 8165259 (13608.60 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0052s
total number of events: 8165259
Latency (ms):
min: 0.12
avg: 0.15
max: 48.51
95th percentile: 0.20
sum: 1189126.95
Threads fairness:
events (avg/stddev): 4082629.5000/4029.50
execution time (avg/stddev): 594.5635/0.01
3) oltp_write_only.lua
上面设置的 report-interval
每 5 秒报告一次太频繁了,笔者目的是为了演示 sysbench 的用法,因而选择后面不再报告了。
此外,这个测试我在命令行增加了开启直方图的参数 --histogram=on
,来看一下效果吧!
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_write_only.lua run --histogram=on
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
Latency histogram (values are in milliseconds)
value ------------- distribution ------------- count
1.759 | 1
1.824 | 1
1.857 | 5
1.891 | 11
1.925 | 22
1.960 | 69
1.996 | 149
2.032 | 201
2.069 |* 335
2.106 |* 557
2.145 |** 947
2.184 |*** 1327
2.223 |**** 1896
2.264 |***** 2608
2.305 |******* 3578
2.347 |********** 4687
2.389 |************* 6072
2.433 |**************** 7844
2.477 |******************** 9856
2.522 |************************ 11344
2.568 |************************** 12441
2.615 |***************************** 13762
2.662 |******************************* 15034
2.710 |********************************** 16514
2.760 |************************************* 17735
2.810 |**************************************** 19185
2.861 |**************************************** 19258
2.913 |*************************************** 18997
2.966 |************************************** 18409
3.020 |*********************************** 17069
3.075 |********************************* 15689
3.130 |******************************* 14864
3.187 |**************************** 13647
3.245 |************************** 12369
3.304 |*********************** 11086
3.364 |******************** 9858
3.425 |****************** 8680
3.488 |**************** 7786
3.551 |************** 6774
3.615 |************ 5633
3.681 |********** 4828
3.748 |******** 3991
3.816 |******* 3428
3.885 |****** 2853
3.956 |***** 2360
4.028 |**** 1948
4.101 |*** 1648
4.176 |*** 1346
4.252 |** 1082
4.329 |** 1005
4.407 |** 796
4.487 |* 679
4.569 |* 629
4.652 |* 548
4.737 |* 473
4.823 |* 498
4.910 |* 453
4.999 |* 462
5.090 |* 456
5.183 |* 448
5.277 |* 458
5.373 |* 499
5.470 |* 478
5.570 |* 517
5.671 |* 481
5.774 |* 544
5.879 |* 561
5.986 |* 546
6.095 |* 568
6.205 |* 549
6.318 |* 570
6.433 |* 529
6.550 |* 575
6.669 |* 496
6.790 |* 463
6.913 |* 451
7.039 |* 418
7.167 |* 407
7.297 |* 355
7.430 |* 353
7.565 |* 308
7.702 |* 266
7.842 |* 259
SQL statistics:
queries performed:
read: 0
write: 1480184
other: 740092
total: 2220276
transactions: 370046 (616.73 per sec.)
queries: 2220276 (3700.37 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0123s
total number of events: 370046
Latency (ms):
min: 1.76
avg: 3.24
max: 1266.80
95th percentile: 4.41
sum: 1198670.01
Threads fairness:
events (avg/stddev): 185023.0000/8.00
execution time (avg/stddev): 599.3350/0.00
输出信息也太长了,以上仅截取重要的直方图部分。
4) oltp_delete.lua
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_delete.lua run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 0
write: 312795
other: 3073107
total: 3385902
transactions: 3385902 (5643.06 per sec.)
queries: 3385902 (5643.06 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0094s
total number of events: 3385902
Latency (ms):
min: 0.11
avg: 0.35
max: 774.49
95th percentile: 1.58
sum: 1194234.55
Threads fairness:
events (avg/stddev): 1692951.0000/195.00
execution time (avg/stddev): 597.1173/0.01
5) oltp_insert.lua
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_insert.lua run --histogram=on
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
Latency histogram (values are in milliseconds)
value ------------- distribution ------------- count
0.872 | 1
0.888 | 3
0.904 | 7
0.920 | 12
0.937 | 43
0.954 | 73
0.971 | 186
0.989 | 359
1.007 |* 548
1.025 |* 640
1.044 |* 829
1.063 |* 1277
1.082 |*** 2289
1.102 |**** 3604
1.122 |****** 4984
1.142 |******* 6073
1.163 |********* 7463
1.184 |********** 8819
1.205 |*********** 9559
1.227 |************* 10751
1.250 |*************** 12863
1.272 |******************* 15982
1.295 |********************** 19122
1.319 |************************* 21523
1.343 |************************** 22617
1.367 |***************************** 24922
1.392 |********************************** 29320
1.417 |************************************** 32289
1.443 |************************************** 32792
1.469 |*************************************** 33521
1.496 |**************************************** 34324
1.523 |************************************** 32975
1.551 |*************************************** 33122
1.579 |************************************** 32907
1.608 |************************************* 31956
1.637 |************************************ 30909
1.667 |********************************** 29239
1.697 |******************************** 27315
1.728 |***************************** 25275
1.759 |************************** 22348
1.791 |********************** 18824
1.824 |******************* 16152
1.857 |***************** 14749
1.891 |*************** 13044
1.925 |************* 10862
1.960 |*********** 9120
1.996 |********* 7758
2.032 |******** 6459
2.069 |****** 5426
2.106 |***** 4678
2.145 |***** 4135
2.184 |**** 3500
2.223 |**** 3054
2.264 |*** 2768
2.305 |*** 2319
2.347 |** 2034
2.389 |** 1773
2.433 |** 1516
2.477 |** 1301
2.522 |* 1070
2.568 |* 954
2.615 |* 755
2.662 |* 675
2.710 |* 631
2.760 |* 492
2.810 |* 451
2.861 |
SQL statistics:
queries performed:
read: 0
write: 744453
other: 0
total: 744453
transactions: 744453 (1240.74 per sec.)
queries: 744453 (1240.74 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0049s
total number of events: 744453
Latency (ms):
min: 0.87
avg: 1.61
max: 926.39
95th percentile: 2.11
sum: 1196638.09
Threads fairness:
events (avg/stddev): 372226.5000/3.50
execution time (avg/stddev): 598.3190/0.01
6) oltp_read_only.lua
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_read_only.lua run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 7425740
write: 0
other: 1060820
total: 8486560
transactions: 530410 (883.99 per sec.)
queries: 8486560 (14143.89 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0137s
total number of events: 530410
Latency (ms):
min: 1.97
avg: 2.26
max: 54.63
95th percentile: 3.07
sum: 1198568.01
Threads fairness:
events (avg/stddev): 265205.0000/33.00
execution time (avg/stddev): 599.2840/0.00
7) oltp_update_index.lua
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_update_index.lua run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 0
write: 145095
other: 4800953
total: 4946048
transactions: 4946048 (8243.33 per sec.)
queries: 4946048 (8243.33 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0030s
total number of events: 4946048
Latency (ms):
min: 0.12
avg: 0.24
max: 259.25
95th percentile: 0.42
sum: 1192593.66
Threads fairness:
events (avg/stddev): 2473024.0000/862.00
execution time (avg/stddev): 596.2968/0.08
8) oltp_update_non_index.lua
$ sysbench --config-file=mysql-sb.cnf --tables=100 oltp_update_non_index.lua run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 0
write: 141508
other: 4686830
total: 4828338
transactions: 4828338 (8047.17 per sec.)
queries: 4828338 (8047.17 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0022s
total number of events: 4828338
Latency (ms):
min: 0.12
avg: 0.25
max: 382.28
95th percentile: 0.44
sum: 1192434.24
Threads fairness:
events (avg/stddev): 2414169.0000/3780.00
execution time (avg/stddev): 596.2171/0.04
9) select_random_points.lua
10) select_random_ranges.lua
11) bulk_insert.lua
此测试与前面那些测试有些不同,它只会创建与线程数相同的个数的表,并且没有 talbes
参数。因此我们需要修改执行命令,先清理 sbtest1
和 sbtest2
表的数据,然后再 prepare
,最后再 run
。
$ sysbench --config-file=mysql-sb.cnf bulk_insert.lua cleanup
$ sysbench --config-file=mysql-sb.cnf bulk_insert.lua prepare
$ sysbench --config-file=mysql-sb.cnf --tables=100 bulk_insert.lua run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 0
write: 2075
other: 0
total: 2075
transactions: 56561449 (94080.36 per sec.)
queries: 2075 (3.45 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.9490s
total number of events: 56561449
Latency (ms):
min: 0.00
avg: 0.02
max: 2011.20
95th percentile: 0.00
sum: 1182530.43
Threads fairness:
events (avg/stddev): 28280724.5000/13106.50
execution time (avg/stddev): 591.2652/0.25
MySQL 数据库内的执行结果如下:
MySQL localhost:3310 ssl sbtest SQL > select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
| 28293831 |
+----------+
1 row in set (1.7266 sec)
MySQL localhost:3310 ssl sbtest SQL > select count(*) from sbtest2;
+----------+
| count(*) |
+----------+
| 28267618 |
+----------+
1 row in set (1.8061 sec)
我们可以修改 times
参数为一个较小的值,因为没有必要批量插入 10 分钟的数据。
$ sysbench --config-file=mysql-sb.cnf bulk_insert.lua prepare --time=60
$ sysbench --config-file=mysql-sb.cnf bulk_insert.lua run --time=60
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 2
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 0
write: 190
other: 0
total: 190
transactions: 5722434 (94526.75 per sec.)
queries: 190 (3.14 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 60.5316s
total number of events: 5722434
Latency (ms):
min: 0.00
avg: 0.02
max: 1102.79
95th percentile: 0.00
sum: 118906.30
Threads fairness:
events (avg/stddev): 2861217.0000/0.00
execution time (avg/stddev): 59.4532/0.19
可以看到再命令行最后指定的 --times=60
覆盖了配置文件中指定的 time=600
。
MySQL localhost:3310 ssl sbtest SQL > select 'sbtest1' table_name,count(*) from sbtest1 union all
-> select 'sbtest1' table_name,count(*) from sbtest2;
+------------+----------+
| table_name | count(*) |
+------------+----------+
| sbtest1 | 2861217 |
| sbtest1 | 2861217 |
+------------+----------+
2 rows in set (0.4175 sec)
5、清理数据
$ sysbench --config-file=mysql-sb.cnf oltp_common.lua --tables=100 cleanup
6、销毁 MySQL 沙盒实例
在 mysqlsh
终端中执行:
MySQL localhost:3310 ssl sbtest JS > dba.stopSandboxInstance(3310)
The MySQL sandbox instance on this host in
3310 will be stopped
Please enter the MySQL root password for the instance 'localhost:3310': ********
The active session is established to the sandbox being stopped so it's going to be closed.
Stopping MySQL instance...
Instance localhost:3310 successfully stopped.
MySQL JS > dba.deleteSandboxInstance(3310);
Deleting MySQL instance...
Instance localhost:3310 successfully deleted.