最近工做中須要測試數據庫的OLTP的性能,參考了下MariaDB的benchmark中的測試腳本,發現腳本中已經使用了Sysbench-0.5,能夠在這裏https://launchpad.net/sysbench 拉下來trunk,這就是傳說中的0.5版本。mysql
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
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
這裏能夠看出來--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來肯定範圍查詢語句的個數。
默認的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
sysbench-0.5使用腳原本決定測試語句,比以前在代碼裏寫死測試更加方便用戶修改和使用,不須要去修改源程序,只須要修改相應的lua腳本,
便可定製不一樣的測試用例,真心不錯。