性能测试方法(OLTP)

本文档介绍以Sysbench工具测试PolarDB MySQL集群OLTP负载性能,您可以按照本文介绍自行测试对比,快速了解数据库系统的性能。

测试工具

Sysbench是一个开源的、跨平台的性能测试工具,主要用于数据库基准测试(如MySQL)、 系统性能测试(如CPU、内存、IO、线程)。它支持多线程测试,并通过Lua脚本灵活控制测试逻辑,适合数据库性能评估、压力测试等场景。

测试环境

  • 测试的ECSPolarDB MySQL需均在同一地域、同一可用区和同一个VPC网络。

    说明

    ECS实例和PolarDB MySQL集群需保证在同一个VPC中,确保ECS实例的PING延迟小于0.2ms,以保证性能评估的有效性。

  • 测试用PolarDB MySQL集群如下:

    • 只读、只写以及读写性能测试使用的是两节点集群(一主一只读)集群进行测试。

    • 使用的连接地址涉及主地址、集群地址以及自定义地址。实际测试过程中,会根据情况灵活调整连接串的组合方式,以确保最大化利用数据库集群资源。

  • 测试用ECS实例信息如下:

    • 实例规格为ecs.c5.4xlarge(1632 GB)。

    • 实例所使用的镜像为CentOS 7.0 64位。

    • 实例数量,根据PolarDB集群来定,计算节点为8核时,使用一个ECS实例,16核规格使用2ECS实例,以此类推。

  • 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=250table-size=25000的数据量,threads由低到高递增进行测试,各性能测试详情页只展示峰值结果。

测试场景

对不同独享规格的一主一只读节点集群的只读、只写、读写性能进行OLTP性能测试。

衡量指标

  • TPS(Transactions Per Second):即数据库每秒执行的事务数,以COMMIT成功次数为准。

  • QPS(Queries Per Second):即数据库每秒执行的SQL数(含INSERT、SELECT、UPDATE、DELETE等)。

安装Sysbench

重要

本文档中的命令只能由root权限的用户来执行。

  1. ECS中执行如下命令安装Sysbench。

    git clone https://github.com/akopytov/sysbench.git
    ##从Git中下载Sysbench
    
    cd sysbench
    ##打开Sysbench目录
    
    ./autogen.sh
    ##运行autogen.sh
    
    ./configure
    
    make -j
    ##编译
    
    make install
  2. 执行如下命令配置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个核。请根据实际配置修改,例如ECS8核,则输入ffffff16核依次类推。

    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集群版为例进行说明。

  1. 获取PolarDB MySQL集群地址和端口。具体操作请参见管理连接地址

  2. PolarDB MySQL集群地址的主库是否接受读设置为,具体操作请参见配置数据库代理

  3. 登录数据库

    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

    上述用户名对应的密码。

  4. 具体场景测试命令如下:

    只读场景测试(OLTP Read Only)

    说明

    只读场景这里--range-selects=0,相当于测试的oltp_point_selects场景。

    1. 准备数据

      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
    2. 执行只读测试

      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
    3. 清理数据

      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-sizethreads等核心参数将在测试数据页面中进行一对一的方式展示。

    1. 准备数据

      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
    2. 执行读写测试

      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
    3. 清理数据

      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-sizethreads等核心参数将在测试数据页面中进行一对一的方式展示。

    1. 准备数据

      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
    2. 执行写入测试

      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
    3. 清理数据

      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

    并发线程数

    显示当前配置的线程数量。

    线程状态

    支持实时查看线程运行状态。

后续步骤