【巨杉数据库SequoiaDB】巨杉Tech | 分布式数据库Sysbench测试最佳实践
引言
作为一名DBA,时常需要对某些数据库进行一些基准测试,进而掌握数据库的性能情况。本文就针对sysbench展开介绍,帮助大家了解sysbench的一般使用方法。
sysbench简介
什么是基准线测试
所谓基准测试,就是通过对数据库的性能指标进行定量的、可重复的和可对比的测试。基准线测试可以理解为一种针对系统的压力测试。但该测试并不关心业务逻辑,因此测试相对简单和直接。通过测试可分析在当前配置下(包括硬件配置,OS,及数据库参数设置等)应用的性能表现,实现不同应用之间的比较。
具体而言,可以使用如下指标来进行比对:
TPS/QPS:衡量数据库的吞吐量;
响应时间:包括平均响应时间,最小响应时间以及不同百分位数的响应时间(如p90,p95);
并发量: 同时处理请求的数量。
sysbench介绍
sysbench是开源的,基于LuaJIT框架,可自定义脚本的多线程基准线测试工具。
sysbench下载链接:https://github.com/akopytov/sysbench
该工具可进行如下方面的测试:
数据库性能测试(OLTP基准线测试)
CPU运算性能测试
磁盘IO性能测试
内存分配及传输速度测试
POSIX线程性能测试
sysbench 安装
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的命令格式如下:
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) 每秒事务处理量,是一个表达系统处理能力的性能指标,每秒处理的消息数
CPU测试
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测试
如下命令可以查看I/O测试选项:
/sysbench fileion help
在众多参数中常用到的一些参数为:
--file-num: 创建的文件数,默认为128个,如果想测试io的最大性能,该参数需设置为1
--file-total-size: 每个文件的大小,默认是2GB
--file-io-mode: 文件测试模式,包含seqwr(顺序写)、seqrewr(顺序读写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)、rndrw(随机读写)
sysbench测试磁盘I/O测试主要分为三步:
Step1:准备数据
./sysbench fileio --file-num=1 --file-total-size=2G --file-test-mode=rndrw prepare
此时在当前目录下sysbench会产生一些用于测试的文件。
Step2:测试速度
./sysbench fileio --file-num=1 --file-total-size=2G --file-test-mode=rndrw run
Step3: 删除文件
./sysbench fileio --file-num=1 --file-total-size=2G --file-test-mode=rndrw cleanup
结果分析: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来测试内存访问的性能。
首先来看一下测试内存有哪些选项。
./sysbench memory help
常用选项为:
--memory-block-size: 测试时使用的内存块大小,默认为1K。实际测试建议使用1M
--memory-total-size: 测试时使用的的数据总大小
--memory-oper: 内存操作类型。{read, write, none} 默认是write
--memory-access-mode: 指定内存访问方式,seq: 为顺序访问,rnd:为随机访问
内存测试相对简单,用户只需确定好参数直接执行即可。
./sysbench memory --memory-block-size=1M --memory-total-size=100G --threads=1 --memory-access-mode=rnd run
结果分析:
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的一些常用方法做了介绍,并重点对其内置的测试方法进行了用法演示,希望能对大家有所帮助。
【巨杉数据库SequoiaDB】巨杉Tech | 分布式数据库Sysbench测试最佳实践的更多相关文章
- 【巨杉数据库SequoiaDB】巨杉Tech | 分布式数据库千亿级超大表优化实践
01 引言 随着用户的增长.业务的发展,大型企业用户的业务系统的数据量越来越大,超大数据表的性能问题成为阻碍业务功能实现的一大障碍.其中,流水表作为最常见的一类超大表,是企业级用户经常碰到的性能瓶颈. ...
- 【巨杉数据库SequoiaDB】24 Hours , 数据库研发实录
出场人物: 08:10 小H,是巨杉数据库引擎研发的一名工程师.7:20 天还蒙蒙亮,小H就起床了,点亮了心爱的光剑,开始了新的一天. 在08:10时候,他已经洗漱完,锻炼好身体,倒好 ...
- springboot + aop + Lua分布式限流的最佳实践
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一.什么是限流?为什么要限流? 不知道大家有没有做过帝都的地铁, ...
- Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践
参考赵班长的unixhot以及马亮blog 笔者QQ:572891887 Linux架构交流群:471443208 1.1Mesos简介 Mesos是Apache下的开源分布式资源管理框架,它被称为分 ...
- 巨杉Tech | 使用 SequoiaDB 分布式数据库搭建JIRA流程管理系统
介绍 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域.很多企业与互联网公司都在使用Jira作为内部 ...
- 【巨杉数据库SequoiaDB】省级农信国产分布式数据库应用实践
本文转载自<金融电子化> 原文链接:https://mp.weixin.qq.com/s/WGG91Rv9QTBHPsNVPG8Z5g 随着移动互联网的迅猛发展,分布式架构在互联网IT技术 ...
- 【巨杉数据库Sequoiadb】点燃深秋,巨杉数据库亮相DTC数据技术嘉年华大会
2019年11月15日,第九届数据技术嘉年华大会在北京隆重召开,本次大会以 “开源 • 智能 • 云数据 - 自主驱动发展 创新引领未来” 为主题,探索数据价值,共论智能未来.SequoiaDB 巨 ...
- SequoiaDB巨杉数据库入门:快速搭建流媒体服务器
使用SequoiaDB的分布式文件系统搭建流媒体服务器 介绍 如今使用移动互联网的年轻人开始越来越多使用短视频展示自我,而流媒体则是支撑在线视频播放的核心技术.当我们开始构建流媒体站点时,往往面临最大 ...
- 【巨杉答疑】巨杉数据库和mongodb有什么关系吗?
哈罗,艾瑞巴蒂~巨杉答疑栏目今日上线啦! 巨杉数据库作为商业化开源软件,已经拥有大量社区用户.开源至今,大到分布式数据库原理.架构问题,小到SDB巨杉数据库的安装使用问题,大家似乎都有很多问题想要和我 ...
随机推荐
- bootstrap4网格
Bootstrap 4 网格系统有以下 5 个类: .col- 针对所有设备 .col-sm- 平板 - 屏幕宽度等于或大于 576px .col-md- 桌面显示器 - 屏幕宽度等于或大于 768p ...
- 基于webpack的vue开发环境搭建
1.新建并初始化项目(npm int -y),安装webpack,webpack-cli webpack-dev-server 安装eslint,eslint-plugin-vue,配置eslint语 ...
- 实验一 GIT 代码版本管理
实验一 GIT 代码版本管理 实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git ini ...
- SharePoint PowerShell SendEmail
前言 最近碰到这样一个需求,用户需要个简单的定时邮件提醒,就是抓取SharePoint某个列表里的值,然后作为邮件地址/邮件主题/邮件内容发送出去. 自己想了想,既然用户要求每天定时发送,那么肯定是任 ...
- Office Tool Plus - 一个OFFICE 管理、下载、安装器
文章选自我的博客:https://blog.ljyngup.com/archives/160.html/ 教程摘自官方教程. 官网:https://otp.landian.vip/zh-cn/ Off ...
- O2O外卖玩众包 开放平台难解标准之痛
开放平台难解标准之痛" title="O2O外卖玩众包 开放平台难解标准之痛"> 有一种怪现象一直是国内互联网企业摆脱不了的附骨之疽--不管规模大小,总是削尖了脑 ...
- docker配置仓库源
1 修改docker配置文件 下面的内网ip改成公司的私有仓库地址 后面两个建议保留(一个是国内加速源,一个是国外仓库.这两个删了也是可以的) 2 重启docker服务 # vim /etc/dock ...
- jdk1.7、jdk1.8兼容共存环境配置方案
前提:环境变量配置 JAVA_HOME=%JAVA_HOME8% JAVA_HOME8=E:\jdk1.8.0_40 JAVA_HOME7=E:\jdk1.7.0_51 path 一.jdk是绿色免安 ...
- 解决vue-cli使用组件报错
今天使用vue-cli,明明写的没错,都是vue-cli自动生成的,编译时怎嘛就会报错呢? 报错信息如下: 浏览器端报错: Failed to compile. ./src/components/Hi ...
- [20200103]GUID转换GUID_BASE64.txt
[20200103]GUID转换GUID_BASE64.txt --//最近在做一个项目优化,里面大量使用uuid.优缺点在链接:http://blog.itpub.net.x.y265/viewsp ...