sysbench 压力测试数据库

数据库的优化工作中压力测试也是不可缺少的一部分,使用 sysbench 进行压力测试,特此记录一下。

首先准备一个运行环境,我是采用的的Windows下安装的docker桌面版,docker镜像的系统是 centos ,随便下载了一个,没有准备环境的可以在网上搜索一下docker的安装和运行之类的。比VM虚拟机轻量化,而且相比于比VM的配置少了不少,对新手特别友好。

准备工作做好后运行centos容器,可以先更新一下yum

然后更新yum repo仓库

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash

使用yum进行sysbench的安装

如果报这个错误

bash: sudo: command not found

那么就把 sudo 去掉 重新运行一次上面的代码

yum -y install sysbench

检查是否安装成功

sysbench --version    //如果出现版本号说明安装成功

sysbench 介绍

使用方法

sysbench [options]... [testname] [command] 
command是sysbench要执行的命令,包括prepare、run和cleanup,顾名思义,
  • prepare是为测试提前准备数据,
  • run是执行正式的测试,
  • cleanup是在测试完成后对数据库进行清理。
estname指定了要进行的测试,在老版本的sysbench中,可以通过–test参数指定测试的脚本;而在新版本中,–test参数已经声明为废弃,可以不使用–test,
sysbench --test=./tests/include/oltp_legacy/oltp.lua

等价

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

大部分人可能运行这段代码会报错,主要的原因可能是没有开启数据库的远程访问,执行如下代码

mysql 远程连接权限 :

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH  GRANT OPTION;
FLUSH   PRIVILEGES;

分别执行一下再次链接试试。

需要注意的是 --mysql-host = xxx.xxx.xxx.xx 这个由于是在docker内部访问的,所以写127.0.0.1是不行的,写 localhost 也不行,访问外网ip倒是可以

那怎么样才能访问到本机,简单,直接打开cmd命令,然后输入 ipconfig 查看自己的 IPV4 地址,把 IPV4地址放上去就行。

在这里插入图片描述

当然也有办法可以通过配置docker的环境来让localhost 和127.0.0.1也能访问到宿主机,但是配置起来比较麻烦,还是直接这样比较简单。

这时,再次执行这段代码就应该没问题了

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

执行成功的话应该会看到正在创建测试表和插入数据,等待完成即可。

sysbench的几种测试模式

也就是上面说的 [testname] ,这里不用直接指定 testname 的位置也行

注意:需要将下面的命令中的一些参数替换为自己的参数

read_write 读写
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=xxx.xxx.xxx.xxx --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db--tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run

执行得到如下结果:


SQL statistics:
    queries performed:
        read:                            269556                   #在测压期内一共执行了多少次读请求
        write:                           77016                    #在测压期内一共执行了多少次写请求
        other:                           38508                    #在测压期内一共执行了多少次其他请求
        total:                           385080                   #在测压期内一共执行了多少次请求
    transactions:                        19254  (64.17 per sec.)  #总共执行的事务数量,括号内是每秒执行的事务的数量
    queries:                             385080 (1283.36 per sec.)#一共处理的请求数量,括号内是每秒执行的请求数量
    ignored errors:                      0      (0.00 per sec.)   #忽略的错误
    reconnects:                          0      (0.00 per sec.)   #重连的次数

General statistics:                                               # 一些统计结果
    total time:                          300.0542s                #执行了300.0354
    total number of events:              19254                    #一共处理了1.9万+的事务
    
Latency (ms):                                                     # 响应时长统计
         min:                                   36.09             #请求中的最小延迟36.09ms
         avg:                                  155.82             #请求中的平均延迟是155.82ms
         max:                                  519.33             #请求中的最大延迟是519.33ms
         95th percentile:                      350.33             #95%的请求都在350.33ms内
         sum:                              3000150.55             #总计耗时3000150.55ms

Threads fairness:                                                 # 与线程相关的指标
    events (avg/stddev):           1925.4000/8.82                 # 事件(平均值/偏差)
    execution time (avg/stddev):   300.0151/0.02                  # 执行时间(平均值/偏差)
    
inser 插入
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=xxx.xxx.xxx.xxx --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db--tables=20 --table_size=1000000 oltp_insert --db-ps-mode=disable run

SQL statistics:
    queries performed:
        read:                            0                         #在测压期内一共执行了多少次读请求
        write:                           149896                    #在测压期内一共执行了多少次写请求
        other:                           0                         #在测压期内一共执行了多少次其他请求
        total:                           149896                    #在测压期内一共执行了多少次请求
    transactions:                        149896 (499.51 per sec.)  #总共执行的事务数量,括号内是每秒执行的事务的数量
    queries:                             149896 (499.51 per sec.)  #一共处理的请求数量,括号内是每秒执行的请求数量
    ignored errors:                      0      (0.00 per sec.)    #忽略的错误
    reconnects:                          0      (0.00 per sec.)    #重连的次数
                                                                     
