一暮屡、Sysbench介紹
SysBench是一個模塊化的驻龟、跨平臺温眉、多線程基準測試工具,主要用于評估測試各種不同系統(tǒng)參數(shù)下的數(shù)據(jù)庫負載情況翁狐。它主要包括以下幾種方式的測試:
1类溢、cpu性能
2、磁盤io性能
3露懒、調(diào)度程序性能
4闯冷、內(nèi)存分配及傳輸速度
5、POSIX線程性能
6懈词、數(shù)據(jù)庫性能(OLTP基準測試)
Sysbench的oltp主要用于評估測試各種不同系統(tǒng)參數(shù)下的數(shù)據(jù)庫負載情況蛇耀。目前sysbench的數(shù)據(jù)庫測試支持MySQL、PostgreSQL坎弯、Oracle纺涤。相比0.4版本译暂,后續(xù)的版本oltp測試主要結(jié)合了lua腳本,不需要修改源碼撩炊,通過自定義lua腳本就可以實現(xiàn)不同業(yè)務(wù)類型的測試外永。
二、Sysbench安裝使用
如果沒有什么特別需求拧咳,直接使用EPEL源安裝Sysbench即可象迎。
# yum -y install epel-release
# yum -y install sysbench
# sysbench --version
sysbench 1.0.9
# sysbench --help
Usage:
??sysbench [options]... [testname] [command]
General options
--threads=N:創(chuàng)建測試線程的數(shù)量, 默認為[1]。
--events=N:事件最大數(shù)量呛踊,默認為[0] ,不限制砾淌。
--time=N:最大執(zhí)行時間,單位是s谭网,默認是[0] ,不限制汪厨。
--forced-shutdown=STRING:超過max-time強制中斷, 默認是[off]。
--thread-stack-size=SIZE:每個線程的堆棧大小, 默認是[64k]愉择。
--rate=N:average transactions rate. 0 for unlimited rate [0]劫乱。
--report-interval=N:報告中間統(tǒng)計信息間隔,0代表禁止锥涕,默認為[0]衷戈。
--report-checkpoints=[LIST,...]:轉(zhuǎn)儲完全統(tǒng)計信息并在指定時間點復(fù)位所有計數(shù)器,參數(shù)是逗號分隔值的列表层坠,表示從必須執(zhí)行報告檢查點的測試開始所經(jīng)過的時間(以秒為單位)殖妇。 默認情況下,報告檢查點處于關(guān)閉狀態(tài)[off]破花。
--debug[=on|off]:是否顯示更多的調(diào)試信息谦趣,默認是[off]。
--validate[=on|off]:在可能情況下執(zhí)行驗證檢查座每,默認是[off]前鹅。
--help[=on|off]:輸出help信息,并退出峭梳。
--version[=on|off]:輸出版本信息, 并退出舰绘。
--config-file=FILENAME:配置文件。
--tx-rate=N:deprecated alias for –rate[0].
--max-requests=N:deprecated alias for –events[0].
--max-time=N:deprecated alias for –time[0].
--num-threads=N:deprecated alias for –threads[1].
Pseudo-Random Numbers Generator options
--rand-type=STRING:分布的隨機數(shù){uniform(均勻分布)葱椭,Gaussian(高斯分布)捂寿,special(空間分布)},默認是special挫以。
--rand-spec-iter=N:產(chǎn)生數(shù)的迭代次數(shù)者蠕,默認是12窃祝。
--rand-spec-pct=N:值的百分比被視為’special’ (for special distribution)掐松,默認是1踱侣。
--rand-spec-res=N:’special’的百分比值,默認是75大磺。
--rand-seed=N:隨機數(shù)發(fā)生器的種子抡句,值為0時,將當前時間用作rng種子杠愧,默認值[0]待榔。
--rand-pareto-h=N:參數(shù)h用于pareto分布[0.2]。
Log options
--verbosity=N:日志詳細級別{5-調(diào)試, 0-僅重要消息}流济,默認為[3]锐锣。
--percentile=N:在延遲統(tǒng)計數(shù)據(jù)中計算的百分點 (1-100),使用特殊值0來禁用百分比計算[95]绳瘟。
--histogram[=on|off]:在報告中打印滯后時間直方圖雕憔,默認為[off]。
Compiled-in database drivers
mysql:MySQL驅(qū)動糖声。
pgsql:PostgreSQL驅(qū)動斤彼。
mysql options
--mysql-host=[LIST,...]:MySQL服務(wù)器地址[localhost]。
--mysql-port=[LIST,...]:MySQL服務(wù)器端口[3306]蘸泻。
--mysql-socket=[LIST,...]:MySQL服務(wù)器的socket地址琉苇。
--mysql-user=STRING:MySQL服務(wù)器的用戶名。
--mysql-password=STRING:MySQL用戶名密碼悦施。
--mysql-db=STRING:MySQL數(shù)據(jù)庫名稱[sbtest]并扇。
--mysql-compression[=on|off]:是否使用壓縮[off]。
pgsql options
--pgsql-host=[LIST,...]:PostgreSQL服務(wù)器地址[localhost]抡诞。
--pgsql-port=[LIST,...]:PostgreSQL服務(wù)器端口[5432]拜马。
--pgsql-user=STRING:PostgreSQL服務(wù)器的用戶名。
--pgsql-password=STRING:PostgreSQL用戶名密碼沐绒。
--pgsql-db=STRING:PostgreSQL數(shù)據(jù)庫名稱[sbtest]俩莽。
Compiled-in tests
fileio:文件I/O測試。
cpu:CPU性能測試乔遮。
memory:內(nèi)存速率測試扮超。
threads:線程子系統(tǒng)性能測試。
mutex:互斥鎖性能測試蹋肮。
三出刷、Sysbench壓測MySQL
Sysbench壓測MySQL流程:prepare(準備數(shù)據(jù)) -> run(運行測試) -> cleanup(清理數(shù)據(jù))
下面是目前社區(qū)提供的lua腳步(安裝sysbench默認自帶)
/usr/share/sysbench/bulk_insert.lua
/usr/share/sysbench/oltp_common.lua
/usr/share/sysbench/oltp_delete.lua
/usr/share/sysbench/oltp_insert.lua
/usr/share/sysbench/oltp_point_select.lua
/usr/share/sysbench/oltp_read_only.lua
/usr/share/sysbench/oltp_read_write.lua
/usr/share/sysbench/oltp_update_index.lua
/usr/share/sysbench/oltp_update_non_index.lua
/usr/share/sysbench/oltp_write_only.lua
/usr/share/sysbench/select_random_points.lua
/usr/share/sysbench/select_random_ranges.lua
以oltp_read_only.lua為例壓測MySQL:
準備數(shù)據(jù):
# sysbench /usr/share/sysbench/oltp_read_only.lua --mysql-host=192.168.10.94 --mysql-port=3307 --mysql-user=root --mysql-password='000000' --mysql-db=sbtest --db-driver=mysql --tables=10 --table-size=1000000 --report-interval=10 --threads=128 --time=120 prepare
壓測:
# sysbench /usr/share/sysbench/oltp_read_only.lua --mysql-host=192.168.10.94 --mysql-port=3307 --mysql-user=root --mysql-password='000000' --mysql-db=sbtest --db-driver=mysql --tables=10 --table-size=1000000 --report-interval=10 --threads=128 --time=120 run
結(jié)果:
sysbench 1.0.9 (using system LuaJIT 2.0.4)
Running the test with following options:
Number of threads: 128
Report intermediate results every 10 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!
[ 10s ] thds: 128 tps: 154.50 qps: 2564.53 (r/w/o: 2244.70/0.00/319.83) lat (ms,95%): 1129.24 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 128 tps: 194.87 qps: 3113.62 (r/w/o: 2723.98/0.00/389.64) lat (ms,95%): 1109.09 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 128 tps: 199.90 qps: 3207.14 (r/w/o: 2807.33/0.00/399.80) lat (ms,95%): 926.33 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 128 tps: 195.06 qps: 3125.39 (r/w/o: 2735.27/0.00/390.12) lat (ms,95%): 1050.76 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 128 tps: 218.04 qps: 3477.01 (r/w/o: 3041.13/0.00/435.88) lat (ms,95%): 831.46 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 128 tps: 213.20 qps: 3415.43 (r/w/o: 2988.84/0.00/426.59) lat (ms,95%): 893.56 err/s: 0.00 reconn/s: 0.00
[ 70s ] thds: 128 tps: 217.60 qps: 3485.39 (r/w/o: 3049.89/0.00/435.50) lat (ms,95%): 861.95 err/s: 0.00 reconn/s: 0.00
[ 80s ] thds: 128 tps: 214.42 qps: 3423.17 (r/w/o: 2994.74/0.00/428.43) lat (ms,95%): 893.56 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 128 tps: 199.67 qps: 3200.28 (r/w/o: 2800.75/0.00/399.53) lat (ms,95%): 909.80 err/s: 0.00 reconn/s: 0.00
[ 100s ] thds: 128 tps: 144.34 qps: 2311.44 (r/w/o: 2022.65/0.00/288.79) lat (ms,95%): 2279.14 err/s: 0.00 reconn/s: 0.00
[ 110s ] thds: 128 tps: 190.31 qps: 3045.26 (r/w/o: 2664.82/0.00/380.44) lat (ms,95%): 1032.01 err/s: 0.00 reconn/s: 0.00
[ 120s ] thds: 128 tps: 249.47 qps: 3988.58 (r/w/o: 3489.98/0.00/498.60) lat (ms,95%): 909.80 err/s: 0.00 reconn/s: 0.00
SQL statistics:
? ? queries performed:
? ? ? ? read:? ? ? ? ? ? ? ? ? ? ? ? ? ? 336420????//總select數(shù)量
? ? ? ? write:? ? ? ? ? ? ? ? ? ? ? ? ? 0????//總update、insert坯辩、delete語句數(shù)量馁龟;
? ? ? ? other:? ? ? ? ? ? ? ? ? ? ? ? ? 48060????//commit、unlock tables以及其他mutex的數(shù)量;
? ? ? ? total:? ? ? ? ? ? ? ? ? ? ? ? ? 384480
? ? transactions:? ? ? ? ? ? ? ? ? ? ? ? 24030? (198.93 per sec.)????//TPS;
? ? queries:? ? ? ? ? ? ? ? ? ? ? ? ? ? 384480 (3182.80 per sec.)????//QPS;
? ? ignored errors:? ? ? ? ? ? ? ? ? ? ? 0? ? ? (0.00 per sec.)????//忽略的錯誤數(shù);
? ? reconnects:? ? ? ? ? ? ? ? ? ? ? ? ? 0? ? ? (0.00 per sec.)
General statistics:
? ? total time:? ? ? ? ? ? ? ? ? ? ? ? ? 120.7959s????//即time指定的壓測實際;
? ? total number of events:? ? ? ? ? ? ? 24030????//總的事件數(shù),一般與transactions相同;
Latency (ms):
? ? ? ? min:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 82.09????//最小響應(yīng)時間;
? ? ? ? avg:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 641.06????//平均響應(yīng)時間;
? ? ? ? max:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 14581.38????//最大響應(yīng)時間;
? ? ? ? 95th percentile:? ? ? ? ? ? ? ? ? 1013.60????//95%的語句的平均響應(yīng)時間;
? ? ? ? sum:? ? ? ? ? ? ? ? ? ? ? ? ? ? 15404637.08????//總響應(yīng)時間;
Threads fairness:
? ? events (avg/stddev):? ? ? ? ? 187.7344/6.21
? ? execution time (avg/stddev):? 120.3487/0.22
我們一般關(guān)注的指標主要有:
response time avg:平均響應(yīng)時間(后面的95%的大小可以通過–percentile=98的方式去更改)漆魔。
transactions:精確的說是這一項后面的TPS坷檩,但如果使用了–skip-trx=on却音,這項事務(wù)數(shù)為0,需要用total number of events去除以總時間矢炼,得到tps(其實還可以分為讀tps和寫tps)系瓢。
queries:用它除以總時間,得到吞吐量QPS句灌。
當然還有一些系統(tǒng)層面的cpu夷陋,io,mem相關(guān)指標胰锌。
清除數(shù)據(jù):
# sysbench /usr/share/sysbench/oltp_read_only.lua --mysql-host=192.168.10.94 --mysql-port=3307 --mysql-user=root --mysql-password='000000' --mysql-db=sbtest --db-driver=mysql --tables=10 --table-size=1000000 --report-interval=10 --threads=128 --time=120 cleanup
四骗绕、Sysbench壓測磁盤IO
在Sysbench后跟上對應(yīng)的內(nèi)置可測試項名稱,然后跟上help即可獲得幫助信息资昧。
對于MySQL服務(wù)器來說爹谭,一般用戶可能關(guān)心的就是磁盤性能和OLTP性能,上面測試了OLTP榛搔,下面就來測試一下磁盤性能(FILEIO)诺凡,對于磁盤的測試,sysbench提供了以下測試選項:
# sysbench fileio help
sysbench 1.0.9 (using system LuaJIT 2.0.4)
fileio options:
? --file-num=N? ? ? ? ? ? ? number of files to create [128] ? ?//生產(chǎn)測試文件的數(shù)量践惑,默認為128腹泌。
? --file-block-size=N? ? ? block size to use in all IO operations [16384] ? ?//測試期間的塊大小,如果想知道磁盤針對InnoDB存儲引擎進行的測試尔觉,可以將其設(shè)置為16384凉袱,即InnoDB存儲引擎頁大小,默認為16384侦铜。
? --file-total-size=SIZE? ? total size of files to create [2G] ? ?//每個文件的帶下专甩,默認為2G。
? --file-test-mode=STRING? test mode {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw} ? ?//文件測試模式钉稍,包含seqwr(順序?qū)懀┑佣恪eqrewr(順序讀寫)、seqrd(順序讀)贡未、rndrd(隨機讀)种樱、rndwr(隨機寫)和rndrw(隨機讀寫)。
? --file-io-mode=STRING? ? file operations mode {sync,async,mmap} [sync] ? ?//文件操作的模式俊卤,同步還是異步嫩挤,或者是選擇MMAP(map映射)模式,默認為同步消恍。
? --file-async-backlog=N? ? number of asynchronous operatons to queue per thread [128] ? ?//打開文件時的選項岂昭,這是與API相關(guān)的參數(shù)。
? --file-extra-flags=STRING additional flags to use on opening files {sync,dsync,direct} [] ? ?//打開文件時的選項狠怨,這是與API相關(guān)的參數(shù)约啊。
? --file-fsync-freq=N? ? ? do fsync() after this number of requests (0 - don't use fsync()) [100] ? ?//執(zhí)行fsync函數(shù)的頻率邑遏,fsync主要是同步磁盤文件,因為可能有系統(tǒng)和磁盤緩沖的關(guān)系棍苹。
? --file-fsync-all[=on|off] do fsync() after each write operation [off] ? ?//每執(zhí)行完一次寫操作,就執(zhí)行一次fsync茵汰,默認未off枢里。
? --file-fsync-end[=on|off] do fsync() at the end of test [on] ? ?//在測試結(jié)束時,執(zhí)行fsync蹂午,默認為on栏豺。
? --file-fsync-mode=STRING? which method to use for synchronization {fsync, fdatasync} [fsync] ? ?//文件同步函數(shù)的選擇,同樣是和API相關(guān)的參數(shù)豆胸,由于多個操作對fdatasync支持的不同奥洼,因此不建議使用fdatasync。默認為fsync晚胡。
? --file-merged-requests=N? merge at most this number of IO requests if possible (0 - don't merge) [0] ? ?//盡可能合并此數(shù)量的io請求(0-不合并)灵奖,默認為[0]。
? --file-rw-ratio=N? ? ? ? reads/writes ratio for combined test [1.5] ? ?//測試時的讀寫比例估盘,默認是2:1瓷患。
Sysbench的fileio測試需要經(jīng)過prepare、run和cleanup三個階段遣妥。prepare是準備階段擅编,生產(chǎn)需要的測試文件,run是實際測試階段箫踩,cleanup是清理測試產(chǎn)生的文件爱态。例如進行16個文件、總大小2GB的fileio測試:
# sysbench fileio --file-num=16 --file-total-size=2G prepare
接著就可以基于這些文件進行測試了境钟,下面是16個線程下的隨機讀取性能:
# sysbench fileio --time=180 --events=100000000 --threads=16 --file-num=16 --file-total-size=2G --file-test-mode=rndrd --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=16384 run
上述測試的最大隨機數(shù)請求是100000000次锦担,如果在180秒內(nèi)不能完成,測試即結(jié)束慨削。測試結(jié)束后可以看到如下的測試結(jié)果:
sysbench 1.0.9 (using system LuaJIT 2.0.4)
Running the test with following options:
Number of threads: 16
Initializing random number generator from current time
Extra file open flags: 3
16 files, 128MiB each
2GiB total file size
Block size 16KiB
Number of IO requests: 100000000
Read/Write ratio for combined random IO test: 1.50
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random read test
Initializing worker threads...
Threads started!
File operations:
? ? reads/s:? ? ? ? ? ? ? ? ? ? ? 4713.10????//磁盤IOPS;
? ? writes/s:? ? ? ? ? ? ? ? ? ? 0.00
? ? fsyncs/s:? ? ? ? ? ? ? ? ? ? 0.00
Throughput:
? ? read, MiB/s:? ? ? ? ? ? ? ? ? 73.64 ? ?//磁盤每秒速率;
? ? written, MiB/s:? ? ? ? ? ? ? 0.00
General statistics:
? ? total time:? ? ? ? ? ? ? ? ? ? ? ? ? 180.0506s
? ? total number of events:? ? ? ? ? ? ? 848617
Latency (ms):
? ? ? ? min:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0.09
? ? ? ? avg:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.65
? ? ? ? max:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1923.59
? ? ? ? 95th percentile:? ? ? ? ? ? ? ? ? ? ? 0.24
? ? ? ? sum:? ? ? ? ? ? ? ? ? ? ? ? ? ? 2247207.75
Threads fairness:
? ? events (avg/stddev):? ? ? ? ? 53038.5625/342.16
? ? execution time (avg/stddev):? 140.4505/3.14
測試結(jié)束后吆豹,記得要執(zhí)行cleanup,確保測試產(chǎn)生的文件都已經(jīng)刪除理盆。
# sysbench fileio --file-num=16 --file-total-size=2G cleanup
參照隨機讀配置痘煤,可以接著測試隨機寫、隨機讀寫猿规、順序?qū)懼钥臁㈨樞蜃x等所有這些模式。