数据库的优化工作中压力测试也是不可缺少的一部分,使用 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 # 执行时间(平均值/偏差)