General statistics:                                                # 一些统计结果
    total time:                          300.0739s                 #执行了300.0739
    total number of events:              149896                    #一共处理了14万+的事务
                                                                     
Latency (ms):                                                      # 响应时长统计
         min:                                    1.69              #请求中的最小延迟1.69ms
         avg:                                   20.01              #请求中的平均延迟是20.01ms
         max:                                  259.40              #请求中的最大延迟是259.40ms
         95th percentile:                       82.96              #95%的请求都在82.96ms内
         sum:                              2999073.35              #总计耗时2999073.35ms
                                                                     
Threads fairness:                                                  # 与线程相关的指标
    events (avg/stddev):           14989.6000/68.22                # 事件(平均值/偏差)
    execution time (avg/stddev):   299.9073/0.02                   # 执行时间(平均值/偏差)

update_index 更新索引数据
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=xxx.xxx.xxx.xxx --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db--tables=20 --table_size=1000000 oltp_update_index --db-ps-mode=disable run

执行得到如下结果:


SQL statistics:
    queries performed:
        read:                            0                         #在测压期内一共执行了多少次读请求
        write:                           60297                     #在测压期内一共执行了多少次写请求
        other:                           23690                     #在测压期内一共执行了多少次其他请求
        total:                           83987                     #在测压期内一共执行了多少次请求
    transactions:                        83987  (279.91 per sec.)  #总共执行的事务数量,括号内是每秒执行的事务的数量
    queries:                             83987  (279.91 per sec.)  #一共处理的请求数量,括号内是每秒执行的请求数量
    ignored errors:                      0      (0.00 per sec.)    #忽略的错误
    reconnects:                          0      (0.00 per sec.)    #重连的次数
                                                                   
General statistics:                                                # 一些统计结果
    total time:                          300.0432s                 #执行了300.0432
    total number of events:              83987                     #一共处理了8万+的事务
                                                                   
Latency (ms):                                                      # 响应时长统计
         min:                                    0.52              #请求中的最小延迟0.52ms
         avg:                                   35.72              #请求中的平均延迟是35.72ms
         max:                                  282.80              #请求中的最大延迟是282.80ms
         95th percentile:                      110.66              #95%的请求都在110.66ms内
         sum:                              2999902.49              #总计耗时2999902.49ms
                                                                   
Threads fairness:                                                  # 与线程相关的指标
    events (avg/stddev):           8398.7000/64.16                 # 事件(平均值/偏差)
    execution time (avg/stddev):   299.9902/0.01                   # 执行时间(平均值/偏差)

update_non_index 更新非索引字段
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=xxx.xxx.xxx.xxx --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db--tables=20 --table_size=1000000 oltp_update_non_index --db-ps-mode=disable run

执行得到如下结果:


SQL statistics:
    queries performed:
        read:                            801668                    #在测压期内一共执行了多少次读请求
        write:                           0                         #在测压期内一共执行了多少次写请求
        other:                           114524                    #在测压期内一共执行了多少次其他请求
        total:                           916192                    #在测压期内一共执行了多少次请求
    transactions:                        57262  (190.84 per sec.)  #总共执行的事务数量,括号内是每秒执行的事务的数量
    queries:                             916192 (3053.46 per sec.) #一共处理的请求数量,括号内是每秒执行的请求数量
    ignored errors:                      0      (0.00 per sec.)    #忽略的错误
    reconnects:                          0      (0.00 per sec.)    #重连的次数
                                                                   
General statistics:                                                # 一些统计结果
    total time:                          300.0487s                 #执行了300.0487
    total number of events:              57262                     #一共处理了5万+的事务
                                                                   
Latency (ms):                                                      # 响应时长统计
         min:                                   27.98              #请求中的最小延迟27.98ms
         avg:                                   52.39              #请求中的平均延迟是52.39ms
         max:                                  112.10              #请求中的最大延迟是112.10ms
         95th percentile:                       64.47              #95%的请求都在64.47ms内
         sum:                              3000076.46              #总计耗时3000076.46ms
                                                                   
Threads fairness:                                                  # 与线程相关的指标
    events (avg/stddev):           5726.2000/4.56                  # 事件(平均值/偏差)
    execution time (avg/stddev):   300.0076/0.01                   # 执行时间(平均值/偏差)

read_only 只读
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=xxx.xxx.xxx.xxx --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db--tables=20 --table_size=1000000 oltp_read_only --db-ps-mode=disable run

执行得到如下结果:


