Sysbench0.5初体験
21031 ワード
最近の仕事ではデータベースのOLT Pの性能をテストする必要があります.MariaDBのbenchmarkのテストスクリプトを参考にしてみると、スクリプトにはSysbench-0.5が使われていることがわかりました.ここでhttps://launchpad.net/sysbenchでtrunkを引き下げることができます.これが伝説の0.5バージョンです.
ここでは、testパラメータの値が変化していることがわかります.以前のバージョンでは、--testは次のように値を取りました.
新しいバージョンのtestの値はluaスクリプトです.test/db/下にどのスクリプトがあるか見てみましょう.
これらのスクリプトの大部分はtestの値として使用できます.これは、新しいバージョンが以前のバージョンとは異なる最大の違いであり、luaスクリプトを自分で定義することができます.
sysbenchのコードを修正する必要がなく、カスタマイズされたテストを行い、再コンパイルしてテストを行います.
まずcommonを見てみましょうlua、このファイルはテストファイルではなくprepareとcleanupに使用され、もちろんパラメータの読み取りも含まれています.
まず、このスクリプトのprepareを見てみましょう.
prepare関数呼び出しcreate_Insert関数を使用して、テーブルを作成し、データを挿入します.cleanup関数は、以下に示すDROP TABLEに使用されます.
次はoltpを見てみましょう.luaファイル、この中に2つの関数があります.1つの初期化関数:thread_init、各スレッドを初期化するためのパラメータ
この初期化関数は主にcommonを呼び出す.luaの中のset_vars関数は、oltpに関連するパラメータ、例えばoltp_を初期化します.range_size,oltp_sum_rangesなど、
これらのパラメータはすべてT(Transaction)の中の文のタイプと個数を制御するために使用されます.いわゆるTPS値の高低もこれらの値と関係があり、1つのTの文が少ないほど簡単になり、
TPSの値が高いほど、逆に、Tの中に文が多く、文が複雑であれば、TPSは必然的に低下します.各トランザクションが実行する文を具体的に見てみましょう.これが関数eventが行うことです.
この関数の典型的なコードを見てみましょう.
oltp_によるとskip_trxは、トランザクションを有効にするかどうかを決定し、oltp_に基づいてpoint_selectsはポイントクエリ文の個数を決定し、oltp_simple_rangesは、範囲クエリ文の個数を決定します.
デフォルトのsysbenchはprepareのときに使用される複数行挿入ですが、私のテストでは、初期化を完了するために単行挿入を使用する必要があります.
ここではcommonが必要ですluaのcreate_Insert関数を変更します.パラメータoltp_を追加する必要がありますbulk_複数行挿入を使用するかどうかを決定するためにinsertを使用します.
同時に対応するINSERT文を修正する必要があり、以下のpatchを見ると一目瞭然です.
Sysbench-0.5はスクリプトを使用してテスト文を決定し、以前コードにデッドテストを書くよりもユーザーの修正と使用を便利にし、ソースプログラムを修正する必要はなく、対応するluaスクリプトを修正するだけで、
異なるテスト例をカスタマイズすることができて、本当にいいですね.
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は次のように値を取りました.
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を見てみましょう.
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に使用されます.
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ファイル、この中に2つの関数があります.1つの初期化関数: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値の高低もこれらの値と関係があり、1つの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_rangesは、範囲クエリ文の個数を決定します.
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スクリプトを修正するだけで、
異なるテスト例をカスタマイズすることができて、本当にいいですね.