MySQL数据库测压

工具

这里使用的是sysbench这一工具,用于模拟SQL请求,来对数据库进行测压,并且可以随自己的需求来调整测压时候的参数。

工具的安装

  1. 更新yum repo仓库,否则的可能出现安装失败的情况
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
  1. 使用yum进行sysbench的安装
//选择下面其中一个即可,第二个是针对权限不够时使用的
yum -y install sysbench

sudo yum -y install sysbench
  1. 检查是否安装成功
sysbench --version
//如果出现版本号说明安装成功

测压前的准备工作

首先需要自己先创建一个数据库,名字叫 test_db,并且创建好对应的测试账号和密码,可以都叫test_user,在做完这些之后执行下面的命令来进行表的创建

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare

解释这条sysbench命令的意思:

  1. –db-driver=mysql:数据库的驱动为mysql
  2. –time=300:连续访问时长,时间是300s
  3. –threads=10:线程数量,这里是用10个线程模拟并发访问
  4. –report-interval=1:输出结果的间隔,这里是1s间隔
  5. –mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user:这里的参数是连接数据库使用的ip,端口,用户名以及密码
  6. mysql-db=test_db --tables=20 --table_size=1000000:用于测压的目标数据库的名字,以及创建的表的数量20个,每个表里构造100万条数据,表名类似于sbtest1,sbtest2这个样子
  7. oltp_read_write:测试模式,这里表示执行读写模式
  8. –db-ps-mode=disable:禁用ps模式

正式开始测压

测压的类型由如下几种方式:

  • read_write
    sysbench命令:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run

读写模式测压结果:

mysql在线测试 mysql怎么测试_mysql在线测试

  • read_only
    sysbench命令:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_only --db-ps-mode=disable run

只读模式测压结果:

mysql在线测试 mysql怎么测试_压力测试_02

  • delete
    sysbench命令:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_delete --db-ps-mode=disable run

删除模式测压结果

mysql在线测试 mysql怎么测试_mysql在线测试_03

  • update_index
    sysbench命令:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_update_index --db-ps-mode=disable run

跟新索引数据模式:

mysql在线测试 mysql怎么测试_mysql_04

  • update_non_index
    sysbench命令:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_update_non_index --db-ps-mode=disable run

更新非索引字段模式:

mysql在线测试 mysql怎么测试_mysql在线测试_05

  • inser
    sysbench命令:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_insert --db-ps-mode=disable run

插入模式:

mysql在线测试 mysql怎么测试_数据库_06

  • write_only
    sysbencs命令:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=test_user --mysql-password=test_user --mysql-db=test_db --tables=20 --table_size=1000000 oltp_write_only --db-ps-mode=disable run

只读模式:

mysql在线测试 mysql怎么测试_数据库_07

在进行完上面的压力测试之后,就可以清理之前所创建的表了,命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=172.17.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable cleanup

测压结果分析

每次测压结束后都会出现如下结果:

SQL statistics:
    queries performed:
        read:                            0
        write:                           667992
        other:                           807208
        total:                           1475200
    transactions:                        245862 (819.44 per sec.)
    queries:                             1475200 (4916.73 per sec.)
    ignored errors:                      7      (0.02 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0354s
    total number of events:              245862

Latency (ms):
         min:                                    0.79
         avg:                                   12.20
         max:                                 3244.74
         95th percentile:                       26.68
         sum:                              2999665.19

Threads fairness:
    events (avg/stddev):           24586.2000/81.86
    execution time (avg/stddev):   299.9665/0.01

这里解释一下这些数据的含义:

read: 在测压期内一共执行了多少次读请求

write:在测压期内一共执行了多少次写请求

othor:在测压期内一共执行了多少次其他请求

total:在测压期内一共执行了多少次请求

transactions:总共执行的事务数量,括号内是每秒执行的事务的数量

queries:一共处理的请求数量,括号内是每秒执行的请求数量

ignored errors:忽略的错误

reconnects:重连的次数

//执行了300.0354,一共处理了24万+的事务

General statistics:
total time: 300.0354s
total number of events: 245862

Latency (ms):
min: 0.79 //请求中的最小延迟0.79ms

avg: 12.20 //请求中的平均延迟是12.20ms
max: 3244.74 //请求中的最大延迟是3244.74ms
95th percentile: 26.68 //95%的请求都在26.28ms内
sum: 2999665.19 //总计耗时2999665.19ms

延迟是12.20ms
max: 3244.74 //请求中的最大延迟是3244.74ms
95th percentile: 26.68 //95%的请求都在26.28ms内
sum: 2999665.19 //总计耗时2999665.19ms