Sysbench介绍概括总结【重要】

概念介绍

sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况,它主要包括以下几种方式的测试:磁盘io性能、数据库性能、内存分配及传输速度等,详细的介绍见https://github.com/akopytov/sysbench

它主要包括以下几种方式的测试:
  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

不同并发下的压测,找出每个测试场景的并发峰值

详细的并发下测试找峰值的方法见: https://www.cnblogs.com/syw20170419/p/16261768.html

如果想要提高写入效率,我们可以使用批量写入,这样一批写入的记录条数越多,插入效率就会越高,但需要注意的是,批量写入一条记录不能超过 48 KB,一条 SQL 语句总长度不能超过 1MB。此外,支持多线程同时写入,要注意:线程数达到一定数量后将无法再提高,甚至还会下降,因为线程频繁切换会带来额外开销。

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

prepare与run注意事项

  • prepare:主要由参数--table_size=100 --threads=5 --tables=5来决定执行完成的时间,此时--time=30是不起作用的
  • run:主要由参数--table_size=100 --threads=5 --tables=5 --time=30来决定执行完成的时间,此时最重要的是--time=30。run 30s后才会停止。因为sysbench会在30秒内不断的加压来测试数据库的性能,因此insert的数据也是不固定的

参数介绍

常用数据库选项

--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

注意事项(重要):

  1. 如果运行程序命令时,如果当前总执行时间已经达到--time选项参数值(默认10秒),不管当前已执行事件总数是否达到--events选项参数值,都会停止运行程序,所以如果需要为程序命令显示指定--events选项时,需要合理的设置--time选项参数值。
  2. 如果运行程序命令时,如果当前已执行事件总数已达到--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):   执行耗时(平均每个线程执行事件耗时/标准差)

 

 

posted @ 2022-04-14 17:47  Syw_文  阅读(1725)  评论(0编辑  收藏  举报