Sysbench0.5初体验
最近工作中需要测试数据库的OLTP的性能,参考了下MariaDB的benchmark中的测试脚本,发现脚本中已经使用了Sysbench-0.5,可以在这里https://launchpad.net/sysbench 拉下来trunk,这就是传说中的0.5版本。
1. 编译安装
Shell>pwd /home/nocode Shell> bzr branch lp:~sysbench-developers/sysbench/0.5 sysbench Shell> cd sysbench Shell> ./autogen.sh Shell> ./configure Shell> make Shell> sudo make install
2. 使用
Shell>pwd /home/nocode/sysbench/sysbench Shell>./sysbench --num-threads= --test=./tests/db/oltp.lua --oltp-table-size= --oltp-tables-count= --mysql-host=127.0.0.1 --mysql-port= --mysql-user=root --mysql-password= --mysql-db=test prepare Shell>./sysbench --num-threads= --test=./tests/db/oltp.lua --oltp-table-size= --oltp-tables-count= --report-interval= --mysql-host=127.0.0.1 --mysql-port= --mysql-user=root --mysql-password= --mysql-db=test run Shell>./sysbench --num-threads= --test=./tests/db/oltp.lua --oltp-table-size= --oltp-tables-count= --mysql-host=127.0.0.1 --mysql-port= --mysql-user=root --mysql-password= --mysql-db=test cleanup
3. Sysbench分析
这里可以看出来--test参数的值有所变化,在之前的版本,--test取值如下
Compiled-in tests:
fileio - File I/O test
cpu - CPU performance test
memory - Memory functions speed test
threads - Threads subsystem performance test
mutex - Mutex performance test
oltp - OLTP test
新版本的test的取值是lua脚本,我们看下test/db/下都有哪些脚本:
Shell>ls
common.lua Makefile.am parallel_prepare.lua update_index.lua
delete.lua Makefile.in select.lua update_non_index.lua
insert.lua oltp.lua select_random_points.lua
Makefile oltp_simple.lua select_random_ranges.lua
这些脚本大部分都是可以作为test的取值的,这就是新版本有别于之前版本的最大区别,我们可以自己定义lua脚本,
进行定制化的测试,而不需要去修改sysbench的代码,重新编译再进行测试。
我们首先看下common.lua,这个文件并非是测试文件,而是用于prepare和cleanup,当然还包括参数的读取。
先看下一下这个脚本里面的prepare:
function prepare()
local query
local i
local j set_vars() db_connect()
for i = ,oltp_tables_count do
create_insert(i)
end return
end
prepare函数调用create_insert函数来创建表并插入数据。cleanup函数用来DROP TABLE,如下所示。
function cleanup()
local i set_vars() for i = ,oltp_tables_count do
print("Dropping table 'sbtest" .. i .. "'...")
db_query("DROP TABLE sbtest".. i )
end
end
下面我们看下oltp.lua文件,这里面有两个函数,一个初始化函数:thread_init,用于初始化每个线程的参数
function thread_init(thread_id)
set_vars() if (db_driver == "mysql" and mysql_table_engine == "myisam") then
begin_query = "LOCK TABLES sbtest WRITE"
commit_query = "UNLOCK TABLES"
else
begin_query = "BEGIN"
commit_query = "COMMIT"
end end
这个初始化函数主要是调用了common.lua里面的set_vars函数,来初始化oltp相关的参数,如oltp_range_size,oltp_sum_ranges等等,
这些参数都是用来控制一个T(Transaction)里面语句的类型和个数的。所谓的TPS值的高低也和这些值有关系,一个T的语句越少,越简单,
TPS的值就会越高,相反,如果一个T里面语句多,语句复杂,那么TPS必然降低。我们来具体看下每个事务执行哪些语句,这就是函数event做的事情。
我们看下这个函数里面的典型代码:
if not oltp_skip_trx then
db_query(begin_query)
end for i=, oltp_point_selects do
rs = db_query("SELECT c FROM ".. table_name .." WHERE id=" .. sb_rand(, o ltp_table_size))
end for i=, oltp_simple_ranges do
range_start = sb_rand(, oltp_table_size)
rs = db_query("SELECT c FROM ".. table_name .." WHERE id BETWEEN " .. rang e_start .. " AND " .. range_start .. "+" .. oltp_range_size - )
end
根据oltp_skip_trx来决定是否启用事务,然后根据oltp_point_selects来决定点查询语句的个数,oltp_simple_rannges来确定范围查询语句的个数。
4. 定制脚本
默认的sysbench在prepare的时候是使用的多行插入,而我的测试需要使用单行插入来完成初始化。
故这里需要对common.lua中的create_insert函数进行修改。需要添加一个参数oltp_bulk_insert来决定是否使用多行插入,
同时需要修改相应的INSERT语句,看下面的patch就一目了然了。
Shell>bzr diff
=== modified file 'sysbench/tests/db/common.lua'
--- sysbench/tests/db/common.lua 2011-12-01 19:43:29 +0000
+++ sysbench/tests/db/common.lua -- :: +
@@ -, +, @@
CREATE TABLE sbtest]] .. i .. [[ (
id INTEGER UNSIGNED NOT NULL ]] ..
((oltp_auto_inc and "AUTO_INCREMENT") or "") .. [[,
-k INTEGER UNSIGNED DEFAULT '0' NOT NULL,
+k INTEGER UNSIGNED DEFAULT '0' NOT NULL, KEY(k),
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
]] .. index_name .. [[ (id)
@@ -58,14 +58,18 @@ db_query(query) - db_query("CREATE INDEX k_" .. i .. " on sbtest" .. i .. "(k)")
+ if (db_driver ~= "mysql") then
+ db_query("CREATE INDEX k_" .. i .. " on sbtest" .. i .. "(k)")
+ end print("Inserting " .. oltp_table_size .. " records into 'sbtest" .. i .. "'") - if (oltp_auto_inc) then
- db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(k, c, pad) VALUES")
- else
- db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(id, k, c, pad) VALUES")
+ if (oltp_bulk_insert) then
+ if (oltp_auto_inc) then
+ db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(k, c, pad) VALUES")
+ else
+ db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(id, k, c, pad) VALUES")
+ end
end local c_val
@@ -79,13 +83,21 @@
pad_val = sb_rand_str([[
###########-###########-###########-###########-###########]]) - if (oltp_auto_inc) then
- db_bulk_insert_next("(" .. sb_rand(, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
+ if (oltp_bulk_insert) then
+ if (oltp_auto_inc) then
+ db_bulk_insert_next("(" .. sb_rand(, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
+ else
+ db_bulk_insert_next("("..j.."," .. sb_rand(, oltp_table_size) .. ",'".. c_val .."', '" .. pad_val .. "' )")
+ end
else
- db_bulk_insert_next("("..j.."," .. sb_rand(, oltp_table_size) .. ",'".. c_val .."', '" .. pad_val .. "' )")
+ if (oltp_auto_inc) then
+ db_query("INSERT INTO sbtest" .. i .. "(k, c, pad) VALUES(" .. sb_rand(, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
+ else
+ db_query("INSERT INTO sbtest" .. i .. "(id, k, c, pad) VALUES(" ..j.."," .. sb_rand(, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
+ end
end
+
end
-
db_bulk_insert_done()
@@ -, +, @@
oltp_skip_trx = false
end + if (oltp_bulk_insert == 'off') then
+ oltp_bulk_insert = false
+ else
+ oltp_bulk_insert = true
+ end
+
end
5. 小结
sysbench-0.5使用脚本来决定测试语句,比之前在代码里写死测试更加方便用户修改和使用,不需要去修改源程序,只需要修改相应的lua脚本,
即可定制不同的测试用例,真心不错。
Sysbench0.5初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
随机推荐
- PAT 1079 延迟的回文数(代码+思路)
1079 延迟的回文数(20 分) 给定一个 k+1 位的正整数 N,写成 ak⋯a1a0 的形式,其中对所有 i 有 0≤ai<10 且 ak>0.N 被称 ...
- Luogu 3959 [NOIP2017] 宝藏
NOIP2017最后一道题 挺难想的状压dp. 受到深度的条件限制,所以一般的状态设计带有后效性,这时候考虑把深度作为一维,这样子可以保证所有状态不重复计算一遍. 神仙预处理:先处理出一个点连到一个集 ...
- 05 Maven 生命周期和插件
Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...
- msys2 设置home路径为windows用户路径
1配置/etc/nsswitch.conf db_home: windows 2(可不配)增加windows环境变量HOME为%USERPROFILE% 3(可不配)ssh默认仍使用msys中的hom ...
- 关于对象的 width offsetwidth availWidth scrollHeight
别人总结的.自己记不住,所以留着 了 offsetWidth 包含了对象的边线的宽度width 若你不在html 代码里明确指定这个值,那它的返回值会不一样,如果设置了width 则一样. widht ...
- java--多线程编程简介
1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...
- SharedPreferences的基本使用-----存,删,改,查
1.创建一个SharedPreferences对象 SharedPreferences spf = context.getSharedPreferences("imageload" ...
- 2018.10.19 bzoj1057: [ZJOI2007]棋盘制作(悬线法)
传送门 悬线法板题. 如果只求最大矩形面积那么跟玉蟾宫是一道题. 现在要求最大正方形面积. 所以每次更新最大矩形面积时用矩形宽的平方更新一下正方形答案就行了. 代码: #include<bits ...
- ZUFE2389: Occult的卡片升级计划(DP) 2016-05-17 23:12 113人阅读 评论(0) 收藏
2389: Occult的卡片升级计划 Description Occult喜欢玩一款手游,手游中有很多好看的卡片.他想要升级这些卡. 现在他有m块经验石,目标是强化一张卡片,卡片最开始的时候是0级, ...
- HDU1253 胜利大逃亡(BFS) 2016-07-24 13:41 67人阅读 评论(0) 收藏
胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示 ...