一.测试目的和策略
数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试,数据可以由工具生成,不要求真实。对数据库的基准测试的作用,就是分析在当前的配置下(包括硬件配置、OS、数据库设置等),数据库的性能表现,从而找出MySQL的性能阈值,并根据实际系统的要求调整配置。
对MySQL的基准测试,有如下两种思路:
(1)针对整个系统的基准测试:通过http请求进行测试,如通过浏览器、APP或postman等测试工具。该方案的优点是能够更好的针对整个系统,测试结果更加准确;缺点是设计复杂实现困难。
(2)只针对MySQL的基准测试:优点和缺点与针对整个系统的测试恰好相反。
在针对MySQL进行基准测试时,一般使用专门的工具进行,例如mysqlslap、sysbench等。
二.测试工具
1.工具选型
我们选用工具sysbench。sysbench可以执行多种类型的基准测试,不仅可以测试数据库性能,还可以测试运行数据库的服务器性能,建议MySQL DBA都能了解sysbench测试。相比于mysqlslap,sysbench更通用、更强大,且更适合Innodb(因为模拟了许多Innodb的IO特性)。
另外,考虑到云厂商不约而同的使用 sysbench 作为基准测试工具,sysbench 可能是比较正确的选型,参考网站如下:
阿里云 MySQL 5.6
阿里云 MySQL 5.7
阿里云 MySQL 5.7
华为云 MySQL 5.6
华为云 MySQL 5.7
腾讯云 MySQL 不限版本
百度云 MySQL 5.6
2.sysbench的安装
⑴安装依赖:
yum -y install make automake libtool pkgconfig libaio-devel mariadb-devel openssl-devel
⑵从github下载sysbench:
https://github.com/akopytov/sysbench
⑶编译安装
unzip sysbench-master.zip
cd sysbench-master
./autogen.sh
./configure
make
make install
⑷检查
sysbench --version
显示sysbench 1.1.0
说明安装完毕
注:新脚本在/src/lua/目录下,如果是yum安装的则在/usr/share/sysbench/
三.CPU基准测试
1.测试方法
⑴方法描述
测试使用64位整数,测试某个时间限制内计算素数(质数) 直到某个最大值的次数,或测试计算素数直到某个最大值达到指定次数的时间。比较当前环境和新环境的测试结果。
⑵变量
①CPU
②素数上限
③线程数
④素数计算次数上限
⑤执行时间上限
⑶衡量指标
①events/s (eps),即总线程每秒event数,一次event表示一轮素数计算;
②average Latency (ms),即events的平均耗时;
③95th percentile Latency (ms),即95%时间分布的events耗时,相对平均值更具参考价值;
④events (avg/stddev),平均每个线程完成event的数量/标准差;
⑤execution time (avg/stddev),每个线程平均执行时间/标准差;
注:标准差越小说明越稳定,仅在多线程时标准差才有意义。
2.CPU对比
当前环境10.10.4.28:
model name: Intel® Xeon® Gold 6240R CPU @ 2.40GHz
stepping: 7
cpu MHz: 2394.356
cache size: 36608 KB
新环境和当前环境相同。
3.测试数据
⑴单线程测试
①限制执行时间(默认执行时间为10秒,可忽略极小的时间误差)
sysbench cpu --cpu-max-prime=10000 --threads=1 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 1171.72 | 1254.23 | 1263.24 | 1253.99 |
average Latency | 0.85 | 0.80 | 0.79 | 0.80 |
95th percentile Latency | 0.92 | 0.83 | 0.84 | 0.86 |
events (avg/stddev) | 11718.0000/0.00 | 12543.0000/0.00 | 12633.0000/0.00 | 12541.0000/0.00 |
execution time (avg/stddev) | 9.9814/0.00 | 9.9857/0.00 | 9.9855/0.00 | 9.9864/0.00 |
sysbench cpu --cpu-max-prime=20000 --threads=1 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 447.86 | 487.83 | 495.17 | 495.32 |
average Latency | 2.23 | 2.05 | 2.02 | 2.02 |
95th percentile Latency | 2.39 | 2.11 | 2.11 | 2.11 |
events (avg/stddev) | 4479.0000/0.00 | 4879.0000/0.00 | 4952.0000/0.00 | 4954.0000/0.00 |
execution time (avg/stddev) | 9.9913/0.00 | 9.9949/0.00 | 9.9943/0.00 | 9.9954/0.00 |
sysbench cpu --cpu-max-prime=30000 --threads=1 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 265.04 | 278.69 | 277.91 | 279.04 |
average Latency | 3.77 | 3.59 | 3.60 | 3.58 |
95th percentile Latency | 4.03 | 3.62 | 3.96 | 3.68 |
events (avg/stddev) | 2651.0000/0.00 | 2787.0000/0.00 | 2780.0000/0.00 | 2791.0000/0.00 |
execution time (avg/stddev) | 9.9960/0.00 | 9.9962/0.00 | 9.9993/0.00 | 9.9980/0.00 |
②限制执行次数
sysbench cpu --cpu-max-prime=10000 --threads=1 --time=100 --events=10000 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 1206.95 | 1240.22 | 1227.43 | 1246.33 |
average Latency | 0.83 | 0.81 | 0.81 | 0.80 |
95th percentile Latency | 0.89 | 0.83 | 0.87 | 0.84 |
events (avg/stddev) | 10000.0000/0.00 | 10000.0000/0.00 | 10000.0000/0.00 | 10000.0000/0.00 |
execution time (avg/stddev) | 8.2701/0.00 | 8.0505/0.00 | 8.1347/0.00 | 9.0111/0.00 |
sysbench cpu --cpu-max-prime=20000 --threads=1 --time=100 --events=10000 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 469.01 | 485.05 | 474.85 | 481.57 |
average Latency | 2.13 | 2.06 | 2.10 | 2.08 |
95th percentile Latency | 2.26 | 2.11 | 2.14 | 2.18 |
events (avg/stddev) | 10000.0000/0.00 | 10000.0000/0.00 | 10000.0000/0.00 | 10000.0000/0.00 |
execution time (avg/stddev) | 21.3038/0.00 | 20.6036/0.00 | 21.0463/0.00 | 20.7524/0.00 |
sysbench cpu --cpu-max-prime=30000 --threads=1 --time=100 --events=10000 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 267.98 | 279.92 | 274.7943 | 277.91 |
average Latency | 3.73 | 3.57 | 3.64 | 3.60 |
95th percentile Latency | 3.96 | 3.62 | 3.96 | 3.68 |
events (avg/stddev) | 10000.0000/0.00 | 10000.0000/0.00 | 10000.0000/0.00 | 10000.0000/0.00 |
execution time (avg/stddev) | 37.2967/0.00 | 35.7112/0.00 | 36.3767/0.00 | 35.9704/0.00 |
⑵双线程测试
①限制执行时间(默认执行时间为10秒,可忽略极小的时间误差)
sysbench cpu --cpu-max-prime=10000 --threads=2 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 2397.98 | 2475.64 | 2464.67 | 2473.22 |
average Latency | 0.83 | 0.81 | 0.81 | 0.81 |
95th percentile Latency | 0.89 | 0.83 | 0.84 | 0.84 |
events (avg/stddev) | 11991.0000/31.00 | 12379.0000/22.00 | 12324.0000/286.00 | 12367.0000/19.00 |
execution time (avg/stddev) | 9.9805/0.00 | 9.9846/0.00 | 9.9829/0.00 | 9.9846/0.00 |
②限制执行次数
sysbench cpu --cpu-max-prime=10000 --threads=2 --time=100 --events=10000 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 2337.62 | 2472.13 | 2424.60 | 2477.30 |
average Latency | 0.85 | 0.81 | 0.82 | 0.81 |
95th percentile Latency | 0.92 | 0.83 | 0.86 | 0.84 |
events (avg/stddev) | 5000.0000/22.00 | 5000.0000/3.00 | 5000.0000/36.00 | 5000.0000/7.00 |
execution time (avg/stddev) | 4.2673/0.00 | 4.0381/0.00 | 4.1171/0.00 | 4.0296/0.00 |
⑶四线程测试
①限制执行时间(默认执行时间为10秒,可忽略极小的时间误差)
sysbench cpu --cpu-max-prime=10000 --threads=4 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 4619.28 | 4916.11 | 4901.83 | 4870.43 |
average Latency | 0.86 | 0.81 | 0.81 | 0.82 |
95th percentile Latency | 0.94 | 0.83 | 0.84 | 0.84 |
events (avg/stddev) | 11549.2500/24.39 | 12290.7500/8.79 | 12255.2500/354.96 | 12177.2500/149.96 |
execution time (avg/stddev) | 9.9804/0.00 | 9.9823/0.00 | 9.9800/0.00 | 9.9842/0.00 |
②限制执行次数
sysbench cpu --cpu-max-prime=10000 --threads=4 --time=100 --events=10000 run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 4407.69 | 4933.81 | 4917.99 | 4882.02 |
average Latency | 0.90 | 0.81 | 0.81 | 0.82 |
95th percentile Latency | 0.97 | 0.83 | 0.84 | 0.84 |
events (avg/stddev) | 2500.0000/22.15 | 2500.0000/11.68 | 2500.0000/91.02 | 2500.0000/19.61 |
execution time (avg/stddev) | 2.2604/0.00 | 2.0220/0.00 | 2.0264/0.00 | 2.0436/0.00 |
4.测试结果
新环境(包括一级服务、二级服务、测试环境)CPU在几组测试中较10.10.4.28的CPU有微弱的性能优势,没有较大区别。
四.I/O基准测试
1.测试方法
⑴方法描述
FileIO基准测试可以测试系统在不同I/O负载下的性能。测试的第一步是prepare阶段,生成测试用到的数据文件,生产的数据文件至少要比内存大。如果文件中的数据能完全放入内存中,则操作系统缓存了大部分数据,导致测试结果无法体现数据库的I/O密集型的工作负载。
注:测试完成后要记得清除prepare阶段生成的测试文件。
⑵变量
①新旧环境服务器
②读写模式
③线程数
④文件大小
⑤执行时间上限
⑶衡量指标
①IOPS
②average Latency (ms),即请求平均时间;
③95th percentile Latency (ms),即95%时间分布的请求时间,相对平均值更具参考价值;
2.I/O环境对比
比较驱动器、RAID卡、RAID模式等。
注:对于数据库系统应避免使用lvm,RAID模式最佳为RAID5。
除测试环境外,其余均为SSD。
3.测试数据
⑴顺序写
sysbench fileio --file-total-size=100G --file-test-mode=seqwr --time=300 prepare
sysbench fileio --file-total-size=100G --file-test-mode=seqwr --time=300 run
sysbench fileio --file-total-size=100G --file-test-mode=seqwr --time=300 cleanup
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
Write IOPS (MB/s) | 169.77 | 306.03 | 256.56 | 258.10 |
average Latency (ms) | 0.04 | 0.02 | 0.03 | 0.03 |
95th percentile Latency (ms) | 0.07 | 0.04 | 0.04 | 0.03 |
⑵顺序读
sysbench fileio --file-total-size=100G --file-test-mode=seqrd --time=300 prepare
sysbench fileio --file-total-size=100G --file-test-mode=seqrd --time=300 run
sysbench fileio --file-total-size=100G --file-test-mode=seqrd --time=300 cleanup
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
Read IOPS (MB/s) | 1242.11 | 1282.01 | 1367.97 | 758.52 |
average Latency (ms) | 0.01 | 0.01 | 0.01 | 0.02 |
95th percentile Latency (ms) | 0.01 | 0.01 | 0.01 | 0.00 |
⑶随机写
sysbench fileio --file-total-size=100G --file-test-mode=rndwr --time=300 prepare
sysbench fileio --file-total-size=100G --file-test-mode=rndwr --time=300 run
sysbench fileio --file-total-size=100G --file-test-mode=rndwr --time=300 cleanup
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
Write IOPS (MB/s) | 87.11 | 145.15 | 117.45 | 10.47 |
average Latency (ms) | 0.08 | 0.05 | 0.06 | 0.68 |
95th percentile Latency (ms) | 0.23 | 0.14 | 0.16 | 0.15 |
⑷随机读
sysbench fileio --file-total-size=100G --file-test-mode=rndrd --time=300 prepare
sysbench fileio --file-total-size=100G --file-test-mode=rndrd --time=300 run
sysbench fileio --file-total-size=100G --file-test-mode=rndrd --time=300 cleanup
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
Read IOPS (MB/s) | 59.77 | 121.41 | 68.84 | 4.07 |
average Latency (ms) | 0.27 | 0.13 | 0.24 | 4.02 |
95th percentile Latency (ms) | 0.35 | 0.47 | 0.57 | 7.30 |
⑸混合随机读/写
sysbench fileio --file-total-size=100G --file-test-mode=rndrw --time=300 prepare
sysbench fileio --file-total-size=100G --file-test-mode=rndrw --time=300 --file-rw-ratio=3 run
sysbench fileio --file-total-size=100G --file-test-mode=rndrw --time=300 cleanup
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
Read IOPS (MB/s) | 34.77 | 76.10 | 50.39 | 3.31 |
Write IOPS (MB/s) | 23.18 | 25.37 | 16.80 | 1.16 |
average Latency (ms) | 0.12 | 0.07 | 0.10 | 1.55 |
95th percentile Latency (ms) | 0.27 | 0.28 | 0.30 | 6.91 |
4.测试结果
性能排名:新一级服务>新二级服务>10.10.4.28>新测试环境。
五.内存基准测试
1.测试方法
⑴方法描述
测量以不同块大小传输一定数量的数据吞吐量大小,结果越大说明性能越佳。
⑵变量
不同内存;
内存传输总量;
每个block大小;
⑶衡量指标
①执行时间;
②events/s (eps):每秒events个数,此处events指的是传输一个block;
2.内存对比
/
3.测试数据
sysbench memory --memory-block-size=8k --memory-total-size=16G run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 503209.2003 | 544868.9495 | 562664.8635 | 539987.0047 |
time elapsed(s) | 4.1676 | 3.8489 | 3.7272 | 3.7841 |
sysbench memory --memory-block-size=16k --memory-total-size=16G run
服务器 | 10.10.4.28 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
eps | 412019.0265 | 465866.1728 | 463591.7495 | 467154.1717 |
time elapsed(s) | 2.5450 | 2.2508 | 2.2619 | 2.1796 |
4.测试结果
内存无明显区别。
六.OLTP基准测试
1.测试方法
⑴方法描述
首先准备测试数据。用oltp_read_write.lua脚本来做读、写测试。还有很多其它类型的测试,比如只读测试、只写测试、删除测试、大批量插入测试等等。可找到对应的.lua脚本进行调用即可。并将输出结果导入文件中。
⑵变量
①不同数据库环境;
②线程数;
③时间上限;
④读写比例;
⑤测试表数量;
⑥测试表单表数据量;
⑶衡量指标
①一定时间内查询量及QPS(广义的query);
②一定时间内事务量即TPS;
③avg Latency (ms),请求的平均时间;
④95th percentile Latency (ms),请求的95%分布时间;
⑤Threads fairness (avg/stddev),对于多线程并行,每个线程分配的事务量/方差
2.数据库环境对比
10.10.1.220:mysql5.6.47,单节点
一级服务:mysql5.7.28,MGR环境;
二级服务:mysql5.7.28,主从GTID复制环境;
新测试环境:mysql5.7.28,单节点
3.测试数据
创建测试库:
mysql> create database sbtest;
创建测试表,例:
sysbench --mysql-host=10.10.4.86 --mysql-port=3306 --mysql-user=wenjie.wang --mysql-password=123456 /app/sysbench-master/src/lua/oltp_common.lua --tables=10 --table_size=100000 prepare
OLTP读写测试(s/i/u/d=14:1:1:1):
①4线程20秒
sysbench --threads=4 --time=20 --report-interval=5 --mysql-host=10.10.4.86 --mysql-port=3306 --mysql-user=wenjie.wang --mysql-password=123456 /app/sysbench-master/src/lua/oltp_read_write.lua --tables=10 --table_size=100000 run >> /sysbench1.log
服务器 | 10.10.1.220 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
queries | 23200 | 589140 | 459900 | 880240 |
QPS | 1140.77 | 29452.01 | 22990.71 | 44004.74 |
transactions | 1160 | 29457 | 22995 | 44012 |
TPS | 57.04 | 1472.60 | 1149.54 | 2200.24 |
avg Latency (ms) | 69.79 | 2.71 | 3.48 | 1.81 |
95th percentile Latency (ms) | 511.33 | 3.19 | 5.18 | 2.71 |
Threads fairness (avg/stddev) | 290.0000/2.92 | 7364.2500/2.49 | 5748.7500/66.97 | 11003.0000/101.61 |
②2线程1min
sysbench --threads=2 --time=60 --report-interval=10 --mysql-host=10.10.4.86 --mysql-port=3306 --mysql-user=wenjie.wang --mysql-password=123456 /app/sysbench-master/src/lua/oltp_read_write.lua --tables=10 --table_size=100000 run >> /sysbench2.log
服务器 | 10.10.1.220 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
queries | 92280 | 954140 | 840460 | 1514180 |
QPS | 1537.87 | 15901.51 | 14006.88 | 25235.04 |
transactions | 4614 | 47707 | 42023 | 75709 |
TPS | 76.89 | 795.08 | 700.34 | 1261.75 |
avg Latency (ms) | 26.00 | 2.51 | 2.85 | 1.58 |
95th percentile Latency (ms) | 99.33 | 2.76 | 3.13 | 1.67 |
Threads fairness (avg/stddev) | 2307.0000/3.00 | 23853.5000/17.50 | 21011.5000/4.50 | 37854.5000/0.50 |
③4线程10min
sysbench --threads=4 --time=600 --report-interval=5 --mysql-host=10.10.4.86 --mysql-port=3306 --mysql-user=wenjie.wang --mysql-password=123456 /app/sysbench-master/src/lua/oltp_read_write.lua --tables=10 --table_size=100000 run >> /sysbench3.log
服务器 | 10.10.1.220 | 一级服务 | 二级服务 | 测试环境 |
---|---|---|---|---|
queries | 664200 | 16058240 | 13982080 | 29937020 |
QPS | 1106.70 | 26763.53 | 23303.32 | 49894.74 |
transactions | 33210 | 802912 | 699104 | 1496851 |
TPS | 55.34 | 1338.18 | 1165.17 | 2494.74 |
avg Latency (ms) | 72.28 | 2.99 | 3.43 | 1.60 |
95th percentile Latency (ms) | 502.20 | 3.62 | 5.09 | 2.00 |
Threads fairness (avg/stddev) | 8302.5000/15.17 | 200728.0000/223.73 | 174776.0000/318.84 | 374212.7500/950.47 |
4.测试结果
OLTP表现:新测试环境>一级服务>二级服务>>10.10.1.220。
注:新测试环境OLTP表现较好的原因是测试环境不需要强安全性,因此innodb_flush_method设置为fsync,(即数据页刷盘不是有需求即刷盘,而是由OS决定),innodb_flush_log_at_trx_commit设置为0,(即每秒刷一次log buffer到redo log而非每次事务提交就刷盘),且未开binlog相关的设置,因此在内存未达瓶颈时性能较新一级服务和二级服务高一些。在补充测试中,将两参数调整为最安全模式(但未开binlog),测试的性能接近于一级服务的性能。