如何使用 Sysbench 对 Mysql进行压力测试?
2018-05-17 by dongnan
目标
使用 sysbench
工具,对阿里云 RDS Mysql
云数据库进行压力测试。
概念
测试关注两个指标:
- QPS,
Queries Per Second
,即数据库每秒执行的SQL
数(含insert、select、update、delete
等)。 - TPS,
Transactions Per Second
,即数据库每秒执行的事务数,以commit
成功次数为准。
环境
sysbech
0.5 版本,安装请参考这里。
地域
金融云. 华东 1可用区B/D
ECS
配置: ecs.sn2.medium / 2vCPU /8GB(I/O优化) / CentOS 7.4 amd64
IP: 10.2xx.1xx.2x
RDS
配置: rds.mysql.s2.large ,高可用版.通用型: 2核/4GB内存/80GB SSD存储/IOPS:2000/最大连接数:1200/ MySQL 5.6
IP: rm-bxxxxxxxx8.mysql.rds.aliyuncs.com
测试步骤
使用 16
个线程,创建 32
张表格,每个表格 100W
条数据。
准备数据
sysbench --num-threads=16 --oltp-tables-count=32 \
--test=oltp.lua --oltp-table-size=1000000 \
--db-driver=mysql --mysql-table-engine=innodb \
--mysql-host=rm-bxxxxxxxx8.mysql.rds.aliyuncs.com \
--mysql-port=3306 --mysql-user=test-user --mysql-password=test-passwd \
prepare
sysbench 0.5: multi-threaded system evaluation benchmark
Creating table 'sbtest-user'...
Inserting 1000000 records into 'sbtest-user'
Creating secondary indexes on 'sbtest-user'...
# ...省略
Inserting 1000000 records into 'sbtest32'
Creating secondary indexes on 'sbtest32'...
压测性能
sysbench --num-threads=16 --oltp-tables-count=32 \
--max-time=600 --max-requests=0 \
--test=oltp.lua --oltp-table-size=1000000 \
--db-driver=mysql --mysql-table-engine=innodb \
--mysql-host=rm-bxxxxxxxx8.mysql.rds.aliyuncs.com \
--mysql-port=3306 --mysql-user=test-user --mysql-password=test-passwd \
run
sysbench 0.5: multi-threaded system evaluation benchmark
# ...省略
OLTP test statistics:
queries performed:
read: 2949716
write: 842776
other: 421388
total: 4213880
transactions: 210694 (351.13 per sec.)
read/write requests: 3792492 (6320.38 per sec.)
other operations: 421388 (702.26 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0415s
total number of events: 210694
total time taken by event execution: 9599.9833s
response time:
min: 34.58ms
avg: 45.56ms
max: 273.42ms
approx. 95 percentile: 55.85ms
Threads fairness:
events (avg/stddev): 13168.3750/1118.95
execution time (avg/stddev): 599.9990/0.01
清理数据
sysbench --num-threads=16 --oltp-tables-count=32 \
--max-time=600 --max-requests=0 \
--test=oltp.lua --oltp-table-size=1000000 \
--db-driver=mysql --mysql-table-engine=innodb \
--mysql-host=rm-bxxxxxxxx8.mysql.rds.aliyuncs.com \
--mysql-port=3306 --mysql-user=test-user --mysql-password=test-passwd \
cleanup
sysbench 0.5: multi-threaded system evaluation benchmark
Dropping table 'sbtest-user'...
# ...省略
Dropping table 'sbtest32'...
测试结果
sysbench
的结果:
QPS:6320,
TPS: 351 。
RDS
控制台的结果:
QPS:7188,TPS:359 。
rds-cpu
rds-iops
rds-qps-tps
小结
- 从测试结果来看,
CPU
与IOPS
分别达到最大值,成为瓶颈。 - 测试结果超预期,
OPS
与TPS
远高于rds.mysql.s2.large
接近rds.mysql.s3.large
。
命令参数
--mysql-table-engine
:指定存储引擎,如myisam,innodb,heap,ndbcluster,bdb,maria,falcon,pbxt--mysql-db
:指定在哪个数据库创建测试表,默认为sbtest库,需要提前创建好。--test
:指定Lua脚本,参数选项大部分同老版本的--test=oltp help 。--db-driver
:指定驱动,默认为Mysql 。--oltp-secondary
:测试表将使用二级索引KEY xid (ID) 替代 PRIMARY KEY (ID),innodb引擎内部为每个表 创建唯一6字节的主键索引 。--oltp-auto-inc
:设置id列为auto-incremental,值为on或off,默认为on 。--oltp-table-size
:指定表的大小,即表的行数 。--oltp-dist-type
:指定随机取样类型,默认为special,允许的值:uniform、gauss、special 。--oltp-dist-pct
:记录读取百分比 。--oltp-dist-res
:分配的概率 。--oltp-read-only
:执行仅仅SELECT测试,默认off 。--oltp-tables-count
: 创建多个表,默认为1 。--num-threads
:指定并发线程数,每个线程将选择一个随机的表--oltp-tables-count
的数量应该是--num-threads
的倍数。- 如果使用
--max-time
(这里设置600s),需要设置--max-reques
t为0,默认是10000(总请求数) 。
参考
- sysbench 之 IO基准测试
- https://my.oschina.net/anthonyyau/blog/290030
- https://www.cnblogs.com/kunpengv5/p/7477614.html
- https://help.aliyun.com/document_detail/53635.html?spm=a2c4g.11186623.6.784.fMGG2I