Sysbench0.5初體驗

最近工做中須要測試數據庫的OLTP的性能,參考了下MariaDB的benchmark中的測試腳本,發現腳本中已經使用了Sysbench-0.5,能夠在這裏https://launchpad.net/sysbench 拉下來trunk,這就是傳說中的0.5版本。mysql

 

1. 編譯安裝

 1 Shell>pwd
 2 
 3 /home/nocode
 4 
 5 Shell> bzr branch lp:~sysbench-developers/sysbench/0.5  sysbench
 6 
 7 Shell> cd sysbench
 8 
 9 Shell> ./autogen.sh
10 
11 Shell> ./configure
12 
13 Shell> make
14 
15 Shell> sudo make install

 

2. 使用

1 Shell>pwd
2 
3 /home/nocode/sysbench/sysbench
4 
5 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
6 
7 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
8 
9 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取值以下sql

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腳本,dom

進行定製化的測試,而不須要去修改sysbench的代碼,從新編譯再進行測試。函數

咱們首先看下common.lua,這個文件並不是是測試文件,而是用於prepare和cleanup,固然還包括參數的讀取。性能

先看下一下這個腳本里面的prepare:測試

 1 function prepare()
 2 local query
 3 local i
 4 local j
 5 
 6 set_vars()
 7 
 8 db_connect()
 9 for i = 1,oltp_tables_count do
10 create_insert(i)
11 end
12 
13 return 0
14 end

 

prepare函數調用create_insert函數來建立表並插入數據。cleanup函數用來DROP TABLE,以下所示。lua

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,用於初始化每一個線程的參數spa

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等等,.net

這些參數都是用來控制一個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腳本,

便可定製不一樣的測試用例,真心不錯。

相關文章
相關標籤/搜索