对 Aurora 进行压力测试

阅读数:47 2019 年 10 月 17 日 08:00

对Aurora进行压力测试

一、前言

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

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

二、环境准备

2.1 环境信息

测试端

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

数据库

col 1 col 2 col 3 col 4 col 5 col 6
数据库 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

其输出类似:

对Aurora进行压力测试

对Aurora进行压力测试

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

其输出类似:

对Aurora进行压力测试

对Aurora进行压力测试

参数含义

–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 类型。

从监控脚本看

通过监控脚本可以看到类似结果

对Aurora进行压力测试

从 console 看数据库性能

我们可以关注数据库实例的 CPU 利用率,连接数,IO 和网络性能指标

对Aurora进行压力测试

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

对Aurora进行压力测试

对Aurora进行压力测试

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

从监控脚本看

通过监控脚本可以看到类似结果

对Aurora进行压力测试

从 console 看数据库性能

我们可以关注数据库实例的 CPU 利用率,连接数,IO 和网络性能指标

对Aurora进行压力测试

Sysbench 结果

在每个 sysbench 客户端可以看到类似输出:

对Aurora进行压力测试

对Aurora进行压力测试

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 只读混合负载测试数据如下:

col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8
复制代码
| 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 读 / 写混合负载测试数据如下:

col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8
复制代码
| 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 解决方案、大数据以及企业应用等方面有丰富的经验。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/aurora-test/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布