概念介绍
sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况,它主要包括以下几种方式的测试:磁盘io性能、数据库性能、内存分配及传输速度等,详细的介绍见https://github.com/akopytov/sysbench
它主要包括以下几种方式的测试:
1、cpu性能
2、磁盘io性能
3、调度程序性能
4、内存分配及传输速度
5、POSIX线程性能
6、数据库性能(OLTP基准测试)
目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库
1、cpu性能
2、磁盘io性能
3、调度程序性能
4、内存分配及传输速度
5、POSIX线程性能
6、数据库性能(OLTP基准测试)
目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库
以下主要介绍对于OLTP的测试使用,基于sysbench 1.0.18版本
下载安装
unbun安装方法,centos的安装详见:https://github.com/akopytov/sysbench#debianubuntu 注意查看【从二进制包安装】
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench
检查安装是否成功
sysbench --version
安装后检查脚本存放路径
/usr/share/doc/sysbench/ #存放着各种脚本
想要看其他安装的路径,使用如下方式
whereis sysbench
(注)得出的结果为:sysbench: /usr/bin/sysbench /usr/share/sysbench /usr/share/man/man1/sysbench.1.gz /usr/share/doc/sysbench/
支持的脚本
bulk_insert.lua* oltp_000.lua oltp_common.lua oltp_delete.lua* oltp_insert.lua* oltp_point_select.lua* oltp_read_only.lua* oltp_read_write.lua* oltp_update_index.lua* oltp_update_non_index.lua* oltp_write_only.lua* select_random_points.lua* select_random_ranges.lua*
测试语法
--point_selects:主键等值查询 SELECT c FROM sbtest%u WHERE id=? -- simple_ranges:简单范围查询(主键range) SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? -- sum_ranges:范围求和(简单范围查询的基础上做sum) SELECT SUM(k) FROM sbtest%u WHERE id BETWEEN ? AND ? -- order_ranges:简单范围查询(主键range的基础上做排序) SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c -- distinct_ranges:去重范围查询(主键range + 排序 + 去重) SELECT DISTINCT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c -- index_updates:索引更新操作 UPDATE sbtest%u SET k=k+1 WHERE id=? -- non_index_updates:非索引更新 UPDATE sbtest%u SET c=? WHERE id=? -- deletes:删除操作 DELETE FROM sbtest%u WHERE id=? -- inserts:插入操作 INSERT INTO sbtest%u (id, k, c, pad) VALUES (?, ?, ?, ?)
性能指标
标准的性能指标
TPS:每秒执行事务数TPS(Transactions Per Second),数据库每秒执行的事务数,以COMMIT成功次数为准
- SysBench标准OLTP读写混合场景中一个事务包含18个读写SQL。
- SysBench标准OLTP只读场景中一个事务包含14个读SQL(10条主键点查询、4条范围查询)。
- SysBench标准OLTP只写场景中一个事务包含4个写SQL(2条UPDATE、1条DETELE、1条INSERT)
QPS:每秒执行请求数QPS(Queries Per Second),数据库每秒执行的SQL数,包含INSERT、SELECT、UPDATE、DETELE、COMMIT等。
Latency (ms):95th percentile
不同场景的性能指标
读写场景压测
- TPS:对应测试结果的transactions(xx per sec)
- QPS:对应测试结果的queries
- 数据库读写时每秒执行的SQL数(含insert、select、update)
- 响应时间(RT):对应Latency(ms)的95th percentile
只读场景压测
- QPS:对应测试结果的queries
- 数据库只读时每秒执行的SQL数(仅包含select)
- 响应时间(RT):对应Latency(ms)的95th percentile
只写场景压测
- TPS:对应测试结果的transactions
- 响应时间(RT):对应Latency(ms)的95th percentile
insert等其他场景创建表的SQL
Create Table `sbtest2` ( `id` bigint NOT NULL AUTO_INCREMENT, `k` int NOT NULL DEFAULT '0', `c` varchar NOT NULL DEFAULT '', `pad` varchar NOT NULL DEFAULT '', primary key (id) ) DISTRIBUTE BY HASH(`id`) INDEX_ALL='Y'
bulk insert的建表SQL
Create Table `sbtest1` ( `id` int NOT NULL, `k` int NOT NULL DEFAULT '0', primary key (id) ) DISTRIBUTE BY HASH(`id`) INDEX_ALL='Y'
测试的步骤
prepare:测试前准备工作(生成测试需要的数据);
run:进行性能测试
cleanup:测试后删掉测试数据
说明:每个不同类型的测试均按照如上的步骤进行执行,避免上次的测试结果会影响到下一次的执行,示例:执行oltp_insert的测试,想要测试3遍计算得出平均值,那么如上的测试步骤需要分别执行3次。
执行脚本(insert示例)
注意:每个不同类型的测试,给定的参数不一样,一定要注意检查,每个不同类型具体怎么测试,会在后面的文章中进行详细解释
##准备数据 sysbench /usr/share/sysbench/oltp_insert.lua --tables=5 --table_size=100 --mysql-host=192.168.30.118 --mysql-port=3001 --mysql-db=syw_sysbench --mysql-user=kepler --mysql-password=afdd0b4ad2ec172c586e2150770fbf9e prepare ##运行测试 sysbench /usr/share/sysbench/oltp_insert.lua --tables=5 --table_size=100 --threads=5 --mysql-host=192.168.30.118 --mysql-port=3001 --mysql-db=syw_sysbench --mysql-user=kepler --mysql-password=afdd0b4ad2ec172c586e2150770fbf9e --create_secondary=off --time=30 --report-interval=3 run ##清理数据 sysbench /usr/share/sysbench/oltp_insert.lua --tables=5 --table_size=100 --threads=5 --mysql-host=192.168.30.118 --mysql-port=3001 --mysql-db=syw_sysbench --mysql-user=kepler --mysql-password=afdd0b4ad2ec172c586e2150770fbf9e --create_secondary=off --time=30 --report-interval=3 cleanup
参数介绍
常用数据库选项
--db-driver=STRING 设置程序使用的数据库驱动。默认值 mysql
常用mysql选项
--mysql-host=host mysql服务主机地址 默认localhost --mysql-port=3306 mysql服务端口 默认值 3306 --mysql-user=STRING mysql用户名称 默认值 sbtest --mysql-password=STRING mysql密码,默认值 [] --mysql-db=STRING mysql数据库名称 默认 sbtest
常用一般命令选项
--threads 需要创建的worker线程数量 默认值 1 --events=N 设置期望执行的事件总数。0表示不限制 默认值 0 --time=N 设置总执行时间,单位秒。0表示不限制。 默认值 10 --forced-shutdown=STRING 超过--time限制后,关闭程序之前需要等待的秒数,如果设置为off则表示不启用。 默认值 off --rate=N 平均事务速率。 0表示不限制。默认值 0 --report-interval=N 设置定期报告中间统计的时间间隔为N,单位为秒 。 0表示不设置。默认值 0
注意事项(重要):
- 如果运行程序命令时,如果当前总执行时间已经达到
--time
选项参数值(默认10秒),不管当前已执行事件总数是否达到--events
选项参数值,都会停止运行程序,所以如果需要为程序命令显示指定--events
选项时,需要合理的设置--time
选项参数值。 - 如果运行程序命令时,如果当前已执行事件总数已达到
--events
选项参数值,不管当前总执行时间是否达到--time
选项参数值,都会停止测试
常用日志选项
--verbosity=N 日志详细级别 {5 - debug, 0 - 仅critical messages} 默认值 3 --percentile=N 延时统计(latency statistics)中,需要计算的百分比 (1-100)。设置为0表示禁用百分比值计算。 Use the special
sysbench oltp_insert help参数选项
注:想看其他的参数选项,语法为:sysbench XXX help,自己想看的参数替换掉xxx即可
--auto_inc[=on|off] id列默认自增,默认[on]
--create_secondary[=on|off] 索引不是主键索引而是二级索引,默认[off]
--delete_inserts=N 每个事务的delete、insert的组合数,默认[1]
--distinct_ranges=N 单个事务中执行范围distinct查询的数量,默认[1]
--index_updates=N 单个事务中执行索引更新的操作的数量,默认[1]
--mysql_storage_engine=STRING mysql的存储引擎,默认是[innodb]
--non_index_updates=N 单个事务中执行索引更新的操作的数量,默认[1]
--order_ranges=N 单个事务中执行范围order by查询的数量,默认[1]
--pgsql_variant=STRING 在运行pgsql的驱动程序时,使用了pgsql的变体,当前仅仅支持的variant是'redshift',当启动时,
将自动禁用create_secondary为不可用,并将delete_insert设置为0
--point_selects=N 单个事务中select查询的数量,默认 [10]
--range_selects[=on|off] 启用/禁用所有SELECT查询[on]
--secondary[=on|off] 使用二级索引代替逐渐,默认[off]
--range_size=N 查询范围。默认是100
--simple_ranges=N 每个事务的简单查询范围select,默认[1]
--skip_trx[=on|off] 语句以bigin/commit开始结尾,默认[off]
--sum_ranges=N 每个事务的select sum的查询总量,默认[1]
--table_size=N 指定表的记录大小(行的数量),默认[10000]
--tables=N 创建的表数量,默认[1]
测试结果解读
sysbench 1.0.18: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 8 Report intermediate results every 10 second(s) Random number generator seed is 0 and will be ignored Threads started! -- 每10秒钟报告一次测试结果,tps、每秒读、每秒写、99%以上的响应时长统计,此部分的内容来自于参数:--report-interval=10 [ 10s] threads: 8, tps: 1111.51, reads/s: 15568.42, writes/s: 4446.13, response time: 9.95ms (99%) [ 20s] threads: 8, tps: 1121.90, reads/s: 15709.62, writes/s: 4487.80, response time: 9.78ms (99%) [ 30s] threads: 8, tps: 1120.00, reads/s: 15679.10, writes/s: 4480.20, response time: 9.84ms (99%) [ 40s] threads: 8, tps: 1114.20, reads/s: 15599.39, writes/s: 4456.30, response time: 9.90ms (99%) [ 50s] threads: 8, tps: 1114.00, reads/s: 15593.60, writes/s: 4456.70, response time: 9.84ms (99%) [ 60s] threads: 8, tps: 1119.30, reads/s: 15671.60, writes/s: 4476.50, response time: 9.99ms (99%) SQL statistics: queries performed: 执行的SQL查询: read: 读请求次数 write: 写请求次数 other: 其它请求次数 total: 总请求次数 transactions: 执行的事务总数 (每秒事务数.) queries: 执行的查询总次数 (每秒查询次数.) ignored errors: 忽略错误数 (每秒忽略错误次数.) reconnects: 数据库重连次数 (每秒重连次数.) General statistics: total time: 总运行时间,以秒为单位 total number of events: 总执行事件数 Latency(毫秒为单位): min: 最小请求响应时间 avg: 平均请求响应时间 max: 最大请求响应时间 95th percentile: 95%的请求响应时间 sum: 总请求响应时间 Threads fairness: events (avg/stddev): 执行的事件总数(平均每个线程执行的事件总数/标准差) execution time (avg/stddev): 执行耗时(平均每个线程执行事件耗时/标准差)