mysql sysbench_MySQL sysbench基准测试
一、基準(zhǔn)測(cè)試
參考《高性能 MySQL》第二章。
二、Sysbench
sysbench 是開源的跨平臺(tái)多線程基準(zhǔn)測(cè)試工具,主要用于測(cè)試各種不同系統(tǒng)參數(shù)下的 CPU/內(nèi)存/線程/IO/數(shù)據(jù)庫(kù)等方面的性能,數(shù)據(jù)庫(kù)目前支持 MySQL/Oracle/PostgreSQL。具體的參數(shù)設(shè)置,應(yīng)根據(jù)實(shí)際環(huán)境來(lái)進(jìn)行必要調(diào)整。
與之前版本相比,sysbench 最新的 0.5 版本,可以使用腳本來(lái)決定測(cè)試語(yǔ)句,比之前在代碼里寫死測(cè)試更加方便用戶修改和使用,不需要去修改源程序,只需要修改相應(yīng)的 lua 腳本,即可定制不同的測(cè)試用例,在數(shù)據(jù)庫(kù)負(fù)載測(cè)試中,這樣可以對(duì) SQL 語(yǔ)句進(jìn)行更有針對(duì)性的測(cè)試。
1、下載安裝
Linu 自帶版本大多為 0.4.12,最新版本可以從 Launchpad 下載安裝步驟如下:
./autogen.sh
./configure
make && sudo make install
sysbench 依賴 mysql-dev 包的支持,如果 mysql 沒有安裝在默認(rèn)位置,執(zhí)行./configure 時(shí)需要配置–with-mysql-includes 和 –with-mysql-lib。具體參看源碼包中 README 文檔。
安裝完成后可以查看版本信息。
sysbench --version
2、使用說(shuō)明
簡(jiǎn)要說(shuō)明 sysbench 的使用方法,側(cè)重對(duì)數(shù)據(jù)庫(kù)的測(cè)試。具體用法參考 sysbench –help。
2.1 命令格式:
Sysbench [general-options]… –test= [test-options]… command
通用選項(xiàng)(general-options):
–num-threads=N 指定要使用的線程
–report-interval=N 每隔 N 秒打印統(tǒng)計(jì)信息
–rand-XXX 隨機(jī)分布相關(guān)配置
內(nèi)建測(cè)試項(xiàng)目(test-option):
fileio – File I/O test
cpu – CPU performance test
memory – Memory functions speed test
threads – Threads subsystem performance test
mutex – Mutex performance test
oltp,從 0.5 開始不再設(shè)置單獨(dú)的選項(xiàng),可以直接通過(guò) Lua 腳本文件進(jìn)行測(cè)試,兼容之前 oltp 的所有選項(xiàng)。
以上所有的項(xiàng)目都可以通過(guò) sysbench-0.5\sysbench\tests\ 下的測(cè)試腳本進(jìn)行測(cè)試。
2.2 測(cè)試項(xiàng)目選項(xiàng)(test-option)
各種內(nèi)建測(cè)試項(xiàng)目的選項(xiàng)可以通過(guò)命令 sysbench –test=help 查看。
2.3 命令(command):
sysbench 做壓力測(cè)試的時(shí)候分 3 個(gè)階段:prepare(準(zhǔn)備測(cè)試數(shù)據(jù)); run(運(yùn)行壓力測(cè)試); cleanup(清理測(cè)試數(shù)據(jù))。
3、內(nèi)建測(cè)試說(shuō)明
3.1 CPU
sysbench 采用尋找最大素?cái)?shù)的方式來(lái)測(cè)試 CPU 的性能。
sysbench --test=cpu --cpu-max-prime=1000 run
3.2 Fileio
Sysbench 的 I/O 測(cè)試和 InnoDB 的 I/O 模式非常類似。
sysbench --test=fileio –file_num=40 –-file-total-size=80G --file-test-mode=rndrw prepare
sysbench --test=fileio –file_num=40 –-file-total-size=80G --file-test-mode=rndrw run
sysbench --test=fileio –file_num=40 –-file-total-size=80G --file-test-mode=rndrw cleanup
3.3 Memory
待完善
3.4 Threads
待完善
3.5 Mutex
待完善
3.6 OLTP
Sysbench 0.5 中的 oltp.lua 提供了一個(gè)比之前版本中的 oltp 模式更為真實(shí)的場(chǎng)景來(lái)進(jìn)行數(shù)據(jù)庫(kù)的基準(zhǔn)測(cè)試。和之前 oltp 模式中的單個(gè)表場(chǎng)景相比,0.5 通過(guò) Lua 腳本可以對(duì)多個(gè)表進(jìn)行工作測(cè)試。oltp.lua 可以理解原先 oltp 模式中的大多數(shù)選項(xiàng)。
所有的測(cè)試腳本位于/sysbench-0.5/sysbench/test/下,db 目錄下是數(shù)據(jù)庫(kù)測(cè)試項(xiàng)目,其中 common.lua 并非測(cè)試文件,是用于 prepare 和 cleanup。 oltp.lua 文件用于測(cè)試事務(wù)性能,其中 thread_init 函數(shù)來(lái)初始化每個(gè)線程的參數(shù),初始化工作調(diào)用了 common.lua 中的 set_vars()函數(shù),來(lái)初始化 oltp 的相關(guān)參數(shù)。
階段 1: 連接數(shù)據(jù)庫(kù)服務(wù)器
每次執(zhí)行基準(zhǔn)測(cè)試,不管是 prepare 還是 run,如果不是使用默認(rèn)值的話,都應(yīng)該指定如何連接數(shù)據(jù)庫(kù)。默認(rèn)值如下:
默認(rèn)的數(shù)據(jù)庫(kù) sbtest,sysbench 不會(huì)自動(dòng)創(chuàng)建該數(shù)據(jù)庫(kù)。所以如果你要用過(guò)的話要首先。
階段 2:Prepare
如果使用默認(rèn)值,首先要?jiǎng)?chuàng)建測(cè)試所用的表。創(chuàng)建方式有兩種: oltp.lua (串行) 和 parallel_prepare.lua (并行)。
針對(duì) database driver 還需要指明以下參數(shù):
創(chuàng)建表:
oltp.lua 中提供的 –oltp-tables-count 指明了表的數(shù)量。默認(rèn)的表名是 sbtest。如果制定了 oltp-tables-count,則在表名后加數(shù)字,例如 sbtest1, sbtest2, .. sbtest[oltp-tables-count],注意,此種情況下不會(huì)創(chuàng)建 sbtest 表。
通過(guò)選項(xiàng) –oltp-secondary 可以在每個(gè)表上使用第二索引來(lái)替代主鍵。也就是說(shuō)通過(guò) KEY xid (ID) 而不是 PRIMARY KEY (ID) 來(lái)創(chuàng)建表。這個(gè)選項(xiàng)將會(huì)使 InnoDB 為每個(gè)表創(chuàng)建內(nèi)部 6-byte 的索引。同樣可以使用選項(xiàng) –oltp-auto-in 將 id 字段設(shè)為遞增。
創(chuàng)建表 SQL 語(yǔ)句示例如下:
CREATE TABLE `sbtest101` (
`id` int(10) unsigned NOT NULL auto_increment,
`k` int(10) unsigned NOT NULL default '0',
`c` char(120) NOT NULL default '',
`pad` char(60) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `k` (`k`));
Parallel.lua(并行) 創(chuàng)建:
./sysbench --test=tests/db/parallel_prepare.lua --mysql-user=USER --mysql-password=SECRET --oltp-tables-count=64 --num-threads=8 run
注意:oltp-tables-count 應(yīng)該是 num-threads 的整數(shù)倍。
oltp.lua(串行)創(chuàng)建:
./sysbench --test=tests/db/oltp.lua --mysql-user=USER --mysql-password=SECRET --mysql-table-engine=myisam --oltp-table-size=1000000 --oltp-tables-count=64 --mysql-socket=/tmp/mysql.sock prepare
階段 3:Run
準(zhǔn)備好測(cè)試環(huán)境之后就可以使用 oltp.lua 執(zhí)行一系列的測(cè)試了,測(cè)試使用的線程數(shù)量通過(guò)選項(xiàng) –num-threads 來(lái)指定。每個(gè)線程通過(guò)隨機(jī)產(chǎn)生小于或者等于 oltp-tables-count 的數(shù)字來(lái)選擇一個(gè)表。
隨機(jī)取樣分布通過(guò)選項(xiàng) –oltp-dist-type 來(lái)進(jìn)行設(shè)置,該選項(xiàng)默認(rèn)值是 special。Special 分布還和另外兩個(gè)參數(shù)有關(guān):–oltp-dist-pct,用來(lái)指定要特殊對(duì)待的記錄的百分比,–oltp-dist-res 指定這些記錄的概率。例如,對(duì) 1000 行記錄進(jìn)行 1000 次查詢,–oltp-dist-pct=1 and –oltp-dist-res=50 結(jié)果,開始 10 條記錄(1% of 1000),每條記錄選中五十次,總共 500 次,剩余的查詢將會(huì)從 990 條記錄中均勻采樣。
選中表之后,就會(huì)執(zhí)行相應(yīng)的測(cè)試。他們將會(huì)打包為一個(gè)事務(wù)(transaction)傳遞給數(shù)據(jù)庫(kù)服務(wù)器(除非使用 myisam 引擎,這樣先會(huì)鎖住表)。也可以單線程運(yùn)行 oltp 的子集,例如 oltp_simple.lua, select.lua, insert.lua, delete.lua, update_index.lua, update_non_index.lua
SELECT tests
Select 還可以分為點(diǎn)選擇測(cè)試(Point Select tests)和范圍測(cè)試(Ranges tests)。
點(diǎn)測(cè)試
選項(xiàng) oltp-point-selects 單次事務(wù)中點(diǎn)選擇測(cè)試的查詢次數(shù)。 每次測(cè)試,通過(guò)制定的分布來(lái)隨機(jī)產(chǎn)生一個(gè)小于或者等于表大小(oltp-table-size)的數(shù)字,然后執(zhí)行下面的查詢語(yǔ)句。 SELECT c FROM sbtestXXX WHERE id=N
范圍測(cè)試
通過(guò)變量 oltp-range-size 可以制定要查詢的范圍(不大于表大小)
簡(jiǎn)單范圍測(cè)試
選項(xiàng) oltp-simple-ranges 單次事務(wù)中范圍選擇測(cè)試的查詢次數(shù)。 每次通過(guò)指定的分布來(lái)產(chǎn)生一個(gè)不大于 oltp-talbe-size 的整數(shù) N,然后通過(guò)選項(xiàng)設(shè)置 oltp-range-size 設(shè)置整數(shù) M,然后執(zhí)行如下查詢: SELECT c FROM sbtest WHERE id BETWEEN N AND M
范圍求和(Sum in ranges)
選項(xiàng) oltp_sum_ranges 單次事務(wù)中范圍選擇測(cè)試的查詢次數(shù)。查詢語(yǔ)句: SELECT SUM(K) FROM sbtest WHERE id BETWEEN N and M
范圍排序(Order in ranges)
選項(xiàng) oltp_order_ranges 單次事務(wù)中范圍選擇測(cè)試的查詢次數(shù)。查詢語(yǔ)句: SELECT c FROM sbtest WHERE id between N and M ORDER BY c
范圍去重(Distincts in ranges)
選項(xiàng) oltp-distinct-ranges 單次事務(wù)中范圍選擇測(cè)試的查詢次數(shù)。查詢語(yǔ)句:
SELECT DISTINCT c FROM sbtest WHERE id BETWEEN N and M ORDER BY c
UPDATE tests
只要沒有指定 oltp-read-only=on 就能進(jìn)行更新測(cè)試。
1、index_update.lua
選項(xiàng) oltp_index_updates 單次事務(wù)中范圍選擇測(cè)試的查詢次數(shù)。查詢語(yǔ)句:
UPDATE sbtest SET k=k+1 WHERE id=N
2、non_index_update.lua
選項(xiàng) oltp-non-index-updates 單次事務(wù)中范圍選擇測(cè)試的查詢次數(shù)。C 為隨機(jī)產(chǎn)生的字符串,查詢語(yǔ)句:
UPDATE sbtest SET c=C WHERE id=N
DELETE test
只要沒有指定 oltp-read-only=on 就能進(jìn)行更新測(cè)試。通過(guò)執(zhí)行分布產(chǎn)生一個(gè)不大于 oltp-table-siez 的數(shù)字 N,執(zhí)行語(yǔ)句:
DELETE FROM sbtest WHERE id=N
INSERT test
只要沒有指定 oltp-read-only=on 就能進(jìn)行更新測(cè)試。通過(guò)執(zhí)行分布產(chǎn)生一個(gè)不大于 oltp-table-siez 的數(shù)字 N,執(zhí)行語(yǔ)句:
INSERT INTO sbtest (id, k, c, pad) VALUES N, K, C, PAD
使用舉例:
使用 5 個(gè)線程在 25 個(gè) table 上進(jìn)行默認(rèn)測(cè)試:
./sysbench --mysql-user=USER --mysql-password=SECRET --test=tests/db/oltp.lua --oltp-tables-count=25 --num-threads=5 run
使用 10 個(gè)線程在 100 個(gè) table 上進(jìn)行 select 測(cè)試,10 個(gè)點(diǎn)測(cè)試和值為 1000 的范圍測(cè)試:
./sysbench --mysql-user=USER --mysql-password=SECRET --test=tests/db/select.lua --oltp-tables-count=100 --num-threads=10
--oltp-point-selects=100 --oltp-range-size=1000 run
階段 4:清理(cleanup)
可以通過(guò)清理操作來(lái)返回到準(zhǔn)備的階段。必須提供鏈接數(shù)據(jù)庫(kù)服務(wù)器的選項(xiàng)和創(chuàng)建的表的數(shù)量。
./sysbench --test=tests/db/oltp.lua --mysql-user=USER --mysql-password=SECRET --oltp-tables-count=64 cleanup
總結(jié)
以上是生活随笔為你收集整理的mysql sysbench_MySQL sysbench基准测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android课程设计(健康管理软件开发
- 下一篇: android的wifi直连,WLAN