本文档介绍以Sysbench工具测试PolarDB MySQL版集群OLTP负载性能,您可以按照本文介绍自行测试对比,快速了解数据库系统的性能。
测试工具
Sysbench是一个开源的、跨平台的性能测试工具,主要用于数据库基准测试(如MySQL)、 系统性能测试(如CPU、内存、IO、线程)。它支持多线程测试,并通过Lua脚本灵活控制测试逻辑,适合数据库性能评估、压力测试等场景。
测试环境
测试的ECS和PolarDB MySQL版需均在同一地域、同一可用区和同一个VPC网络。
说明ECS实例和PolarDB MySQL版集群需保证在同一个VPC中,确保ECS实例的PING延迟小于0.2ms,以保证性能评估的有效性。
测试用PolarDB MySQL版集群如下:
只读、只写以及读写性能测试使用的是两节点集群(一主一只读)集群进行测试。
使用的连接地址涉及主地址、集群地址以及自定义地址。实际测试过程中,会根据情况灵活调整连接串的组合方式,以确保最大化利用数据库集群资源。
测试用ECS实例信息如下:
实例规格为ecs.c5.4xlarge(16核32 GB)。
实例所使用的镜像为CentOS 7.0 64位。
实例数量,根据PolarDB集群来定,计算节点为8核时,使用一个ECS实例,16核规格使用2个ECS实例,以此类推。
PolarDB MySQL版集群参数配置:
在进行高并发测试时,可能会出现
can't create more than max_prepared_stmt_count statements
的错误,从而导致测试失败。可以通过增加max_prepared_stmt_count
参数来允许更多的准备语句,参数设置请参见设置集群参数和节点参数。在大规模、高并发场景下,即便将
max_prepared_stmt_count
参数调整至最大值仍可能无法满足需求。为确保性能测试的顺利进行,测试命令将额外添加--db-ps-mode=disable
参数,以禁用Prepared Statement功能。对于超大规格集群(88 核及以上),还需引入额外的参数调优,以充分发挥集群资源,具体调优参数将根据测试页面实例规格和业务场景,建议您在实施优化前进行充分的性能评估,并根据实际效果进行参数微调。
注意事项
本次测试始终使用tables=250和table-size=25000的数据量,threads由低到高递增进行测试,各性能测试详情页只展示峰值结果。
测试场景
对不同独享规格的一主一只读节点集群的只读、只写、读写性能进行OLTP性能测试。
衡量指标
TPS(Transactions Per Second):即数据库每秒执行的事务数,以COMMIT成功次数为准。
QPS(Queries Per Second):即数据库每秒执行的SQL数(含INSERT、SELECT、UPDATE、DELETE等)。
安装Sysbench
本文档中的命令只能由root权限的用户来执行。
在ECS中执行如下命令安装Sysbench。
git clone https://github.com/akopytov/sysbench.git ##从Git中下载Sysbench cd sysbench ##打开Sysbench目录 ./autogen.sh ##运行autogen.sh ./configure make -j ##编译 make install
执行如下命令配置Sysbench client,使内核可以利用所有的CPU核数处理数据包(默认设置为2核),同时减少CPU核数之间的上下文切换。
sudo sh -c 'for x in /sys/class/net/eth0/queues/rx-*; do echo ffff>$x/rps_cpus; done'
说明ffff表示使用16个核。请根据实际配置修改,例如ECS为8核,则输入
ff
,ffff为16核依次类推。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"
测试方法
以下测试方法中以PolarDB MySQL版集群版为例进行说明。
获取PolarDB MySQL版集群地址和端口。具体操作请参见管理连接地址。
将PolarDB MySQL版集群地址的主库是否接受读设置为是,具体操作请参见配置数据库代理。
登录数据库
在ECS上执行如下命令,以在PolarDB MySQL版集群中创建数据库
testdb
为例。mysql -h XXX -P XXX -u XXX -p XXX -e 'create database testdb'
说明请将本命令和后续步骤命令中的
XXX
替换为PolarDB MySQL版集群的集群地址、端口号、用户名和密码,具体参数说明如下。参数
说明
-h
PolarDB MySQL版集群的集群地址。
-P
PolarDB MySQL版集群的端口号。
-u
PolarDB MySQL版集群的用户名。
-p
上述用户名对应的密码。
具体场景测试命令如下:
只读场景测试(OLTP Read Only)
说明只读场景这里--range-selects=0,相当于测试的oltp_point_selects场景。
准备数据
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only prepare
执行只读测试
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only run
清理数据
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only cleanup
测试语句字段含义如下:
参数类别
展示内容
说明
tables
数据表数量
所有参与测试的数据表数量。
table_size
数据表行数
展示每个表的记录数量。
数据量大小
以存储空间(如MB/GB)为单位展示表的数据量。
threads
并发线程数
显示当前配置的线程数量。
线程状态
支持实时查看线程运行状态。
混合读写测试(OLTP Read Write)
说明模拟典型业务读写混合负载。
具体的tables、table-size和threads等核心参数将在测试数据页面中进行一对一的方式展示。
准备数据
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write prepare
执行读写测试
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write run
清理数据
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write cleanup
测试语句字段含义如下:
参数类别
展示内容
说明
tables
数据表数量
所有参与测试的数据表数量。
table_size
数据表行数
展示每个表的记录数量。
数据量大小
以存储空间(如MB/GB)为单位展示表的数据量。
threads
并发线程数
显示当前配置的线程数量。
线程状态
支持实时查看线程运行状态。
写入测试(OLTP Write Only)
说明具体的tables、table-size和threads等核心参数将在测试数据页面中进行一对一的方式展示。
准备数据
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only prepare
执行写入测试
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only run
清理数据
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only cleanup
测试语句字段含义如下:
参数类别
展示内容
说明
tables
数据表数量
所有参与测试的数据表数量。
table_size
数据表行数
展示每个表的记录数量。
数据量大小
以存储空间(如MB/GB)为单位展示表的数据量。
threads
并发线程数
显示当前配置的线程数量。
线程状态
支持实时查看线程运行状态。
后续步骤
PolarDB MySQL版8.0.2版本测试结果请参见PolarDB MySQL版8.0.2版本性能(集群版)。
PolarDB MySQL版8.0.1版本测试结果请参见PolarDB MySQL版8.0.1版本性能(集群版)。
PolarDB MySQL版5.7版本测试结果请参见PolarDB MySQL 5.7性能(集群版)。
PolarDB MySQL版5.6版本测试结果请参见PolarDB MySQL 5.6性能(集群版)。
PolarDB MySQL版对比RDS MySQL测试结果请参见PolarDB MySQL版与RDS MySQL性能对比。