前言:
数据库系统正式上线前,压测是必不可少的一步。数据库系统能承载多少并发,DBA要做到心中有数。
基本概念:
TPS/QPS:衡量吞吐量。(TPS:每秒事务处理量(Transaction Per Second)、每秒查询率QPS(Query Per Second)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准)
响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间。。
并发量:同时处理的查询请求的数量。
mysqlslap
mysqlslap?是?DBA 人员应该掌握的常见压力测试工具之一,是 MySQL 从 5.1.4 版开始官方自带的一个压力测试工具。它通过模拟多个并发客户端访问 MySQL 来执行压力测试,我们通过结果信息可以了解数据库的性能状况。通过?mysqlslap?对数据库服务器做基准测试。比如:服务器的硬件资源能够支持多大的访问压力呢?优化了操作系统的内核参数后,是否提升了性能?调整了 MySQL 配置参数后,对性能有多少影响?mysqlslap的运行过程主要分三步:
创建库、表,导入数据用于测试。此过程由单线程完成。
开始进行压力测试。该步骤可以使用多线程完成。
清理测试数据。此过程由单线程完成。
下面举几个例子来说明下如何使用mysqlslap。1. 自动生成测试表,其中会生成自增列,采用单线程进行测试。
[root@node1 ~]# mysqlslap -uroot -p --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement
Enter password:
Benchmark
#运行所有语句的平局时间,单位秒
Average number of seconds to run all queries: 0.018 seconds
#运行所有语句的最小秒数
Minimum number of seconds to run all queries: 0.018 seconds
#运行所有语句的最大秒数
Maximum number of seconds to run all queries: 0.018 seconds
#客户端数量
Number of clients running queries: 1
#每个客户端运行查询的平均数
Average number of queries per client: 0
命令选项:
--concurrency 并发数量。
--engines 要测试的引擎。
--iterations 测试次数。
--auto-generate-sql 用系统自己生成的 SQL 脚本来测试。
--auto-generate-sql-add-autoincrement 使用自增字段。
--auto-generate-sql-load-type 测试模式(read,write,update,mixed)。
--number-of-queries 全部查询的次数。
--debug-info 额外输出CPU以及内存的相关信息,需要开启 Debug 模式。
--number-int-cols 测试表 int 型字段数量。
--number-char-cols 测试表 char 型字段数量。
--create-schema 测试的 db。
--query 使用自己的 SQL 脚本执行测试。
--no-defaults 禁止使用默认设置。
--only-print 仅打印查询语句。
可以使用 --only-print 先看看自动生成的 SQL 是怎样的,如果不满意可以使用自己的 SQL 脚本。
这里用的是 Docker 中的 MySQL 服务器,因此性能会相比主机运行 MySQL 要差些。
100 并发:
mysqlslap --no-defaults --iterations=5 --concurrency=100 --number-of-queries=2000 --auto-generate-sql --number-int-cols=10 --number-char-cols=10 --auto-generate-sql-load-type=read -uroot -h 127.0.0.1 -p123456
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
Average number of seconds to run all queries: 10.662 seconds
Minimum number of seconds to run all queries: 10.141 seconds
Maximum number of seconds to run all queries: 11.484 seconds
Number of clients running queries: 100
?????????Average?number?of?queries?per?client:?20?
500 并发:
mysqlslap --no-defaults --iterations=5 --concurrency=500 --number-of-queries=10000 --auto-generate-sql --number-int-cols=10 --number-char-cols=10 --auto-generate-sql-load-type=read -uroot -h 127.0.0.1 -p123456
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
Average number of seconds to run all queries: 51.981 seconds
Minimum number of seconds to run all queries: 51.454 seconds
Maximum number of seconds to run all queries: 52.500 seconds
Number of clients running queries: 500
?????????Average?number?of?queries?per?client:?20?
1000?并发:
mysqlslap --no-defaults --iterations=5?--concurrency=1000?--number-of-queries=20000?--auto-generate-sql?--number-int-cols=10?--number-char-cols=10?--auto-generate-sql-load-type=read?-uroot?-h?127.0.0.1?-p123456?
mysqlslap:?[Warning]?Using?a?password?on?the?command?line?interface?can?be?insecure.?
Benchmark
?????????Average?number?of?seconds?to?run?all?queries:?102.453?seconds?????????
?????????Minimum?number?of?seconds?to?run?all?queries:?102.016?seconds?????????
?????????Maximum?number?of?seconds?to?run?all?queries:?102.797?seconds?????????
?????????Number?of?clients?running?queries:?1000?????????
?????????Average?number?of?queries?per?client:?20?
?????????
1500 并发:
mysqlslap --no-defaults --iterations=5 --concurrency=1500 --number-of-queries=30000 --auto-generate-sql --number-int-cols=10 --number-char-cols=10 --auto-generate-sql-load-type=read -uroot -h 127.0.0.1 -p123456
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
Average number of seconds to run all queries: 157.340 seconds
Minimum number of seconds to run all queries: 155.532 seconds
Maximum number of seconds to run all queries: 163.485 seconds
Number of clients running queries: 1500
?????????Average?number?of?queries?per?client:?20?
2000?并发:
mysqlslap --no-defaults --iterations=5?--concurrency=2000?--number-of-queries=40000?--auto-generate-sql?--number-int-cols=10?--number-char-cols=10?--auto-generate-sql-load-type=read?-uroot?-h?127.0.0.1?-p123456?
mysqlslap:?[Warning]?Using?a?password?on?the?command?line?interface?can?be?insecure.?
Benchmark
?????????Average?number?of?seconds?to?run?all?queries:?213.437?seconds?????????
?????????Minimum?number?of?seconds?to?run?all?queries:?208.406?seconds?????????
?????????Maximum?number?of?seconds?to?run?all?queries:?222.453?seconds?????????
?????????Number?of?clients?running?queries:?2000?????????
?????????Average?number?of?queries?per?client:?20?
各并发度下的表现为:
sysbench
sysbench是一款非常强大的数据库测试工具,它可以执行多种类型的基准测试,支持MySQL、PostgreSQL、Oracle等多种数据库。
sysbench 支持以下几种测试模式:
1、CPU 运算性能
2、磁盘 IO 性能
3、调度程序性能
4、内存分配及传输速度
5、POSIX线程性能–互斥基准测试
6、数据库性能(OLTP基准测试)以下命令可以输出各个检测项的帮助文档
# IO
sysbench??--test=fileio?help
# CPU
sysbench??--test=cpu?help
# 内存
sysbench??--test=memory?help
# 线程
sysbench??--test=threads?help
# 互斥性能
sysbench??--test=mutex?help
# 事务处理
sysbench --test=oltp help
安装
下载:
wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbench-1.0.zip"
unzip sysbench-1.0.zip
cd?sysbench-1.0
安装依赖:
yum install automake libtool –y
编译安装:
./autogen.sh
./configure
make
make install
验证:
sysbench --version
sysbench?1.0.9
命令选项:
--mysql-host:MySQL服务器主机名。
--mysql-port:MySQL服务器端口。
--mysql-user:用户名。
--mysql-password:密码。
--oltp-test-mode:执行模式,包括simple、nontrx和complex,默认是complex。simple模式下只测试简单的查询;nontrx不仅测试查询,还测试插入更新等,但是不使用事务;complex模式下测试最全面,会测试增删改查,而且会使用事务。
--oltp-tables-count:测试的表数量,根据实际情况选择。
--oltp-table-size:测试的表的大小,根据实际情况选择。
--threads:客户端的并发连接数。
--time:测试执行的时间,单位是秒,该值不要太短,可以选择120。
--report-interval:生成报告的时间间隔,单位是秒,如10。
针对OLTP的基准测试
1. 首先生成测试数据。使用了10个表,每个表有10万条数据,客户端的并发线程数为10,执行时间为120秒,每10秒生成一次报告。
sysbench?./tests/include/oltp_legacy/oltp.lua?--mysql-host=127.0.0.1?--mysql-port=3306?--mysql-user=admin?--mysql-password=123456?--oltp-test-mode=complex?--oltp-tables-count=10?--oltp-table-size=100000?--threads=10?--time=120?--report-interval=10?prepare?????????
2. 执行测试,将测试结果导出到文件中,便于后续分析。
sysbench?./tests/include/oltp_legacy/oltp.lua?--mysql-host=127.0.0.1?--mysql-port=3306?--mysql-user=admin?--mysql-password=123456?--oltp-test-mode=complex?--oltp-tables-count=10?--oltp-table-size=100000?--threads=10?--time=120?--report-interval=10?run?>>?/root/test/mysysbench.log
3.清理数据
sysbench?./tests/include/oltp_legacy/oltp.lua?--mysql-host=127.0.0.1?--mysql-port=3306?--mysql-user=admin?--mysql-password=123456?cleanup
sysbench?1.0.14?(using?bundled?LuaJIT?2.1.0-beta2)
Dropping table 'sbtest1'...
测试结果如下:
sysbench?1.0.14?(using?bundled?LuaJIT?2.1.0-beta2)
Running the test with following options:
Number of threads: 10
Report intermediate results every 10 second(s)
Initializing?random?number?generator?from?current?time
Initializing worker threads...
--线程启动
Threads?started!
-- 每10秒钟报告一次测试结果,tps、每秒读、每秒写、99%以上的响应时长统计
[ 10s ] thds: 10 tps: 956.45 qps: 19139.38 (r/w/o: 13399.56/3825.92/1913.91) lat (ms,95%): 29.72 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 10 tps: 989.71 qps: 19804.24 (r/w/o: 13862.17/3962.55/1979.52) lat (ms,95%): 28.67 err/s: 0.10 reconn/s: 0.00
[ 30s ] thds: 10 tps: 995.44 qps: 19909.03 (r/w/o: 13936.11/3982.05/1990.87) lat (ms,95%): 27.66 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 10 tps: 983.30 qps: 19660.90 (r/w/o: 13764.23/3930.08/1966.59) lat (ms,95%): 27.66 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 10 tps: 994.20 qps: 19882.58 (r/w/o: 13918.26/3975.92/1988.41) lat (ms,95%): 29.19 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 10 tps: 982.50 qps: 19648.18 (r/w/o: 13752.56/3930.82/1964.81) lat (ms,95%): 28.16 err/s: 0.00 reconn/s: 0.00
[ 70s ] thds: 10 tps: 981.10 qps: 19624.20 (r/w/o: 13737.80/3924.00/1962.40) lat (ms,95%): 29.19 err/s: 0.00 reconn/s: 0.00
[ 80s ] thds: 10 tps: 991.69 qps: 19837.87 (r/w/o: 13885.81/3968.67/1983.39) lat (ms,95%): 27.17 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 10 tps: 1007.34 qps: 20142.36 (r/w/o: 14100.50/4027.27/2014.59) lat (ms,95%): 26.68 err/s: 0.00 reconn/s: 0.00
[ 100s ] thds: 10 tps: 1009.76 qps: 20195.17 (r/w/o: 14135.79/4039.75/2019.63) lat (ms,95%): 26.20 err/s: 0.00 reconn/s: 0.00
[ 110s ] thds: 10 tps: 1003.80 qps: 20077.42 (r/w/o: 14053.54/4016.28/2007.59) lat (ms,95%): 25.74 err/s: 0.00 reconn/s: 0.00
[ 120s ] thds: 10 tps: 984.30 qps: 19685.77 (r/w/o: 13781.75/3935.41/1968.61) lat (ms,95%): 28.67 err/s: 0.00 reconn/s: 0.00
SQL statistics:
queries performed:
read: 1663326 --读总数
write: 475233 -- 写总数
other: 237617 -- 其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等)
total: 2376176 -- 全部总数
transactions: 118808 (989.85 per sec.) -- 总事务数(每秒事务数)
queries: 2376176 (19797.13 per sec.)
ignored errors: 1 (0.01 per sec.) --总忽略错误总数(每秒忽略错误次数)
????reconnects:??????????????????????????0??????(0.00?per?sec.)?--重连总数(每秒重连次数)
General statistics: --常规统计
total time: 120.0244s --总耗时
????total?number?of?events:??????????????118808?--共发生多少事务数
Latency (ms):
min: 6.08 --最小耗时
avg: 10.10 --平均耗时
max: 87.65 --最长耗时
95th percentile: 28.16 --超过95%平均耗时
sum: 1199522.76
Threads fairness: --并发统计
events (avg/stddev): 11880.8000/273.15 --总处理事件数/标准偏差
execution time (avg/stddev): 119.9523/0.00 --总执行时间/标准偏差
其中,对于我们比较重要的信息包括:queries:查询总数及qps
transactions:事务总数及tps
Latency-95th percentile:前95%的请求的最大响应时间,本例中是28.16毫秒。
更多精彩内容,关注我们▼▼