亚马逊AWS官方博客

知己知彼–对Aurora进行压力测试

一、前言

Amazon Aurora 是一种为云打造并与 MySQL 和 PostgreSQL 兼容的关系数据库,既具有高端商用数据库的性能和可用性,又具有开源数据库的简单性和成本效益。相比起MYSQL, Aurora在只读副本延迟,可扩展性,备份恢复速度以及存储空间扩展等方面都有很大优势,更有回溯,aurora serverless等实用的新功能,除了以上功能和管理方面的优点外,Aurora 的速度最高可以达到标准 MySQL 数据库的五倍、标准 PostgreSQL 数据库的三倍。

随着宁夏区推出Aurora,中国区客户终于可以体验Aurora的独特魅力了,在迁移数据库之前,有些客户也想进行性能比对测试,做到知己知彼。针对这种需求,这里我将给大家介绍如何用sysbench对MYSQL RDS和Aurora进行测试,讲解不同测试参数的含义,分析不同测试案例的结果,希望对大家今后测试数据库的工作有所帮助。

 

二、环境准备

2.1 环境信息

测试端

机型 vCPU 内存(GiB) 磁盘 网络
4台db.r4.8xlarge EC2 32 244 通用SSD 40G

 

数据库

数据库 DB instance class vCPU 内存(GiB) 磁盘 网络
Aurora mysql5.6 RDS db.r4.8xlarge 32 244 SSD
mysql5.6 RDS db.r4.8xlarge 32 244 IOPS 10000 SSD 40G

 

 

2.2 安装和配置sysbench

在四台测试客户端安装sysbench

安装Sysbench Version 0.5,执行以下步骤:

  1. 以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

  1. 编译和安装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参数连续测试4*100,4*250,4*500,4*750,4*1000,4*1250和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参数连续测试4*100,4*250,4*500,4*750,4*1000,4*1250和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参数连续测试4*100,4*250,4*500,4*750,4*1000,4*1250和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参数连续测试4*100,4*250,4*500,4*750,4*1000,4*1250和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只读混合负载测试数据如下:

400并发 1000并发 2000并发 3000并发 4000并发 5000并发 6000并发
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读/写混合负载测试数据如下:

400并发 1000并发 2000并发 3000并发 4000并发 5000并发 6000并发
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解决方案架构师,负责基于 AWS 的云计算方案的咨询与架构设计,同时致力于数据库和大数据方面的研究和推广。在加入AWS 之前曾在Oracle担任高级讲师并在Amazon担任高级DBA,在数据库设计运维调优、DR解决方案、大数据以及企业应用等方面有丰富的经验。