zoukankan      html  css  js  c++  java
  • mysql性能测试报告

    1. 测试目的

    对mysql数据库进行基准测试,各性能指标进行定量的、可复现的、可对比的测试。

    基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试,

    数据可以由工具生成,不要求真实;而压力测试一般考虑业务逻辑(如购物车业务),要求真实的数据。

    2. 测试环境

    2.1 软件配置

    2.1 硬件配置

    3. 测试工具

    3.1 工具介绍sysbench

           本次测试采用通用工具SysBench,是跨平台的基准测试工具,支持多线程,支持多种数据库;

    对数据库的基准测试的作用,就是分析在当前的配置下(包括硬件配置、OS、数据库设置等) 数据库的性能表现,

    从而找出MySQL的性能阈值,并根据实际系统的要求调整硬件配置。

    3.2 测试指标

    TPS:Transaction Per Second,事务数/秒

    一台数据库服务器在单位时间内处理事务的个数,每个事务包含18条SQL语句。

    QPS:Query Per Second, 查询量/秒

    每秒执行的查询次数,是对服务器在规定时间内所处理查询量多少的衡量标准,即数据库每秒执行的SQL数,包含insert、select、update、delete等。

    响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间。

    并发量:同时处理的查询请求的数量。

    4. 安装步骤

     1 #cd /opt
     2 #下载sysbench包
     3 #wget -c https://github.com/akopytov/sysbench/archive/1.0.12.zip -O "sysbench-1.0.12.zip"
     4 #安装依赖项
     5 #yum install autoconf libtool mysql mysql-devel vim unzip
     6 #解压文件包
     7 #unzip  sysbench-1.0.12.zip
     8 #编译
     9 #cd sysbench-1.0.12
    10 #./autogen.sh
    11 #./configure
    12 #make
    13 #make install

     上述命令依次执行,安装完成。查找测试脚本所在路径:

      #find / -name '*oltp.lua*'

     例如:/opt/sysbench-1.0.12/tests/include/oltp_legacy/oltp.lua

     然后进入 cd /opt/sysbench-1.0.12,开始测试。

    5. 参数说明

    sysbenh测试工具命令,根据测试需要调整参数sysbench [options]... [testname] [command]

    sysbench --help 查看命令的基本参数

    表5-1

    选项[options]

    备注

    --test

    脚本路径 oltp.lua

    --mysql-db

    测试库名称

    --mysql-host

    数据库IP地址

    --mysql-port

    端口号 默认3306

    --mysql-user

    数据库用户名,一般是root

    --mysql-password

    数据库密码

    在老版本的sysbench中,可以通过--test参数指定测试的脚本;

    而在新版本中,--test参数已经声明为废弃,可以不使用--test,而是直接指定脚本。如下两种结果相同

      

    表5-2

    测试项[testname]

    备注

    --oltp-tables-count

    建表数量

    --oltp-table-size

    每张表的数据量,默认[10000]

    --time=N

    限制的总执行时间,默认为10s

    --threads=N

    需要使用的线程数,默认为1

    --report-interval=N

    指定间隔(秒)报告统计信息,默认为0,禁用

    --oltp-test-mode=complex

    测试模式,默认complex

    --oltp-test-mode 运行模式包括:

    simple   模式下只测试简单的查询;

    nontrx   不仅测试查询,还测试插入更新等,但是不使用事务;

    complex 模式下测试最全面,会测试增删改查,而且会使用事务。

    备注:如果需要特别测试服务器只读性能,或不使用事务时的性能,可以

    选择simple模式或nontrx模式。

    表5-3

    命令[command]

    备注

    prepare

    准备测试数据

    run

    执行测试

    cleanup

    清理数据

    6. 测试方法

    6.1 准备测试数据

    先登陆mysql数据库:

    #mysql -uroot -p密码 -h 主机ip

    执行show global variables统计各参数配置:show global status

    创建测试库sbtest:

    >create database sbtest;

    查看所有库名:

    >show databases;

    exit退出mysql,进入目录 cd /opt/sysbench-1.0.12

    开始测试前,首先要生成测试数据,

    执行以下命令:

    #sysbench --test=/opt/sysbench-1.0.12/tests/include/oltp_legacy/oltp.lua --mysql-db=sbtest --mysql-host=ip  --mysql-port=3306 --mysql-user=root --mysql-password=密码  --oltp-test-mode=complex --oltp-tables-count=200 --oltp-table-size=100000 --report-interval=2 prepare

    其中,prepare表示准备数据,在的sbtest库生成测试数据,

    创建200张表,每张表10万条数据,每2秒显示一次报告。

    注意这里不需要设置运行时间(time),执行时间受建表数量影响。

    运行过程如下图所示:

     6.2 建表语句

    数据准备阶段建表结构如下:

    CREATE TABLE `sbtest` (

    `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

    `k` INTEGER UNSIGNED DEFAULT '0' NOT NULL,

    `c` CHAR(120) DEFAULT '' NOT NULL,

    `pad` CHAR(60) DEFAULT '' NOT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB;

    说明:以上SQL无需执行建表,在下面介绍测试方法,数据准备阶段,执行命令时工具自动安照上面描述格式创建表。

    6.3 执行测试方法

    测试命令如下:

    #sysbench ./tests/include/oltp_legacy/oltp.lua --mysql-db=sbtest --mysql-host=ip  --mysql-port=3306 --mysql-user=root --mysql-password=密码

    --oltp-test-mode=complex --time=60 --threads=1 --report-interval=2 run

    其中, run表示运行测试,单线程 运行60秒。

    --oltp-tables-count(表个数)

    --oltp-table-size(表数据量)

    这两个参数用于准备阶段创建表的大小,在运行阶段不受影响,故run阶段可以取消这两个参数,结果不受影响。

    输出结果如下图:

    由上图可知,单线程下TPS为33,QPS为660;

    6.3.1 测试事务包含的SQL

    Sysbench自带测试脚本,路径如下/opt/sysbench-1.0.12/tests/include/oltp_legacy/oltp.lua

    默认提交的事务中包含18条SQL语句:

    主键SELECT语句,10条:

    SELECT c FROM ${rand_table_name} where id=${rand_id};

    范围SELECT语句,4条:

    SELECT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end};

    SELECT SUM(K) FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end};

    SELECT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end} ORDER BY c;

    SELECT DISTINCT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end} ORDER BY c;

    UPDATE语句,2条:

    UPDATE ${rand_table_name} SET k=k+1 WHERE id=${rand_id}

    UPDATE ${rand_table_name} SET c=${rand_str} WHERE id=${rand_id}

    DELETE语句,1条:

    DELETE FROM ${rand_table_name} WHERE id=${rand_id}

    INSERT语句,1条:

    INSERT INTO ${rand_table_name} (id, k, c, pad) VALUES (${rand_id},${rand_k},${rand_str_c},${rand_str_pad});

    6.3.2 清理测试数据

    #sysbench ./tests/include/oltp_legacy/oltp.lua --mysql-db=sbtest --mysql-host=ip

    --mysql-port=3306 --mysql-user=root --mysql-password=密码 --oltp-tables-count=600 cleanup

    其中,cleanup表示清理数据,这里不需要设置运行时间(time),只需设置表的数量即可,

    此时需表的数量>=准备阶段表的数量,才能全部清除测试数据,以免对下次结果产生影响;

    7. 测试用例

    7.1 测试用例(一)

    测试用例1:创建6张表每表预置1000万行数据测试

    测试目的

    对大表进行增删改查场景下的QPS和TPS

    前置条件

    7张表,每张表1000万行数据,每次修改并发数

    步骤

    1.准备测试数据(8张表会提示空间不足,因为存储只有40G)

    sysbench

    --test=/opt/sysbench1.0.12/tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest --mysql-host=ip  --mysql-port=3306

    --mysql-user=root --mysql-password=密码 

    --oltp-test-mode=complex   --oltp-tables-count=7 

    --oltp-table-size=10000000  --report-interval=2 prepare

    2.运行测试

    sysbench ./tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest   --mysql-host=IP --mysql-port=3306

    --mysql-user=root    --mysql-password=密码

    --oltp-test-mode=complex --time=600 

    --threads=32 --report-interval=2 --oltp-tables-count=64 run

    3.记录结果,并依次增加线程数threads分别记录线程数为 1/ 16/ 32/ 64/ 128 ……情况下的指标及资源情况

    4.清除测试数据

    sysbench ./tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest --mysql-host=IP --mysql-port=3306

    --mysql-user=root    --mysql-password=密码

    --oltp-tables-count=7 cleanup

    参数化变量

    --threads:线程数,增加线程数观察瓶颈

    获取指标

    1、TPS

    2、QPS

    3、总事务数

    4、前95%延迟时间

    7.2 测试用例(二)

     

    测试用例2:创建6张表每表预置100万行数据测试

    测试目的

    与用例1进行对比,观察表数据量的多少,对结果是否有影响

    前置条件

    7张表,每张表10万行数据,每次修改并发数

    步骤

    1.准备测试数据

    sysbench

    --test=/opt/sysbench-1.0.12/tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest --mysql-host=IP  --mysql-port=3306

    --mysql-user=root  --mysql-password=密码 

    --oltp-test-mode=complex  --oltp-tables-count=7 

    --oltp-table-size=100000  --report-interval=2 prepare

    2.运行测试

    sysbench ./tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest --mysql-host=IP --mysql-port=3306

    --mysql-user=root --mysql-password=密码

    --oltp-test-mode=complex --time=600--threads=32 

    --report-interval=2 --oltp-tables-count=64 run

    3.记录结果,并依次增加线程数threads分别记录线程数为 1/ 16/ 32/ 64/ 128 ……情况下的指标及资源情况

    4.清除测试数据

    sysbench ./tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest  --mysql-host=IP

    --mysql-port=3306  --mysql-user=root

    --mysql-password=密码  --oltp-tables-count=7  cleanup

    参数化变量

    --threads:线程数,增加线程数观察瓶颈

    获取指标

    1、TPS

    2、QPS

    3、总事务数

    4、前95%延迟时间

    7.3 测试用例(三)

    测试用例3:创建200张表每表预置100万行数据

    测试目的

    与用例2相比,单表数量一致,增加表的数量进行观察

    前置条件

    200张表,每张表10万行数据,每次修改并发数

    步骤

    1.准备测试数据

    sysbench

    --test=/opt/sysbench-1.0.12/tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest --mysql-host=IP  --mysql-port=3306

    --mysql-user=root --mysql-password=密码 

    --oltp-test-mode=complex --oltp-tables-count=200 

    --oltp-table-size=100000  --report-interval=2 prepare

    2.运行测试

    sysbench ./tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest --mysql-host=IP --mysql-port=3306

    --mysql-user=root --mysql-password=密码

    --oltp-test-mode=complex --time=600 --threads=128

     --report-interval=2 --oltp-tables-count=64 run

    3.记录结果,并依次增加线程数threads分别记录线程数为 1/ 16/ 32/ 64/ 128 ……情况下的指标及资源情况

    4.清除测试数据

    sysbench ./tests/include/oltp_legacy/oltp.lua

    --mysql-db=sbtest --mysql-host=IP --mysql-port=3306

    --mysql-user=root --mysql-password=密码

    --oltp-tables-count=200 cleanup

    参数化变量

    --threads 线程数,增加线程数观察瓶颈

    获取指标

    1、TPS

    2、QPS

    3、总事务数

    4、前95%延迟时间

    8. 测试结果分析

    8.1   6张表每表预置1000万行数据测试

    8.1.1 测试结果

    线程数

    1

    16

    32

    64

    96

    128

    160

    256

    512

    TPS(/s)

                   

    QPS(/s)

                   

    事务总数(万)

                   

    前95%延迟时间(ms)

                   

    8.1.2 测试过程记录

    1)数据准备阶段:

    说明:准备完成后,表空间约13G;

    2)执行测试阶段:

    ①连接数1:

    8.1.3 资源情况

    查看云服务自带监控;

    8.1.4 结果分析

    根据测试结果进行描述;

    。。。。

    9. 测试结果总结

    总结当前mysql测试环境,在并发线程数达到160左右时,TPS约900/s左右,QPS约1.8万/s左右,95%事务平均延迟达到300ms,

    再增加并发数据后,QPS变化不大,但延迟时间明显加长。测试过程整体CPU利用率较高,在达到最大TPS及QPS时此时CPU利用率达到93%以上。

    特别说明:此总结只适用于本次测试。

  • 相关阅读:
    golang生成树状菜单
    golang自定义某种类型时的打印输出
    【转】搭建自己的邮件服务器
    【转】【VSCode】golang的调试配置launch.json
    【转】Nvidia GeForce MX250 Lower-End Dedicated Graphics
    【转】Alertmanager高可用
    【转】Prometheus 和 Alertmanager实战配置
    YAML格式的语法
    golang写一个占用大内存的程序
    [转]TDengine常用命令及SQL
  • 原文地址:https://www.cnblogs.com/llwxhn/p/12498730.html
Copyright © 2011-2022 走看看