SysBench是一个基于LuaJIT的可脚本化多线程基准测试工具。它最常用于数据库基准测试,但也可用于创建不涉及数据库服务器的任意复杂工作负载。本文以一个典型测试为例,介绍SysBench的安装和使用。
一、环境信息
被测服务器(192.168.132.167):
- 4核8线程,32GB,1TB 7200转机械硬盘
- CentOS 7.9
- PostgreSQL 9.6.2
测试客户端(192.168.130.152):
- 4核8线程,32GB,2TB 7200转机械硬盘
- CentOS 7.9
- SysBench 1.0.17
网络:
- 千兆以太局域网
二、准备工作
安装SysBench
不同发行版的Linux按照官网上的说明安装即可:
Debian/Ubuntu
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench
RHEL/CentOS:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
Fedora:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo dnf -y install sysbench
验证安装成功:
sysbench --version
sysbench 1.0.17
创建测试用DB
在被测服务器上,创建一个空的专门用于性能测试的库(sbtest),以及相应的用户:
psql -h 192.168.132.167 -U postgres -W
> CREATE USER sbtest WITH PASSWORD 'password';
> CREATE DATABASE sbtest;
> GRANT ALL PRIVILEGES ON DATABASE sbtest TO sbtest;
验证从客户端能够访问到此数据库:
psql -h 192.168.132.167 -U sbtest -W -d sbtest
三、开始测试
SysBench基本用法
SysBench自带了多种数据库性能测试的场景,这些测试场景的名称(testname)列表可以在/usr/share/sysbench/
目录下找到,包括bulk_insert
, oltp_delete
, oltp_insert
, oltp_point_select
, oltp_read_only
, oltp_read_write
, oltp_update_index
, oltp_update_non_index
, oltp_write_only
, select_random_points
和select_random_ranges
,从名字可以大致猜测出所代表的场景,例如oltp_read_write
代表综合读写的场景,oltp_write_only
代表只读的场景。
SysBench执行命令的统一格式是:
sysbench [options]... [testname] [command]
其中testname就是上面列出的测试名称,每个不同的testname有自己的command,但大多数支持的command都是prepare
、run
和cleanup
。当然我们一般还需要填写options来指定如数据库地址、数据库密码等信息。
下面以oltp_read_write
场景为例,介绍最经常使用的几个命令。
准备测试数据(prepare)
prepare的作用是向目标数据库里插入一些随机数据,作为后面真正的测试的数据环境。下面的命令在目标数据库里创建12张表,每张表里添加10万行随机数据:
sysbench oltp_read_write \
--db-driver=pgsql --pgsql-host=192.168.132.167 --pgsql-port=5432 \
--pgsql-user=sbtest --pgsql-password=password --pgsql-db=sbtest \
--table_size=100000 --tables=12 \
prepare
执行测试(run)
下面的命令执行实际的测试:
sysbench oltp_read_write \
--db-driver=pgsql --pgsql-host=192.168.132.167 --pgsql-port=5432 \
--pgsql-user=sbtest --pgsql-password=password --pgsql-db=sbtest \
--report-interval=5 \
--table_size=100000 --tables=12 \
--threads=32 \
--time=30 --warmup-time=10 \
run
其中time参数规定了测试执行的时长(30秒),warmup-time参数规定了测试前预热阶段的时长(10秒),threads参数规定了客户端并发请求的线程数量(32线程)。
测试启动后,屏幕上会按指定时间间隔输出当前性能指标:
[ 5s ] thds: 32 tps: 217.41 qps: 4476.39 (r/w/o: 3138.93/895.24/442.22) lat (ms,95%): 467.30 err/s: 0.40 reconn/s: 0.00
[ 10s ] thds: 32 tps: 221.21 qps: 4380.99 (r/w/o: 3076.74/861.64/442.62) lat (ms,95%): 530.08 err/s: 0.00 reconn/s: 0.00
[ 15s ] thds: 32 tps: 301.40 qps: 6071.88 (r/w/o: 4239.86/1229.02/603.01) lat (ms,95%): 297.92 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 32 tps: 262.78 qps: 5180.49 (r/w/o: 3626.58/1027.94/525.97) lat (ms,95%): 344.08 err/s: 0.20 reconn/s: 0.00
[ 25s ] thds: 32 tps: 186.81 qps: 3813.27 (r/w/o: 2673.39/765.05/374.83) lat (ms,95%): 590.56 err/s: 0.40 reconn/s: 0.00
[ 30s ] thds: 32 tps: 318.79 qps: 6382.66 (r/w/o: 4466.10/1278.17/638.39) lat (ms,95%): 227.40 err/s: 0.20 reconn/s: 0.00
测试结束后,会输出汇总指标报告:
SQL statistics:
queries performed:
read: 106134
write: 30305
other: 15169
total: 151608
transactions: 7575 (252.30 per sec.)
queries: 151608 (5049.62 per sec.)
ignored errors: 6 (0.20 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 30.0216s
total number of events: 7575
Latency (ms):
min: 9.55
avg: 126.79
max: 1051.62
95th percentile: 369.77
sum: 960450.42
Threads fairness:
events (avg/stddev): 236.7188/3.16
execution time (avg/stddev): 30.0141/0.00
清除测试数据
要清除前面执行测试产生的数据,执行下面的命令:
sysbench oltp_read_write \
--db-driver=pgsql --pgsql-host=192.168.132.167 --pgsql-port=5432 \
--pgsql-user=sbtest --pgsql-password=password --pgsql-db=sbtest \
--tables=12 \
注意tables参数需要手工指定并且与prepare时一致,否则下次prepare可能会报错table已存在。
四、参考资料
- https://github.com/akopytov/sysbench
- https://severalnines.com/blog/how-benchmark-postgresql-performance-using-sysbench/
- https://blog.csdn.net/zhizhengguan/article/details/88345192
请保留原始链接:https://bjzhanghao.com/p/3198