设为首页收藏本站

全球主机交流论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: discuz
查看: 1120|回复: 0
打印 上一主题 下一主题

压力测试工具Sysbench-0.5初体验

[复制链接]

该用户从未签到

跳转到指定楼层
楼主
发表于 2013-12-30 15:38:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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=1 –test=./tests/db/oltp.lua –oltp-table-size=1000 –oltp-tables-count=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password= –mysql-db=test prepare
Shell>./sysbench –num-threads=1 –test=./tests/db/oltp.lua –oltp-table-size=1000 –oltp-tables-count=1 –report-interval=5 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password= –mysql-db=test run
Shell>./sysbench –num-threads=1 –test=./tests/db/oltp.lua –oltp-table-size=1000 –oltp-tables-count=1 –mysql-host=127.0.0.1 –mysql-port=3306 –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 = 1,oltp_tables_count do
create_insert(i)
end
return 0
end
prepare函数调用create_insert函数来创建表并插入数据。cleanup函数用来DROP TABLE,如下所示。
function cleanup()
local i
set_vars()
for i = 1,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=1, oltp_point_selects do
rs = db_query(“SELECT c FROM “.. table_name ..” WHERE id=” .. sb_rand(1, o ltp_table_size))
end
for i=1, oltp_simple_ranges do
range_start = sb_rand(1, oltp_table_size)
rs = db_query(“SELECT c FROM “.. table_name ..” WHERE id BETWEEN ” .. rang e_start .. ” AND ” .. range_start .. “+” .. oltp_range_size – 1)
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 2013-09-12 06:51:41 +0000
@@ -25,7 +25,7 @@
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(1, oltp_table_size) .. “, ‘”.. c_val ..”‘, ‘” .. pad_val .. “‘)”)
+ if (oltp_bulk_insert) then
+ if (oltp_auto_inc) then
+ db_bulk_insert_next(“(” .. sb_rand(1, oltp_table_size) .. “, ‘”.. c_val ..”‘, ‘” .. pad_val .. “‘)”)
+ else
+ db_bulk_insert_next(“(“..j..”,” .. sb_rand(1, oltp_table_size) .. “,’”.. c_val ..”‘, ‘” .. pad_val .. “‘ )”)
+ end
else
- db_bulk_insert_next(“(“..j..”,” .. sb_rand(1, oltp_table_size) .. “,’”.. c_val ..”‘, ‘” .. pad_val .. “‘ )”)
+ if (oltp_auto_inc) then
+ db_query(“INSERT INTO sbtest” .. i .. “(k, c, pad) VALUES(” .. sb_rand(1, oltp_table_size) .. “, ‘”.. c_val ..”‘, ‘” .. pad_val .. “‘)”)
+ else
+ db_query(“INSERT INTO sbtest” .. i .. “(id, k, c, pad) VALUES(” ..j..”,” .. sb_rand(1, oltp_table_size) .. “, ‘”.. c_val ..”‘, ‘” .. pad_val .. “‘)”)
+ end
end
+
end
-
db_bulk_insert_done()
@@ -150,4 +162,10 @@
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脚本,即可定制不同的测试用例,真心不错。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|中国U网    

GMT+8, 2024-5-21 08:47 , Processed in 0.069603 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表