鑒於最近對OpenStack的興趣和激情,我想要確保我可以做恰當的系統效能評估。我主要開始轉向sysbench,是因為它帶來一系列豐富的針對不同層面的測試(通過 -test=option 來獲知) ,包括有:
- fileio - 檔案 I/O測試
- cpu - CPU系能測試
- memory - 記憶體功能速度測試
- threads - 線程子系統系能測試
- mutex - 互斥效能測試
正如你所看到的的,sysbench將讓你的心思著重放在你的硬體和基礎架構的許多基礎組件上,例如你的磁碟子系統,以及你的CPUs和記憶體。有一個額外的選項,是用來執行對MySQL的類比壓力測試,並且當我在0.5版本中沒有看到以上的所提到的可支援測試項時候,我很驚訝,儘管它可以用來顯示“聯機交易處理 – 聯機交易處理測試”。-test=oltp到底怎麼回事??
這個列表來自於sysbench最近的發布版本0.5——如果你僅僅是在這個版本上使用它,使用 Frederic Descamps(感謝lefred!)所提供的 包。如果你用的(系統)是EPEL,Ubuntu 14.04 或者 Debian 7,就可以使用0.4.12版本(檢查sysbench的版本 -version)。那麼,測試類型OLTP再也不會出現。這個版本做了什麼呢?我使勁撓頭,直到我詢問Percona IRC才知道在0.5版本裡的標準OLTP測試類型被替換成了不一樣的文法,它使用傳遞參數到sysbench,替換掉了引用指令碼寫入lua的方式。它的優點是,現在你有了一個介面,可以寫入你特定的負載測試中(提供你瞭解的lua(介面),用起來也不難)。如果你還想要運行預定義負載測試,它們還是存在的,但是你必須把它們作為RPM的一部分去安裝,或者直接拷貝到你的系統。
幸運的是,如果你使用lefred提供的包,你會發現下面這些lua指令碼(這裡使用了截止至2014年8月4號的Amazon ami):
複製代碼 代碼如下:
[root@pxc-control ~]# ls -l /usr/share/doc/sysbench/tests/db/
total 44
-rw-r--r-- 1 root root 3585 Sep 7 2012 common.lua
-rw-r--r-- 1 root root 340 Sep 7 2012 delete.lua
-rw-r--r-- 1 root root 830 Sep 7 2012 insert.lua
-rw-r--r-- 1 root root 2925 Sep 7 2012 oltp.lua
-rw-r--r-- 1 root root 342 Sep 7 2012 oltp_simple.lua
-rw-r--r-- 1 root root 425 Sep 7 2012 parallel_prepare.lua
-rw-r--r-- 1 root root 343 Sep 7 2012 select.lua
-rw-r--r-- 1 root root 3964 Sep 7 2012 select_random_points.lua
-rw-r--r-- 1 root root 4066 Sep 7 2012 select_random_ranges.lua
-rw-r--r-- 1 root root 343 Sep 7 2012 update_index.lua
-rw-r--r-- 1 root root 552 Sep 7 2012 update_non_index.lua
所以訣竅(如果你希望這麼叫它)不是通過單一詞語傳遞--test指令,而是通過傳遞一個lua指令碼的完整路徑。
下面首先是舊的方式(sysbench 0.4.12來自EPEL庫):
複製代碼 代碼如下:
--test=oltp --oltp-test-mode=complex
下面是新的方式(sysbench 0.5):
複製代碼 代碼如下:
--test=/usr/share/doc/sysbench/tests/db/insert.lua
下面是我在一個3個節點的PXC叢集上跑haproxy,做一個僅插入的測試類型,下面是我傳遞給sysbench的全部命令:
複製代碼 代碼如下:
[root@pxc-control ~]# cat sys_haproxy.sh
#!/bin/bash
sysbench
--test=/usr/share/doc/sysbench/tests/db/insert.lua
--mysql-host=pxc-control
--mysql-port=9999
--mysql-user=sysbench-haproxy
--mysql-password=sysbench-haproxy
--mysql-db=sbtest
--mysql-table-type=innodb
--oltp-test-mode=complex
--oltp-read-only=off
--oltp-reconnect=on
--oltp-table-size=1000000
--max-requests=100000000
--num-threads=3
--report-interval=1
--report-checkpoints=10
--tx-rate=24
$1
下面是insert.lua指令碼的內容:
複製代碼 代碼如下:
[root@pxc-control ~]# cat /usr/share/doc/sysbench/tests/db/insert.lua
pathtest = string.match(test, "(.*/)") or ""
dofile(pathtest .. "common.lua")
function thread_init(thread_id)
set_vars()
end
function event(thread_id)
local table_name
local i
local c_val
local k_val
local pad_val
table_name = "sbtest".. sb_rand_uniform(1, oltp_tables_count)
if (oltp_auto_inc) then
i = 0
else
i = sb_rand_uniq(1, oltp_table_size)
end
k_val = sb_rand(1, oltp_table_size)
c_val = sb_rand_str([[
###########-###########-###########-###########-###########-###########-###########-###########-###########-###########]])
pad_val = sb_rand_str([[
###########-###########-###########-###########-###########]])
rs = db_query("INSERT INTO " .. table_name .. " (id, k, c, pad) VALUES " .. string.format("(%d, %d, '%s', '%s')",i, k_val, c_val, pad_val))
end
我比較喜歡sysbench 0.5的一個地方(超過lua 介面,肯定的!)是它現在帶來一個配置項 –report-interval option(我通常都是設定為 =1),以便在指令碼運行時你可以定時看到輸出資訊。不要等到運行結束是再得到反饋!這裡有個用sysbench 0.5的測試範例,通過本地hapoxy執行個體運行插入資料動作以及向在同一個PXC(Percona XtrDB Cluster)叢集上的三個節點寫資料動作,例如OpenStack Trove會做:
複製代碼 代碼如下:
[root@pxc-control ~]# ./sys_haproxy.sh run
sysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 3
Report intermediate results every 1 second(s)
Random number generator seed is 0 and will be ignored
Threads started!
[ 1s] threads: 3, tps: 0.00, reads/s: 0.00, writes/s: 1099.28, response time: 9.86ms (95%)
[ 2s] threads: 3, tps: 0.00, reads/s: 0.00, writes/s: 973.02, response time: 10.77ms (95%)
[ 3s] threads: 3, tps: 0.00, reads/s: 0.00, writes/s: 1181.01, response time: 6.23ms (95%)
[ 4s] threads: 3, tps: 0.00, reads/s: 0.00, writes/s: 1103.00, response time: 6.77ms (95%)
我也想讓你注意到來自Nilnandan Joshi部落格的文章,Nilnandan Joshi是來自Percona支援小組,在這篇文章中他介紹了在Debian 7上編譯構建sysbench 0.5的一種方法。在這裡非常感謝Nil的貢獻!
我希望這篇文章可以幫組那些想要升級到sysbench 0.5的同志,並且能質疑(探討)-test=oltp去哪兒了。我很樂意看到你自己的關於sysbench使用者案列,並且是否有其他人發布過他們自己的用於負載測試的lua指令碼!