性能測試工具-MysqlBench
背景
在mysql性能調研和分布式資料庫測試過程中,需要評估mysql某些方面的性能情況,如果單純使用mysql自帶的性能檢視工具和指令,如mysqladmin、show innoDB status等,顯然不能滿足需求,無法得到所有的資料,如QPS、latency雖然可以通過參數值來計算得到,但不夠自動化,并且如果需要得到大量實驗資料時,手工計算是一種笨拙的方式。
使用方式
基本配置
MysqlBench.php需要配置基本資訊:
<a target="_blank" href="http://blog.51cto.com/attachment/201112/230650793.jpg"></a>
$ip、$username、$password、$port、$database、$table分别對應資料庫的ip、使用者名、密碼、端口、執行操作的database、執行性能測試的表名(可替換為自定義的表名,注意如果column與MysqlBench的不一緻,需要自行修改)。
$logfile指定記錄操作原始資訊的檔案,在分析結果時會使用到該檔案
$resultfile分析結果儲存到的檔案
$fd資料庫句柄,不用理會
$startID對應query操作時的起始ID
執行測試
可以直接運作php MysqlBench.php –h,檢視下幫助資訊,如下:
<a target="_blank" href="http://blog.51cto.com/attachment/201112/230701230.jpg"></a>
–h
php MysqlBench.php –h:輸出幫助資訊
–p
php MysqlBench.php –p type value num [allNum=?] [log=?] [item=?] [table=?] [startID=?] [logfile=?]:啟動壓力
1. type【必選】:目前支援5種方式:insert、update、select、delete、prepareInsert,其中prepareInsert用于快速插入而不關注insert性能狀況的情況,一般來說type為prepareInsert時,log參數應該指派為false,避免日志記錄操作。
2. value【必選】:目前可支援1K、10K、100K、1M、10M,MysqlBench會随機生成對應大小的string并儲存在大資料字段中,如預設的content字段,或其他column,這個可自定義。
3. num【必選】:支援所有正整數,即query的數量。當如果指定了allNum,則num需要不大于allNum。對于insert和prepareInsert操作,采用的是順序插入的方式,id從$startID到num+$startID;而對于update和select操作,采用随機的方式,随機id範圍為$startID到num+$startID,遇到重複的id不跳過;對于delete操作,也是采用随機的方式,但剔除重複的id,随機id範圍為$startID到num+$startID,故執行delete請求時,強烈建議指定allNum,且最好allNum>=10*num,已包裝重複的id不會太多,影響測試準确些。
4. allNum【可選】:指定table中一共有多少資料,強烈建議allNum的數量>=10*num,即query的數量至多為總資料量的1/10。預設值allNum=num
5. log【可選】:是否記錄每條query的耗時時間,例如你僅僅想了解select的耗時,那在灌資料的時候,就可以指定log=false。預設值為log=true。耗時資訊儲存在$logfile中。
6. item【可選】:指定select大資料字段(1K、1M這些)或小資料字段(幾十個位元組),僅對select操作有效。預設值為item=large,還可取值small。
7. table【可選】:指定操作的table名,預設值為基本配置中的$table變量值。
8. startID【可選】:指定Query的起始id,預設值為基本配置中的$startID的值,多組實驗時為了避免幹擾,采用不同的id範圍時這個參數就能起到隔離的作用。
9. logfile【可選】:指定log檔案名,記錄耗時資訊。批量執行不同case時,需要指定不同的log檔案,否則MysqlBench都會将耗時資訊輸出到基本配置中的$logfile指定的檔案中。
–t/–d
php MysqlBench.php –t [table=?] [analyse=?] [ip=?] [port=?] [logfile=?]:清空表
php MysqlBench.php –d [table=?] [analyse=?] [ip=?] [port=?] [logfile=?]:删除表
1. table【可選】:指定truncate或drop的table名,預設值為基本配置中的$table變量值。
2. analyse【可選】:指定是否記錄耗時時間。預設值為false。
3. ip、port【可選】:指定資料庫的ip和port,預設值為基本配置中的ip、port對應值,這個在ddbs時有應用,因為dbproxy不支援drop和truncate table操作,故需要穿透直連後端資料庫,故ip和port需要另外指定。
4. logfile【可選】:指定log檔案名,記錄耗時資訊。預設值為基本配置中對應值。
–a
php MysqlBench.php [logfile=?] [resultfile=?]:分析logfile檔案,産出QPS、latency等資料,輸出到resultfile。
1. logfile【可選】:指定需要分析的log檔案名。預設值為基本配置中對應值。
2. resultfile【可選】:分析結果儲存檔案,預設值為基本配置中的$resultfile值。
效果展示
Logfile檔案為原始資料檔案,每一行為每個query的耗時,如:
<a target="_blank" href="http://blog.51cto.com/attachment/201112/230712114.jpg"></a>
resultfile為分析結果檔案,根據原始資訊計算了QPS,平均耗時,latency區間,并可以直接看出是否有長耗時,如:
<a target="_blank" href="http://blog.51cto.com/attachment/201112/230722837.jpg"></a>
Result檔案可直接ctrl+c & ctrl+v到excel中,如:
<a target="_blank" href="http://blog.51cto.com/attachment/201112/230735502.jpg"></a>
通過excel自帶工具可生成圖表,可以更直覺的分析測試結果,如:
<a target="_blank" href="http://blog.51cto.com/attachment/201112/230745202.jpg"></a>
功能測試工具-AutoSQL
概述
功能測試工具AutoSQL用于SQL指令分發以及結果校驗,不僅适用分布式資料庫,也适合單機mysql,可以認為它就是帶校驗功能的一個mysql應用。
如何使用
你隻需要根據規定的檔案格式組織SQL指令和預期結果,通過php AutoSQL.php command.sql expect.result就可以自動化執行SQL指令,并與預期結果校驗。
指令格式
通過php AutoSQL.php -h 可以獲知AutoSQL工具可以支援的指令清單,如下:
php AutoSQL.php [command]
command:
-h print this usage
query_file expect_file
query_file store sql command, file pattern: case_name##sql command##
expect_file store expected result of query, file pattern: case_name##query fail or not##[NOCHECK##]effect rows[##ORDER(result order)]##false(insert,update,delete,replace) or result num(select)##row1##row2##...##
-r [-d pathname]: run cases in the path, default is current directory.
-c [-d logpath]: check run result from log files, default is log directory in current directory
如上所述,具體說明如下:
1. 執行單個檔案:php AutoSQL.php query_file expect_file,檔案格式見下文
2. 執行某個檔案夾下的所有command檔案:php AutoSQL.php -r -d pathname,支援絕對路徑和相對路徑,預設為目前路徑
3. 批量檢視case是否執行成功:php AutoSQL.php -c -d logpath,指定logs目錄,自動化工具會列出所有fail的test suite和case,并展示在前台,預設為目前路徑下的log目錄
檔案格式
query_file
query_file的格式如下:
case_name##sql command##
各個參數說明如下:
case_name: case名
sql command:sql指令,sql command的指令格式與mysql官方規定的一緻。
例子:
case0##delete from singleC;##
case1##insert singleC (cID) values (30000), (30001);##
case2##select * from singleC;##
首先case0清空singleC表,然後case1插入兩條記錄,然後case2查詢表singleC,确認記錄是否插入成功
expect_file
expect_file的格式如下:
case_name##query fail or not##[NOCHECK##]effect rows[##ORDER(result order)]##false(insert, update,delete,replace) or result num(select)##row1##row2##...##
case_name:case名,與query_file中的case_name一一對應
query fail or not:指令預期執行失敗與否
NOCHECK:該選項指明隻需判斷query是否正常,不判斷結果
effect rows:insert、delete、update、replace操作時受影響的行數,select操作時effect rows為-1
ORDER(result order):該選項隻适合于select操作,配置為ORDER時,select結果要求與預期的結果完全一緻,包括順序。不指定ORDER時,select結果與預期結果内容一緻即可,順序不考慮。
false(insert,update,delete,replace) or result num(select):select操作時為傳回的結果行數,insert、update、delete、replace時為false
row1##row2##...##:每行的預期内容,一行中每個字段以逗号(,)分隔。
case0##true##NOCHECK##
case1##true##2##false##
case2##true##-1##2##30000,,,vincent,100##30001,,,vincent,100##
case0帶NOCHECK,僅判斷query是否成功,case1插入兩條記錄的作用是effected rows為2,case2查詢出2兩條記錄,為case1插入的記錄
幫助
mail:[email protected]
(baiduqa,留下郵箱:[email protected])
本文轉自百度技術51CTO部落格,原文連結:http://blog.51cto.com/baidutech/744434,如需轉載請自行聯系原作者