引言
作为一名DBA,时常需要对某些数据库进行一些基准测试,进而掌握数据库的性能情况。本文就针对sysbench展开介绍,帮助大家了解sysbench的一般使用方法。
sysbench简介
-
什么是基准线测试
所谓基准测试,就是通过对数据库的性能指标进行定量的、可重复的和可对比的测试。基准线测试可以理解为一种针对系统的压力测试。但该测试并不关心业务逻辑,因此测试相对简单和直接。通过测试可分析在当前配置下(包括硬件配置,OS,及数据库参数设置等)应用的性能表现,实现不同应用之间的比较。
具体而言,可以使用如下指标来进行比对:
-
TPS/QPS:衡量数据库的吞吐量;
-
响应时间:包括平均响应时间,最小响应时间以及不同百分位数的响应时间(如p90,p95);
-
并发量: 同时处理请求的数量。
-
sysbench介绍
sysbench是开源的,基于LuaJIT框架,可自定义脚本的多线程基准线测试工具。
sysbench下载链接:https://github.com/akopytov/sysbench
该工具可进行如下方面的测试:
-
数据库性能测试(OLTP基准线测试)
-
CPU运算性能测试
-
磁盘IO性能测试
-
内存分配及传输速度测试
-
POSIX线程性能测试
-
sysbench 安装
1. 操作系统系统安装依赖包
Note:
如需测试数据库性能,还需要另外安装数据库相关软件,本文以mysql为例
2. 从 https://github.com/akopytov/sysbench/archive/master.zip
上下载sysbench安装包
3. 解压zip包
4. 进入被解压的文件夹,执行如下命令:
./autogen.sh
./configure --prefix=/usr/local/sysbench
--with-mysql-libs=/usr/local/mysql/lib/
--with-mysql-includes=/usr/local/mysql/include/
Note:
--prefix 参数定义 sysbench编译后安装的路径
--with-mysql-libs和--with-mysql-includes 定义的是mysql相关文件的路径
编译并安装sysbench:
-
sysbench命令介绍
sysbench的命令格式如下:
-
testname: 可以指定一个lua的脚本进行测试,或是指定关键字(fileio, cpu,memory)来使用sysbench内置的方法测试相关项目
-
command: 定义了测试需要执行的行为。下表描述了command包含的一般命令:
命令样例:
./sysbench --mysql-host=127.0.0.1 --mysql-db=sbtest --table-size=500000
--mysql-user=root --mysql-password=root
/data/sysbench1.1/share/sysbench/oltp_read_only.lua prepare
其中:
options: --mysql-host , --mysql-db, --table-size, --mysql-user, --mysql-password
testname:/data/sysbench1.1/share/sysbench/oltp_read_only.lua 脚本
command: prepare
sysbench 测试
如上所述,sysbench能针对数据库,cpu,磁盘I/O, 内存性能等方面进行基准测试。现就这几方面分别讲解。
-
数据库性能测试
当sysbench用于测试数据库性能时,可以通过使用sysbench内置相关lua脚本来快速测试数据库(另外由于sysbench支持自定义脚本,也可以自定义数据库测试脚本,自定义功能本文中不作展开)。
这些内置脚本存放在 $SYSBENCH_HOME/share/sysbench目录下,该目录下包含如下文件:
通过如下命令查看这些脚本的输入参数说明:
Note:
$SYSBENCH_HOME为sysbench的安装目录.
oltp_xxx.lua 为lua相关脚本
数据库测试主要分为三步:
Step1:连接Mysql数据库,创建相关用户并赋予相应权限
mysql> create database sbtest;
Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on sbtest.* to 'sdbadmin'@'%' identified by 'xxxxxx';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
Step2: 使用lua脚本,初始化数据库(prepare)
./sysbench --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-db=sbtest
--mysql-user=sdbadmin --mysql-password=xxxxxx --tables=10 --table_size=800000
--threads=10 --mysql_storage_engine=sequoiadb
--create_table_options="comment="sequoiadb:{table_options:{ShardingType:'hash',
ShardingKey:{id:1},Compressed:false,EnsureShardingIndex:false}}""
/data/sysbench1.1/share/sysbench/oltp_read_write.lua prepare
上述命令中--mysql_storage_engine和--create_table_options 指定了建表时使用巨杉数据库引擎创建了hash分区表。如果只是想创建普通表,去除这两个选项即可。
在此阶段sysbench按照指令创建了10张表(--tables参数指定创建表的个数),这些表均有相同的表结构,其结构如下:
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| k | int(11) | NO | MUL | 0 | |
| c | char(120) | NO | | | |
| pad | char(60) | NO | | | |
+-------+-----------+------+-----+---------+----------------+
同时每张表插入了80万条数据(--table_size参数指定了每张表的数据量)。
mysql> select count(1) from sbtest1;
+----------+
| count(1) |
+----------+
| 800000 |
+----------+
并在每张表的id列创建主键索引。k列创建b-tree索引:
+---------+------------+----------+--------------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+---------+------------+----------+--------------+-------------+
| sbtest1 | 0 | PRIMARY | 1 | id |
| sbtest1 | 1 | k_1 | 1 | k |
+---------+------------+----------+--------------+-------------+
Step3: 使用lua脚本执行测试(run)
./sysbench --mysql-host=192.168.56.101,192.168.56.102 --time=600
--report-interval=5 --mysql-port=3306 --mysql-db=sbtest --mysql-user=sdbadmin
--mysql-password=xxxxxx --tables=10 --table_size=80000 --threads=10
/data/sysbench1.1/share/sysbench/oltp_read_write.lua run > ./run.log
本次测试,连接了两个mysql数据库实例(--mysql-host参数指定了两个地址),开启了10个线程(--threads参数指定),并运行300秒(--time参数指定),每5秒打印一次报告(--report-interval)。
在真实测试环境中建议测试时间不要小于30分钟。数据表建议不低于10个,单表数据量不低于500万行,如果配备了SSD设备的话,则建议单表数据量不低于1亿行。
结果解析:
SQL statistics:
queries performed:
read: 646870 --读总数
write: 184819 --写总数
other: 1
total: 831690
transactions: 46205 (153.99 per sec.) --总事务数(每秒事务数tps)
queries: 831690 (2771.84 per sec.) –查询总数(每秒查询数qps)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
Throughput:
events/s (eps): 153.9911
time elapsed: 300.0497s
total number of events: 46205
Latency (ms):
min: 17.24 --最小耗时(毫秒)
avg: 64.93 --平均耗时(毫秒)
max: 652.50 --最大耗时(毫秒)
95th percentile: 125.52 -- 95%的操作响应耗时(毫秒)
sum: 3000048.67
Threads fairness:
events (avg/stddev): 4620.5000/20.08
execution time (avg/stddev): 300.0049/0.01
这些测试报告中,需要特别注意几项:
-
transactions中的TPS,本报告中TPS为153.99
-
queries中的QPS,本报告中的QPS为2771.84
-
95th percentile,本报告中为125.52
如还需测试别的场景,只需修改testname和options相关参数即可。
Note:
QPS: (Queries-per-second)每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
TPS: (Transaction-Per-Second) 每秒事务处理量,是一个表达系统处理能力的性能指标,每秒处理的消息数
-
CPU测试
sysbench的CPU测试,主要是通过生成特定数量的质数所需要的时间来判断CPU的性能。
这里可以通过两步来完成CPU的测试。
Step1:确认CPU的线程数
Step2: 执行CPU的测试命令
--cpu-max-prime :指定质数的个数,默认为10000
--threads:指定开启的线程数,这和第一步的cpu查询获得的cpu线程数保持一致
结果解析:
CPU speed:
events per second: 425.11
Throughput:
events/s (eps): 425.1147
time elapsed: 10.0020s
total number of events: 4252
Latency (ms):
min: 2.24
avg: 2.35
max: 17.93
95th percentile: 2.52
sum: 9994.74
Threads fairness:
events (avg/stddev): 4252.0000/0.00
execution time (avg/stddev): 9.9947/0.00 --完成计算所需要的时间(秒)
结果中的execution time为所需要关注的数据,本例中结果为 9.9947。
-
磁盘I/O测试
如下命令可以查看I/O测试选项:
在众多参数中常用到的一些参数为:
--file-num: 创建的文件数,默认为128个,如果想测试io的最大性能,该参数需设置为1
--file-total-size: 每个文件的大小,默认是2GB
--file-io-mode: 文件测试模式,包含seqwr(顺序写)、seqrewr(顺序读写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)、rndrw(随机读写)
sysbench测试磁盘I/O测试主要分为三步:
Step1:准备数据
此时在当前目录下sysbench会产生一些用于测试的文件。
Step2:测试速度
Step3: 删除文件
结果分析:Throughput:
read: IOPS=2025.48 31.65 MiB/s (33.19 MB/s)
write: IOPS=1350.32 21.10 MiB/s (22.12 MB/s)
fsync: IOPS=33.79
Latency (ms):
min: 0.00
avg: 0.29
max: 19.59
95th percentile: 0.87
sum: 9950.40
这里需要关注的是读写的IOPS,以及fsync。IOPS值越高说明,磁盘读写越快。
Note:
IOPS(Input/OutputOperations Per Second)是一个用于定义存储设备性能的指标,可以视为是每秒的读写次数。
fsync把所有已修改的内容已经正确同步到硬盘上,该调用会阻塞等待直到设备报告IO完成
-
内存测试
当testname指定为memory时,用户可以使用sysbench来测试内存访问的性能。
首先来看一下测试内存有哪些选项。
常用选项为:
--memory-block-size: 测试时使用的内存块大小,默认为1K。实际测试建议使用1M
--memory-total-size: 测试时使用的的数据总大小
--memory-oper: 内存操作类型。{read, write, none} 默认是write
--memory-access-mode: 指定内存访问方式,seq: 为顺序访问,rnd:为随机访问
内存测试相对简单,用户只需确定好参数直接执行即可。
结果分析:
Throughput:
events/s (eps): 362.1440
time elapsed: 10.0015s
total number of events: 3622
Latency (ms):
min: 2.22
avg: 2.76
max: 6.31
95th percentile: 3.02
sum: 9995.78
Threads fairness:
events (avg/stddev): 3622.0000/0.00
execution time (avg/stddev): 9.9958/0.00
测试结果可以关注Throughput里的几项:eps, time elapsed 和 total number of events
本文对内存的写进行了测试,如果比较关注读性能(数据库中主从分离后,从库对读性能要求较高),可以修改参数memory-oper为read,进行测试。
总结
总体来说sysbench是一款功能比较丰富的基准线测试工具。日常工作中较常使用的是数据库oltp能力的测试功能。本文就sysbench的一些常用方法做了介绍,并重点对其内置的测试方法进行了用法演示,希望能对大家有所帮助。