说明:因为举例的原因,本文测试量测试时间都很短,正式测试需要将测试时间尽可能延长至完全稳定。
一.测试目的和策略
数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试,数据可以由工具生成,不要求真实数据。对数据库的基准测试的作用,就是分析在当前的配置下(包括硬件配置、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 :https://help.aliyun.com/document_detail/53637.html
阿里云 MySQL 5.7 :https://help.aliyun.com/document_detail/109376.html
https://help.aliyun.com/document_detail/146103.html?spm=a2c4g.11186623.6.767.794d1b41SDuu61
华为云 MySQL 5.6 :https://support.huaweicloud.com/pwp-rds/rds_swp_mysql_02.html
华为云 MySQL 5.7 :https://support.huaweicloud.com/pwp-rds/rds_swp_mysql_03.html
腾讯云 MySQL 不限版本 :https://cloud.tencent.com/document/product/236/8842
百度云 MySQL 5.6 :https://cloud.baidu.com/doc/RDS/Performance_whitepaper.html
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对比
当前环境
model name: Intel(R) Xeon(R) 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
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 1171.72 | 1263.24 |
average Latency | 0.85 | 0.79 |
95th percentile Latency | 0.92 | 0.84 |
events (avg/stddev) | 11718.0000/0.00 | 12633.0000/0.00 |
execution time (avg/stddev) | 9.9814/0.00 | 9.9855/0.00 |
sysbench cpu --cpu-max-prime=20000 --threads=1 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 447.86 | 495.17 |
average Latency | 2.23 | 2.02 |
95th percentile Latency | 2.39 | 2.11 |
events (avg/stddev) | 4479.0000/0.00 | 4952.0000/0.00 |
execution time (avg/stddev) | 9.9913/0.00 | 9.9943/0.00 |
sysbench cpu --cpu-max-prime=30000 --threads=1 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 265.04 | 277.91 |
average Latency | 3.77 | 3.60 |
95th percentile Latency | 4.03 | 3.96 |
events (avg/stddev) | 2651.0000/0.00 | 2780.0000/0.00 |
execution time (avg/stddev) | 9.9960/0.00 | 9.9993/0.00 |
②限制执行次数
sysbench cpu --cpu-max-prime=10000 --threads=1 --time=100 --events=10000 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 1206.95 | 1227.43 |
average Latency | 0.83 | 0.81 |
95th percentile Latency | 0.89 | 0.87 |
events (avg/stddev) | 10000.0000/0.00 | 10000.0000/0.00 |
execution time (avg/stddev) | 8.2701/0.00 | 8.1347/0.00 |
sysbench cpu --cpu-max-prime=20000 --threads=1 --time=100 --events=10000 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 469.01 | 474.85 |
average Latency | 2.13 | 2.10 |
95th percentile Latency | 2.26 | 2.14 |
events (avg/stddev) | 10000.0000/0.00 | 10000.0000/0.00 |
execution time (avg/stddev) | 21.3038/0.00 | 21.0463/0.00 |
sysbench cpu --cpu-max-prime=30000 --threads=1 --time=100 --events=10000 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 267.98 | 274.7943 |
average Latency | 3.73 | 3.64 |
95th percentile Latency | 3.96 | 3.96 |
events (avg/stddev) | 10000.0000/0.00 | 10000.0000/0.00 |
execution time (avg/stddev) | 37.2967/0.00 | 36.3767/0.00 |
⑵双线程测试
①限制执行时间(默认执行时间为10秒,可忽略极小的时间误差)
sysbench cpu --cpu-max-prime=10000 --threads=2 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 2397.98 | 2464.67 |
average Latency | 0.83 | 0.81 |
95th percentile Latency | 0.89 | 0.84 |
events (avg/stddev) | 11991.0000/31.00 | 12324.0000/286.00 |
execution time (avg/stddev) | 9.9805/0.00 | 9.9829/0.00 |
②限制执行次数
sysbench cpu --cpu-max-prime=10000 --threads=2 --time=100 --events=10000 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 2337.62 | 2424.60 |
average Latency | 0.85 | 0.82 |
95th percentile Latency | 0.92 | 0.86 |
events (avg/stddev) | 5000.0000/22.00 | 5000.0000/36.00 |
execution time (avg/stddev) | 4.2673/0.00 | 4.1171/0.00 |
⑶四线程测试
①限制执行时间(默认执行时间为10秒,可忽略极小的时间误差)
sysbench cpu --cpu-max-prime=10000 --threads=4 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 4619.28 | 4901.83 |
average Latency | 0.86 | 0.81 |
95th percentile Latency | 0.94 | 0.84 |
events (avg/stddev) | 11549.2500/24.39 | 12255.2500/354.96 |
execution time (avg/stddev) | 9.9804/0.00 | 9.9800/0.00 |
②限制执行次数
sysbench cpu --cpu-max-prime=10000 --threads=4 --time=100 --events=10000 run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 4407.69 | 4917.99 |
average Latency | 0.90 | 0.81 |
95th percentile Latency | 0.97 | 0.84 |
events (avg/stddev) | 2500.0000/22.15 | 2500.0000/91.02 |
execution time (avg/stddev) | 2.2604/0.00 | 2.0264/0.00 |
4.测试结果
新环境CPU的性能整体较旧环境稍好一些,但在线程公平性上不如原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。
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
服务器 | 旧环境 | 新环境 |
---|---|---|
Write IOPS (MB/s) | 169.77 | 256.56 |
average Latency (ms) | 0.04 | 0.03 |
95th percentile Latency (ms) | 0.07 | 0.04 |
⑵顺序读
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
服务器 | 旧环境 | 新环境 |
---|---|---|
Read IOPS (MB/s) | 1242.11 | 1367.97 |
average Latency (ms) | 0.01 | 0.01 |
95th percentile Latency (ms) | 0.01 | 0.01 |
⑶随机写
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
服务器 | 旧环境 | 新环境 |
---|---|---|
Write IOPS (MB/s) | 87.11 | 117.45 |
average Latency (ms) | 0.08 | 0.06 |
95th percentile Latency (ms) | 0.23 | 0.16 |
⑷随机读
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
服务器 | 旧环境 | 新环境 |
---|---|---|
Read IOPS (MB/s) | 59.77 | 68.84 |
average Latency (ms) | 0.27 | 0.24 |
95th percentile Latency (ms) | 0.35 | 0.57 |
⑸混合随机读/写
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
服务器 | 旧环境 | 新环境 |
---|---|---|
Read IOPS (MB/s) | 34.77 | 50.39 |
Write IOPS (MB/s) | 23.18 | 16.80 |
average Latency (ms) | 0.12 | 0.10 |
95th percentile Latency (ms) | 0.27 | 0.30 |
4.测试结果
在随机读测试95%时间分布的请求时间一项中,新环境不如原环境,
在混合随机读写中,95%时间分布的请求时间较高,写速度比原环境低,
在其他测试项中,新环境IO性能高于旧环境。
五.内存基准测试
1.测试方法
⑴方法描述
测量以不同块大小传输一定数量的数据吞吐量大小,结果越大说明性能越佳。
⑵变量
不同内存;
内存传输总量;
每个block大小;
⑶衡量指标
①执行时间;
②events/s (eps):每秒events个数,此处events指的是传输一个block;
2.内存对比
3.测试数据
sysbench memory --memory-block-size=8k --memory-total-size=16G run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 503209.2003 | 562664.8635 |
time elapsed(s) | 4.1676 | 3.7272 |
sysbench memory --memory-block-size=16k --memory-total-size=16G run
服务器 | 旧环境 | 新环境 |
---|---|---|
eps | 412019.0265 | 463591.7495 |
time elapsed(s) | 2.5450 | 2.2619 |
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.4.28,数据库版本5.6.45,传统主从复制
新环境10.10.4.71,数据库版本5.7.28,主从gtid复制
3.测试数据
创建测试库:
mysql> create database sbtest;
创建测试表:
sysbench --mysql-host=10.10.4.71 --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读写测试:
sysbench --threads=4 --time=20 --report-interval=5 --mysql-host=10.10.4.71 --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
服务器 | 旧环境 | 新环境 |
---|---|---|
queries | 459900 | |
QPS | 22990.71 | |
transactions | 22995 | |
TPS | 1149.54 | |
avg Latency (ms) | 3.48 | |
95th percentile Latency (ms) | 5.18 | |
Threads fairness (avg/stddev) | 5748.7500/66.97 |
4.测试结果
(时间需要长一点直到稳定)
网友评论