使用sysbench对mysql进行基准测试
测试环境说明
硬件
腾讯云标准型SA2
- 1核 2GB 1Mbps
- 系统盘:高性能云硬盘(50G)
软件
- centos 7.5 64位
- mysql 5.7.31
- sysbench 1.0.20
测试过程
使用sysbench。
1. 测试innodb 100w条记录的读写性能
1.1 生成100w数据
此处偷懒了,直接使用了sysbench默认的脚本创建数据库表,如果需要测试特定的表,需要修改/usr/share/sysbench下的脚本,基本只需要修改oltp_common.lua脚本即可,这个需要花时间细致的修改,这次就不在这方面多花时间了。本次主要目的是做基准测试、看看Mysql性能。
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 oltp_read_write prepare |
1.2 进行读写测试
1.2.1 第一次直接执行100w次读写
执行命令:
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write run |
参数说明:
- 指定测试mysql,默认存储引擎是innodb,指定mysql地址、端口、用户等信息
- 选取测试的数据库为sbtest,每个表的大小为100w条数据,创建10张表
- 测试时间300s, 20个线程同时测试
- 输出测试结果95分位
- 每隔10s输出一次当前测试情况
- 选取sysbench中的oltp_read_write.lua,测试读写情况
注意此处没有预热,先观察下没有预热情况下的读写性能,得到如下执行结果:
1 | [root@VM_0_5_centos ~]# sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write run |
1.2.2 第二次执行100w次读写
在第一次执行完成后,再一次执行相同的压测命令:
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write run |
也就是说,将第一次执行当做预热,然后得到了如下结果:
1 | [root@VM_0_5_centos ~]# sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write run |
1.2.3 第三次执行100w次读写
还是这条命令,再次执行看下:
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write run |
最后执行结果如下:
1 | [root@VM_0_5_centos ~]# sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write run |
1.3 清理数据
使用如下命令清理数据
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 oltp_read_write cleanup |
2. 测试myisam 100w条记录的读写性能
2.1 生成100w数据
使用
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 oltp_read_write help |
可以看到oltp_read_write脚本所支持的参数,如下所示:
1 | [root@VM_0_5_centos ~]# sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 oltp_read_write help |
此处我们指定下数据库存储引擎为myisam,执行:
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 oltp_read_write --mysql_storage_engine=myisam prepare |
即可创建MyIsam的表。
2.2 进行读写测试
2.2.1 第一次执行100w次读写
执行命令
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write --mysql_storage_engine=myisam run |
测试结果如下:
1 | ...... |
2.2.2 第二次执行100w次读写
相同命令,再来一次:
1 | ...... |
2.2.3 第三次执行100w次读写
1 | ······ |
2.3 清理数据
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 oltp_read_write cleanup |
测试总结
| 压测指标 | InnoDB | MyISAM | |
|---|---|---|---|
| 第一次 | 读、写次数 | 读:527282 写:150652 其他:75326 事务:37663 总计:753260 | 读:722036 写:206294 其他:103150 总计:1031480 |
| 耗时 | 最小:7.13ms 平均:159.35ms 最大:873.88ms 95分位数:292.60ms | 最小:2.91ms 平均:116.36ms 最大:2703.01ms 95分位数:153.02ms | |
| 吞吐量 | 1883.1500 | 2578.7000 | |
| 第二次 | 读、写次数 | 读:574434 写:164124 其他:82062 事务:41031 总计:820620 | 读:697480 写:199279 其他:99641 总计:996400 |
| 耗时 | 最小:6.62ms 平均:146.24ms 最大:709.59ms 95分位数:262.64ms | 最小:2.86ms 平均:120.45ms 最大:3435.92ms 95分位数:176.73ms | |
| 吞吐量 | 2051.5500 | 2491.0000 | |
| 第三次 | 读、写次数 | 读:595840 写:170240 其他:85120 事务:42560 总计:851200 | 读:680372 写:194389 其他:97199 总计:971960 |
| 耗时 | 最小:6.18ms 平均:141.02ms 最大:687.11ms 95分位数:257.95ms | 最小:2.88ms 平均:123.52ms 最大:2916.81ms 95分位数:189.93ms | |
| 吞吐量 | 2128.0000 | 2429.9000 | |
分析
纵向对比
经过预热之后,可以看到InnoDB的性能越来越好,每秒能处理2000多请求。不排除预热充分后能反超MyISAM的可能性,不过这个我就没继续多测试了。
MyISAM每秒能处理2500左右。
横向对比
从目前做的测试来看,InnoDB在读写性能上还是不及MyISAM,不排除预热充分后能反超MyISAM的可能性,不过这个我就没继续多测试了。
其他
图形化
可以将sysbench压测结果输出日志、然后绘制成图片,这样看着更高大上、更加直观。可以参考这篇文章:https://yq.aliyun.com/articles/498680
遇到的问题
- 本来想使用sysbench的预热功能,使用如下命令
1 | sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write prewarm |
但有报如下错误,时间有限,没仔细排查:
1 | [root@VM_0_5_centos ~]# sysbench --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=1qaz@WSX --mysql-db=sbtest --table_size=1000000 --tables=10 --events=0 --time=300 --threads=20 --percentile=95 --report-interval=10 oltp_read_write prewarm |