一、前言
Amazon Aurora 是一种为云打造并与 MySQL 和 PostgreSQL 兼容的关系数据库,既具有高端商用数据库的性能和可用性,又具有开源数据库的简单性和成本效益。相比起 MYSQL, Aurora 在只读副本延迟,可扩展性,备份恢复速度以及存储空间扩展等方面都有很大优势,更有回溯,aurora serverless 等实用的新功能,除了以上功能和管理方面的优点外,Aurora 的速度最高可以达到标准 MySQL 数据库的五倍、标准 PostgreSQL 数据库的三倍。
随着宁夏区推出 Aurora,中国区客户终于可以体验 Aurora 的独特魅力了,在迁移数据库之前,有些客户也想进行性能比对测试,做到知己知彼。针对这种需求,这里我将给大家介绍如何用 sysbench 对 MYSQL RDS 和 Aurora 进行测试,讲解不同测试参数的含义,分析不同测试案例的结果,希望对大家今后测试数据库的工作有所帮助。
二、环境准备
2.1 环境信息
测试端
数据库
2.2 安装和配置 sysbench
在四台测试客户端安装 sysbench
安装 Sysbench Version 0.5,执行以下步骤:
以 root 用户安装 Bazaar/ automake/ Libtool:
yum -y install bzr yum -y install automake yum -y install libtool
2.以 root 用户安装 MySQL 客户端程序 (Red Hat 用 mysql‐devel, Debian/Ubuntu 用 libmysqlclient‐dev ):
yum -y install mysql-devel yum –y install mysql
下载 Sysbench:
bzr branch lp:sysbench
编译和安装 Sysbench:
cd sysbench ./autogen.sh ./configure make cd sysbench
2.3 打开限制
在 Sysbench 客户端执行 以下网络配置,告诉 Linux kernel 可以用所有的 CPU cores 去处理 packets, 默认只可以用两个, 并且减少 cores 之间的 context switching. 这两个设置是为了用更少的 Sysbench 客户端达成吞吐目标.
`sudo sh -c ‘for x in /sys/class/net/eth0/queues/rx-*; do echo ffffffff > $x/rps_cpus; done’
sudo sh -c “echo 32768 > /proc/sys/net/core/rps_sock_flow_entries”
sudo sh -c “echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt”
sudo sh -c “echo 4096 > /sys/class/net/eth0/queues/rx-1/rps_flow_cnt”
vim /etc/security/limits.conf
soft nofile 65536
hard nofile 65536
soft nproc 65536
hard nproc 65536`
2.4 模拟数据注入
Aurora
首先通过 sysbench 客户端在测试数据库上生成测试表,这里生成 250 个表,每个表有行数 25000 条,您也可以根据您的目标,调整表的数目和大小,请替换<>之中的各种连接信息,再执行命令,同时拷贝的时候请注意格式,后面的命令注意事项相同,不再赘述
./sysbench --test=/home/ec2-user/sysbench/sysbench/tests/db/oltp.lua --mysql-host=<aurora server> --oltp-tables-count=250 --mysql-user=<aurora user> --mysql-password="<aurora password>" --mysql-port=3306 --oltp-table-size=25000 --mysql-db=<aurora db> --db-driver=mysql prepare
其输出类似:
Mysql
同样的,在 mysql 上生成相同的测试集
./sysbench --test=/home/ec2-user/sysbench/sysbench/tests/db/oltp.lua --mysql-host=<mysql server> --oltp-tables-count=250 --mysql-user=<mysql user> --mysql-password="<mysql password>" --mysql-port=3306 --oltp-table-size=25000 --mysql-db=<mysql db> --db-driver=mysql prepare
其输出类似:
参数含义
–test=tests/db/oltp.lua 表示调用 tests/db/oltp.lua 脚本进行 oltp 模式测试
–oltp_tables_count=250 表示会生成 250 个测试表
–oltp-table-size=25000 表示每个测试表填充数据量为 25000
–rand-init=on 表示每个测试表都是用随机数据来填充的
加载测试数据时长视数据量而定,若过程比较久需要稍加耐心等待。
2.5 监控脚本
Aurora
我们生成如下脚本来监控数据库,每秒一次输出 QPS/Commit/Rollback/TPS/Threads_con/ Threads_run 的信息,协助我们掌握数据库每秒的负载变化
vi aurora_monitor.sh #!/bin/bash mysqladmin -h -u -p"" extended-status –i1 |awk 'BEGIN{local_switch=0;print "QPS Commit Rollback TPS Threads_con Threads_run \n------------------------------------------------------- "} $2 ~ /Queries$/ {q=$4-lq;lq=$4;} $2 ~ /Com_commit$/ {c=$4-lc;lc=$4;} $2 ~ /Com_rollback$/ {r=$4-lr;lr=$4;} $2 ~ /Threads_connected$/ {tc=$4;} $2 ~ /Threads_running$/ {tr=$4; if(local_switch==0) {local_switch=1; count=0} else { if(count>10) {count=0;print "------------------------------------------------------- \nQPS Commit Rollback TPS Threads_con Threads_run \n------------------------------------------------------- ";} else{ count+=1; printf "%-6d %-8d %-7d %-8d %-10d %d \n", q,c,r,c+r,tc,tr; } } }'
Mysql
同样地,为 MYSQL 生成类似的脚本
vi mysql_monitor.sh #!/bin/bash mysqladmin -h <mysql server> -u <mysql user> -p"<mysql password>" extended-status –i1 |awk 'BEGIN{local_switch=0;print "QPS Commit Rollback TPS Threads_con Threads_run \n------------------------------------------------------- "} $2 ~ /Queries$/ {q=$4-lq;lq=$4;} $2 ~ /Com_commit$/ {c=$4-lc;lc=$4;} $2 ~ /Com_rollback$/ {r=$4-lr;lr=$4;} $2 ~ /Threads_connected$/ {tc=$4;} $2 ~ /Threads_running$/ {tr=$4; if(local_switch==0) {local_switch=1; count=0} else { if(count>10) {count=0;print "------------------------------------------------------- \nQPS Commit Rollback TPS Threads_con Threads_run \n------------------------------------------------------- ";} else{ count+=1; printf "%-6d %-8d %-7d %-8d %-10d %d \n", q,c,r,c+r,tc,tr; } } }'
三、测试
3.1 只读压力测试
Aurora
在所有 sysbench client 同时执行命令模拟负载,每次持续 5 分钟,同时使用监控脚本监视数据库的性能,从 console 查看 CPU,IO,网络等 metrics。在这里我们将通过修改 num_threads 参数连续测试 4100,4250,4500,4750,41000,41250 和 4*1500 多种并发连接的场景。
./sysbench --test=/home/ec2-user/sysbench/sysbench/tests/db/oltp.lua --mysql-host=<aurora server> --mysql-user=<aurora user> --mysql-password="<aurora password>" --mysql-port=3306 --mysql-db=<aurora db> --max-requests=0 --oltp-simple-ranges=0 --oltp-distxinct-ranges=0 --oltp-sum-ranges=0 --oltp-order-ranges=0 --max-time=300 --oltp-read-only=on --num-threads=1000 --report-interval=10 run>>aurora_r.log
参数说明
–num-threads=100 表示 sysbench client 发起 100 个并发连接
–oltp-read-only=on 表示是只读测试,off 表示不要进行只读测试,也就是会采用读写混合模式测试,
–report-interval=10 表示每 10 秒输出一次测试进度报告
–rand-type=uniform 表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托),special 表示存在热点数据,uniform 表示非热点数据模式, 默认是 special
–mysql-table-engine=xxx:表的存储引擎类型,innodb、myisam 这些都可以
–max-time=3600 表示最大执行时长为 3600 秒
–max-requests=0 表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长
–percentile=99 表示设定采样比例,默认是 95%,即丢弃 1%的长请求,在剩余的 99%里取最大值
即:模拟 对 10 个表并发 OLTP 测试,每个表 1000 万行记录,持续压测时间为 1 小时。
注意,针对不同的选项取值就会有不同的子选项。比如 oltp-dist-type=special,就有比如 oltp-dist-pct=1、oltp-dist-res=50 两个子选项,代表有 50%的查询落在 1%的行(即热点数据)上,另外 50%均匀的(sample uniformly)落在另外 99%的记录行上。
再比如 oltp-test-mode=nontrx 时, 就可以有 oltp-nontrx-mode,可选值有 select(默认), update_key, update_nokey, insert, delete,代表非事务式模式下使用的测试 sql 类型。
从监控脚本看
通过监控脚本可以看到类似结果
从 console 看数据库性能
我们可以关注数据库实例的 CPU 利用率,连接数,IO 和网络性能指标
Sysbench 结果
在每个 sysbench 客户端可以看到类似输出:
response time avg: 平均响应时间。(后面的 95%的大小可以通过–percentile=98 的方式去更改)
transactions: 精确的说是这一项后面的 TPS 。但如果使用了-oltp-skip-trx=on,这项事务数恒为 0,需要用 total number of events 去除以总时间,得到 tps(其实还可以分为读 tps 和写 tps)
read/write requests: 用它除以总时间,得到吞吐量 QPS
Mysql
同样地,在所有 sysbench client 同时执行命令模拟负载,每次持续 5 分钟,同时使用监控脚本监视数据库的性能,从 console 查看 CPU,IO,网络等 metrics。在这里我们将通过修改 num_threads 参数连续测试 4100,4250,4500,4750,41000,41250 和 4*1500 多种并发连接的场景。
./sysbench --test=/home/ec2-user/sysbench/sysbench/tests/db/oltp.lua --mysql-host=<mysql server> --oltp-tables-count=250 --mysql-user=<mysql user> --mysql-password="<mysql password>" --mysql-port=3306 --oltp-tablesize=25000 --mysql-db=<mysql db> --max-requests=0 --oltp-simple-ranges=0 --oltp-distxinct-ranges=0 --oltp-sum-ranges=0 --oltp-order-ranges=0 --max-time=300 --oltp-read-only=on --num-threads=1000 --report-interval=10 run >> mysql_r.log
从监控脚本看
通过监控脚本可以看到类似结果
从 console 看数据库性能
我们可以关注数据库实例的 CPU 利用率,连接数,IO 和网络性能指标
Sysbench 结果
在每个 sysbench 客户端可以看到类似输出:
3.2 读/写混合压力测试
Aurora
在所有 sysbench client 同时执行命令模拟负载,每次持续 5 分钟,同时使用监控脚本监视数据库的性能,从 console 查看 CPU,IO,网络等 metrics。在这里我们将通过修改 num_threads 参数连续测试 4100,4250,4500,4750,41000,41250 和 4*1500 多种并发连接的场景。
./sysbench --test=/home/ec2-user/sysbench/sysbench/tests/db/oltp.lua --mysql-host=<aurora server> --mysql-user=<aurora user> --mysql-password="<aurora password>" --mysql-port=3306 --mysql-db=<aurora db> --max-requests=0 --oltp-simple-ranges=0 --oltp-distxinct-ranges=0 --oltp-sum-ranges=0 --oltp-order-ranges=0 --max-time=300 --oltp-read-only=off --num-threads=1000 --oltp-tablesize=25000 --oltp-tables-count=250 --report-interval=10 run>>aurora_w.log
Mysql
在所有 sysbench client 同时执行命令模拟负载,每次持续 5 分钟,同时使用监控脚本监视数据库的性能,从 console 查看 CPU,IO,网络等 metrics。在这里我们将通过修改 num_threads 参数连续测试 4100,4250,4500,4750,41000,41250 和 4*1500 多种并发连接的场景。
./sysbench --test=/home/ec2-user/sysbench/sysbench/tests/db/oltp.lua --mysql-host=<mysql server> --oltp-tables-count=250 --mysql-user=<mysql user> --mysql-password="<mysql password>" --mysql-port=3306 --oltp-tablesize=25000 --mysql-db=<mysql db> --max-requests=0 --oltp-simple-ranges=0 --oltp-distxinct-ranges=0 --oltp-sum-ranges=0 --oltp-order-ranges=0 --max-time=300 --oltp-read-only=off --num-threads=1000 --report-interval=10 run >> mysql_w.log
3.3 结果分析
只读负载
在不同并发连接数下,Aurora 和 MYSQL 只读混合负载测试数据如下:
QPS mysql | 112K | 108K | 95K | 88K | 44K | 17K | 8.9K
QPS aurora | 440K | 680K | 776K | 748K | 726K | 683K | 659K
CPU mysql | 98 | 99 | 99 | 99 | 90 | 57 | 39
CPU aurora | 90 | 96 | 97 | 98 | 98 | 98 | 98
Response time mysql | 39.27ms | 103.08ms | 230.70ms | 365.23ms | 974.83ms | 4106.50ms | 8076.35ms
Response time aurora | 11.71ms | 19.12ms | 33.10ms | 51.32ms | 72.03ms | 93.36ms | 114.96ms
读/写混合负载
在不同并发连接数下,Aurora 和 MYSQL 读/写混合负载测试数据如下:
QPS/TPS mysql | 84K | 88K | 76K | 56K | 29K | 28K | 16K
QPS/TPS aurora | 160K | 188K | 184K | 172K | 152K | 140K | 128K
CPU mysql | 75 | 81 | 90 | 69 | 73 | 81 | 87
CPU aurora | 77 | 92 | 97 | 97 | 98 | 98 | 98
Response time mysql | 68.94ms | 168.17ms | 384.80ms | 778.60ms | 2073.83ms | 2569.24ms | 5815.39ms
Response time aurora | 38.89ms | 81.51ms | 163.37ms | 259.77ms | 391.70ms | 534.18ms | 638.33ms
分析
通过以上测试数据,我们可以得出以下结论
对于所有性能比对测试来说,只有测试环境的资源、参数配置,测试流程完全相同,才有比较意义
Aurora 对比 MYSQL,在同样负载压力,同样资源配置下,无论只读负载还是读写混合负载,其 QPS/TPS 以及平均响应时间都有明显的优势,而且这个优势随着并发连接的增大而增大,很多时候会超过 5 倍
一般来说,sysbench 测试中,随着并发数增大,目标数据库系统资源被充分利用,QPS/TPS 会提高,达到峰值后,资源开始争用,随着并发数继续增大,QPS/TPS 反而会下降,从测试来看,当并发数较大时,MYSQL 的 QPS/TPS 会下降得很快,而 Aurora 的 QPS/TPS 下降得平稳得多
一般来说,sysbench 测试中,随着并发数增大平均响应时间会下降,同样地,Aurora 的相应时间增大比 MYSQL 平缓得多,这样就意味着高并发时,Aurora 可以为客户提供更佳的服务
四、清除环境
Aurora
./sysbench --test=/home/ec2-user/sysbench/sysbench/tests/db/oltp.lua --mysql-host=<aurora server> --oltp-tables-count=250 --mysql-user=<aurora user> --mysql-password="<aurora password>" --mysql-port=3306 --oltp-table-size=25000 --mysql-db=<aurora db> --db-driver=mysql cleanup
Mysql
./sysbench --test=/home/ec2-user/sysbench/sysbench/tests/db/oltp.lua --mysql-host=<mysql server> --oltp-tables-count=250 --mysql-user=<mysql user> --mysql-password="<mysql password>" --mysql-port=3306 --oltp-table-size=25000 --mysql-db=<mysql db> --db-driver=mysql cleanup
参考资料
《Amazon Aurora: Design Considerations for High Throughput Cloud-Native Relational Databases》
《Amazon Aurora Performance Assessment》
总结
本文主要是为大家梳理用 sysbench 对 Aurora 和 MYSQL 进行性能测试的流程,启发大家做数据库性能测试的思路,当您按本文步骤进行测试的时候,随着环境,测试步骤的不同,需要对命令参数进行微调,测试结果也会相应变化,但测试的思路以及测试结果变化的客观规律却是共通的。除了 sysbench,我们还有其他的性能测试工具,譬如 mysqlslap 或 tpcc-mysql,本篇限于篇幅,没有介绍,在以后的 blog 中,我们再做介绍。
作者介绍:
吕琳
本文转载自 AWS 技术博客。
原文链接:
https://amazonaws-china.com/cn/blogs/china/aurora-test/
评论