MySQL(⼗⼆)压⼒测试⼯具-sysbench使⽤与报告解读
mysql是什么系统
MySQL压⼒测试⼯具-sysbench使⽤与报告解读神秘代码
什么是基准测试?
数据库的基准测试是对数据库的性能指标进⾏定量的、可复现的、可对⽐的测试。
基准测试与压⼒测试
基准测试可以理解为针对系统的⼀种压⼒测试。但基准测试不关⼼业务逻辑,更加简单、直接、易于测试,数据可以由⼯具⽣成,不要求真实;⽽压⼒测试⼀般考虑业务逻辑(如购物车业务),要求真实的数据。
基准测试的作⽤?
对于多数Web应⽤,整个系统的瓶颈在于数据库;原因很简单:Web应⽤中的其他因素,例如⽹络带宽、负载均衡节点、应⽤服务器(包括CPU、内存、硬盘灯、连接数等)、缓存,都很容易通过⽔平的扩展(俗称加机器)来实现性能的提⾼。⽽对于MySQL,由于数据⼀致性的要求,⽆法通过增加机器来分散向数据库写数据带来的压⼒;虽然可以通过前置缓存(Redis等)、读写分离、分库分表来减轻压⼒,但是与系统其它组件的⽔平扩展相⽐,受到了太多的限制。
⽽对数据库的基准测试的作⽤,就是分析在当前的配置下(包括硬件配置、OS、数据库设置等),数据库的性能表现,从⽽出MySQL的性能阈值,并根据实际系统的要求调整配置。
基准测试的指标:
常见的数据库指标包括:
TPS/QPS:衡量吞吐量。(TPS:每秒事务处理量(TransactionPerSecond)、每秒查询率QPS是对⼀个特定的查询服务器在规定时间内所处理流量多少的衡量标准)
响应时间:包括平均响应时间、最⼩响应时间、最⼤响应时间、时间百分⽐等,其中时间百分⽐参考意义较⼤,如前95%的请求的最⼤响应时间。。
并发量:同时处理的查询请求的数量。
基准测试的分类:
对MySQL的基准测试,有如下两种思路:
针对整个系统的基准测试:通过http请求进⾏测试,如通过浏览器、APP或postman等测试⼯具。该⽅案的优点是能够更好的针对整个系统,测试结果更加准确;缺点是设计复杂实现困难。
只针对MySQL的基准测试:优点和缺点与针对整个系统的测试恰好相反。
在针对MySQL进⾏基准测试时,⼀般使⽤专门的⼯具进⾏,例如mysqlslap、sysbench等。其中,sysbench⽐mysqlslap更通⽤、更强⼤,且更适合Innodb(因为模拟了许多Innodb的IO特性),下⾯介绍使⽤sysbench进⾏基准测试的⽅法。
sysbench简介
sysbench是跨平台的基准测试⼯具,⽀持多线程,⽀持多种数据库;主要包括以下⼏种测试:
cpu性能
磁盘io性能
调度程序性能
内存分配及传输速度
POSIX线程性能
数据库性能(OLTP基准测试)
sysbench安装:
YUM安装:
[root@db ~]# yum -y install sysbench
编译安装:
[root@db ~]# yum -y install  make automake libtool pkgconfig libaio-devel vim-common unzip mysql-devel
[root@db ~]# wget github/akopytov/sysbench/archive/master.zip
[root@db ~]# unzip master.zip
[root@db ~]# cd sysbench-master/
[root@db ~]# ./autogen.sh
[root@db ~]# ./configure --prefix=/usr/local/sysbench
[root@db ~]# make -j
[root@db ~]# make install
java tcp编程
[root@db ~]# /usr/local/sysbench/bin/sysbench --version
sysbench 1.1.0
nodejs算后端吗
sysbench参数:
MySQL连接参数:
$ --mysql-host:MySQL服务器主机名,默认localhost;如果在本机上使⽤localhost报错,提⽰⽆法连接MySQL服务器,改成本机的IP地址应该就可以了。$ --mysql-port:MySQL服务器端⼝,默认3306
$ --mysql-user:⽤户名
$ --mysql-password:密码
$ --mysql-db: 操作哪个库
MySQL执⾏参数:
$ --oltp-test-mode:执⾏模式,包括simple、nontrx和complex,默认是complex。simple模式下只测试简单的查询;nontrx不仅测试查询,还测试插⼊更新等,但是不使⽤事务;complex模式下测试最全⾯,会测试增删改查,⽽且会使⽤事务。可以根据⾃⼰的需要选择测试模式。
$ --oltp-tables-count:测试的表数量(⼀个库下模拟多少张表)
$ --oltp-table-size:测试的表的⼤⼩(每张表中模拟多少⾏数据)
$ --threads:客户端的并发连接数
$ --time:测试执⾏的时间,单位是秒,该值不要太短,可以选择120
$ --report-interval:⽣成报告的时间间隔,单位是秒,如10
sysbench使⽤⽰例:
模拟数据:
mysql>create database testdb;
Query OK,1row affected (0.05 sec)
[root@db~]# sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--mysql-host=10.186.61.211 --mysql-port=3306 --mysql-user=root --mysql-password=123456 \ --mysql-db=testdb --oltp-table-size=200000 --oltp-tables-count=4 --threads=4 --events=0 \
--time=3600 --report-interval=3 prepare
sysbench 1.0.17(using system LuaJIT 2.0.4)
Creating table'sbtest1'...
Inserting 200000 records into'sbtest1'
Creating secondary indexes on'sbtest1'...
Creating table'sbtest2'...
Inserting 200000 records into'sbtest2'
Creating secondary indexes on'sbtest2'...
Creating table'sbtest3'...
Inserting 200000 records into'sbtest3'
Creating secondary indexes on'sbtest3'...
Creating table'sbtest4'...
Inserting 200000 records into'sbtest4'
Creating secondary indexes on'sbtest4'...
压⼒测试报告:
[root@db ~]# sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--mysql-host=10.186.61.211 --mysql-port=3306 --mysql-user=root --mysql-password=123456 \
--mysql-db=testdb --oltp-table-size=200000 --oltp-tables-count=4 --threads=4 --events=0 \
--time=30 --report-interval=3 run
sysbench 1.0.17 (using system LuaJIT 2.0.4)
Running the test with following options:
Number of threads: 4
Report intermediate results every 3 second(s)
Initializing random number generator from current time
Initializing
Threads started!
[ 3s ] thds: 4 tps: 63.60 qps: 1290.97 (r/w/o: 907.04/255.40/128.53) lat (ms,95%): 219.36 err/s: 0.00 reconn/s: 0.00
[ 6s ] thds: 4 tps: 92.37 qps: 1848.79 (r/w/o: 1291.55/372.49/184.75) lat (ms,95%): 116.80 err/s: 0.00 reconn/s: 0.00
[ 9s ] thds: 4 tps: 111.33 qps: 2224.96 (r/w/o: 1558.30/443.99/222.66) lat (ms,95%): 134.90 err/s: 0.00 reconn/s: 0.00 [ 12s ] thds: 4 tps: 72.66 qps: 1459.84 (r/w/o: 1021.22/293.30/145.32) lat (ms,95
%): 219.36 err/s: 0.00 reconn/s: 0.00 [ 15s ] thds: 4 tps: 67.34 qps: 1346.82 (r/w/o: 942.78/269.36/134.68) lat (ms,95%): 253.35 err/s: 0.00 reconn/s: 0.00
[ 18s ] thds: 4 tps: 68.66 qps: 1373.28 (r/w/o: 961.30/274.66/137.33) lat (ms,95%): 244.38 err/s: 0.00 reconn/s: 0.00
[ 21s ] thds: 4 tps: 67.67 qps: 1353.41 (r/w/o: 947.39/270.68/135.34) lat (ms,95%): 231.53 err/s: 0.00 reconn/s: 0.00
[ 24s ] thds: 4 tps: 140.99 qps: 2810.15 (r/w/o: 1966.87/561.30/281.98) lat (ms,95%): 110.66 err/s: 0.00 reconn/s: 0.00 [ 27s ] thds: 4 tps: 111.67 qps: 2243.15 (r/w/o: 1570.44/449.36/223.35) lat (ms,95%): 176.73 err/s: 0.00 reconn/s: 0.00 [ 30s ] thds: 4 tps: 90.66 qps: 1808.22 (r/w/o: 1265.59/361.31/181.32) lat (ms,95%): 215.44 err/s: 0.00 reconn/s: 0.00 SQL statistics:round函数加减公式
queries performed:
read:                            37310 # 读总数
write:                          10660 # 写总数
other:                          5330  # 其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等)          total:                          53300 # 全部总数
transactions:                        2665  (88.42 per sec.)# 总事务数(每秒事务数)
queries:                            53300  (1768.41 per sec.)# 总查询量(每秒查询数)
ignored errors:                      0      (0.00 per sec.)# 总忽略错误总数(每秒忽略错误次数)
reconnects:                          0      (0.00 per sec.)# 重连总数(每秒重连次数)
General statistics:
total time:                          30.1386s # 总耗时
java多线程顺序打印abctotal number of events:              2665    # 共发⽣多少事务数
Latency (ms):
min:                                    5.50 # 最⼩耗时
avg:                                  45.19 # 平均耗时
max:                                  386.91 # 最长耗时
95th percentile:                      207.82 # 超过95%平均耗时
sum:                              120433.75
Threads fairness:
events (avg/stddev):          666.2500/16.07 # 总处理事件数/标准偏差
execution time(avg/stddev):  30.1084/0.04  # 总执⾏时间/标准偏差
清理数据:
[root@db ~]# sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--mysql-host=10.186.61.211 --mysql-port=3306 --mysql-user=root --mysql-password=123456 \
--mysql-db=testdb --oltp-table-size=200000 --oltp-tables-count=4 --threads=4 --events=0 \
--time=30 --report-interval=3 cleanup
sysbench 1.0.17 (using system LuaJIT 2.0.4)
Dropping table 'sbtest1'...
Dropping table 'sbtest2'...
Dropping table 'sbtest3'...
Dropping table 'sbtest4'...