SQL statistics:
    queries performed:
        read:                            801668                    #在测压期内一共执行了多少次读请求
        write:                           0                         #在测压期内一共执行了多少次写请求
        other:                           114524                    #在测压期内一共执行了多少次其他请求
        total:                           916192                    #在测压期内一共执行了多少次请求
    transactions:                        57262  (190.84 per sec.)  #总共执行的事务数量,括号内是每秒执行的事务的数量
    queries:                             916192 (3053.46 per sec.) #一共处理的请求数量,括号内是每秒执行的请求数量
    ignored errors:                      0      (0.00 per sec.)    #忽略的错误
    reconnects:                          0      (0.00 per sec.)    #重连的次数
                                                                   
General statistics:                                                # 一些统计结果
    total time:                          300.0487s                 #执行了300.0487
    total number of events:              57262                     #一共处理了5万+的事务
                                                                   
Latency (ms):                                                      # 响应时长统计
         min:                                   27.98              #请求中的最小延迟27.98ms
         avg:                                   52.39              #请求中的平均延迟是52.39ms
         max:                                  112.10              #请求中的最大延迟是112.10ms
         95th percentile:                       64.47              #95%的请求都在64.47ms内
         sum:                              3000076.46              #总计耗时3000076.46ms
                                                                   
Threads fairness:                                                  # 与线程相关的指标
    events (avg/stddev):           5726.2000/4.56                  # 事件(平均值/偏差)
    execution time (avg/stddev):   300.0076/0.01                   # 执行时间(平均值/偏差)

write_only 只写
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=xxx.xxx.xxx.xxx --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db--tables=20 --table_size=1000000 oltp_write_only --db-ps-mode=disable run

执行得到如下结果:


SQL statistics:
    queries performed:
        read:                            0                        #在测压期内一共执行了多少次读请求
        write:                           132208                   #在测压期内一共执行了多少次写请求
        other:                           113012                   #在测压期内一共执行了多少次其他请求
        total:                           245220                   #在测压期内一共执行了多少次请求
    transactions:                        40870  (136.19 per sec.) #总共执行的事务数量,括号内是每秒执行的事务的数量
    queries:                             245220 (817.17 per sec.) #一共处理的请求数量,括号内是每秒执行的请求数量
    ignored errors:                      0      (0.00 per sec.)   #忽略的错误
    reconnects:                          0      (0.00 per sec.)   #重连的次数
                                                                  
General statistics:                                               # 一些统计结果
    total time:                          300.0827s                #执行了300.0827
    total number of events:              40870                    #一共处理了4万+的事务
                                                                  
Latency (ms):                                                     # 响应时长统计
         min:                                    7.76             #请求中的最小延迟7.76ms
         avg:                                   73.41             #请求中的平均延迟是73.41ms
         max:                                  529.44             #请求中的最大延迟是529.44ms
         95th percentile:                      189.93             #95%的请求都在189.93ms内
         sum:                              3000425.15             #总计耗时3000425.15ms
                                                                  
Threads fairness:                                                 # 与线程相关的指标
    events (avg/stddev):           4087.0000/15.79                # 事件(平均值/偏差)
    execution time (avg/stddev):   300.0425/0.03                  # 执行时间(平均值/偏差)

delete 删除
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=xxx.xxx.xxx.xxx --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test_db--tables=20 --table_size=1000000 oltp_delete --db-ps-mode=disable run

执行得到如下结果:


SQL statistics:
    queries performed:
        read:                            0                        #在测压期内一共执行了多少次读请求
        write:                           78277                    #在测压期内一共执行了多少次写请求
        other:                           14124                    #在测压期内一共执行了多少次其他请求
        total:                           92401                    #在测压期内一共执行了多少次请求
    transactions:                        92401  (307.99 per sec.) #总共执行的事务数量,括号内是每秒执行的事务的数量
    queries:                             92401  (307.99 per sec.) #一共处理的请求数量,括号内是每秒执行的请求数量
    ignored errors:                      0      (0.00 per sec.)   #忽略的错误
    reconnects:                          0      (0.00 per sec.)   #重连的次数
                                                                  
General statistics:                                               # 一些统计结果
    total time:                          300.0145s                #执行了300.0145
    total number of events:              92401                    #一共处理了9万+的事务
                                                                  
Latency (ms):                                                     # 响应时长统计
         min:                                    0.50             #请求中的最小延迟0.50ms
         avg:                                   32.46             #请求中的平均延迟是32.46ms
         max:                                  323.11             #请求中的最大延迟是323.11ms
         95th percentile:                      108.68             #95%的请求都在108.68ms内
         sum:                              2999726.35             #总计耗时2999726.35ms
                                                                  
Threads fairness:                                                 # 与线程相关的指标
    events (avg/stddev):           9240.1000/69.14                # 事件(平均值/偏差)
    execution time (avg/stddev):   299.9726/0.00                  # 执行时间(平均值/偏差)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值