引言
作为一名DBA,时常需要对某些数据库进行一些基准测试,进而掌握数据库的性能情况。本文就针对sysbench展开介绍,帮助大家了解sysbench的一般使用方法。
sysbench简介
所谓基准测试,就是通过对数据库的性能指标进行定量的、可重复的和可对比的测试。基准线测试可以理解为一种针对系统的压力测试。但该测试并不关心业务逻辑,因此测试相对简单和直接。通过测试可分析在当前配置下(包括硬件配置,OS,及数据库参数设置等)应用的性能表现,实现不同应用之间的比较。
具体而言,可以使用如下指标来进行比对:
TPS/QPS:衡量数据库的吞吐量;
响应时间:包括平均响应时间,最小响应时间以及不同百分位数的响应时间(如p90,p95);
并发量: 同时处理请求的数量。
sysbench介绍
sysbench是开源的,基于LuaJIT框架,可自定义脚本的多线程基准线测试工具。
sysbench下载链接:https://github.com/akopytov/sysbench
该工具可进行如下方面的测试:
数据库性能测试(OLTP基准线测试)
CPU运算性能测试
磁盘IO性能测试
内存分配及传输速度测试
POSIX线程性能测试
1. 操作系统系统安装依赖包
yum -y install make automake libtool pkgconfig libaio-devel
Note:
如需测试数据库性能,还需要另外安装数据库相关软件,本文以mysql为例
2. 从 https://github.com/akopytov/sysbench/archive/master.zip
上下载sysbench安装包
3. 解压zip包
zip master.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:
make && make install
sysbench的命令格式如下:
sysbench [options]... [testname] [command]
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目录下,该目录下包含如下文件:
通过如下命令查看这些脚本的输入参数说明:
./sysbench $SYSBENCH_HOME/share/sysbench /share/sysbench /oltp_xxxx.lua help
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) 每秒事务处理量,是一个表达系统处理能力的性能指标,每秒处理的消息数
sysbench的CPU测试,主要是通过生成特定数量的质数所需要的时间来判断CPU的性能。
这里可以通过两步来完成CPU的测试。
Step1:确认CPU的线程数
cat /proc/cpuinfo|grep processor|wc -l
Step2: 执行CPU的测试命令
./sysbench cpu --cpu-max-prime=20000 --threads=2
--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测试选项:
/sysbench fileion help