sysbench 是一個(gè)非常經(jīng)典的綜合性能測(cè)試工具,通常都用它來(lái)做數(shù)據(jù)庫(kù)的性能壓測(cè),但也可以用來(lái)做CPU,IO的性能測(cè)試。而對(duì)于IO測(cè)試,不是很推薦sysbench,倒不是說(shuō)它有錯(cuò)誤,工具本身沒(méi)有任何問(wèn)題,它的測(cè)試方法導(dǎo)致測(cè)試的數(shù)據(jù)會(huì)讓人有些困惑:性能數(shù)據(jù)到底是不是這樣呢,跟云廠商承諾的性能有關(guān)系嘛。一般我們都用FIO來(lái)進(jìn)行性能測(cè)試,云廠商都推薦用FIO進(jìn)行性能測(cè)試,通過(guò)FIO性能測(cè)試,都能輕易達(dá)到云廠商承諾的性能。
插曲:關(guān)于sysbench的版本,現(xiàn)在主要有0.4.12和1.0.版本。截止2006年sysbench好長(zhǎng)時(shí)間沒(méi)有發(fā)展,2017年之前都是用舊版本0.4.12(所以網(wǎng)上一搜一大堆文章都是0.4.的教程),然后作者估計(jì)修了幾個(gè)bug,變成0.5版本,然后就跟過(guò)去做了告別,從2017重新開發(fā)了一個(gè)新版本sysbench 1.0.*,這里講述的性能測(cè)試都是用了最新版。
1. sysbench fileio測(cè)試
言歸正傳,sysbench怎么做IO的性能測(cè)試呢,sysbench fileio help,參數(shù)如下:
#/usr/local/sysbench_1/bin/sysbench?fileio?helpsysbench?1.0.9?(using?bundled?LuaJIT?2.1.0-beta2)
fileio?options:
??--file-num=N??????????????number?of?files?to?create?[128]
??--file-block-size=N???????block?size?to?use?in?all?IO?operations?[16384]
??--file-total-size=SIZE????total?size?of?files?to?create?[2G]
??--file-test-mode=STRING???test?mode?{seqwr,?seqrewr,?seqrd,?rndrd,?rndwr,?rndrw}
??--file-io-mode=STRING?????file?operations?mode?{sync,async,mmap}?[sync]
??--file-async-backlog=N????number?of?asynchronous?operatons?to?queue?per?thread?[128]
??--file-extra-flags=STRING?additional?flags?to?use?on?opening?files?{sync,dsync,direct}?[]
??--file-fsync-freq=N???????do?fsync()?after?this?number?of?requests?(0?-?don't?use?fsync())?[100]
??--file-fsync-all[=on|off]?do?fsync()?after?each?write?operation?[off]
??--file-fsync-end[=on|off]?do?fsync()?at?the?end?of?test?[on]
??--file-fsync-mode=STRING??which?method?to?use?for?synchronization?{fsync,?fdatasync}?[fsync]
??--file-merged-requests=N??merge?at?most?this?number?of?IO?requests?if?possible?(0?-?don't?merge)?[0]
??--file-rw-ratio=N?????????reads/writes?ratio?for?combined?test?[1.5]sysbench的性能測(cè)試都需要做prepare,run,cleanup這三步,準(zhǔn)備數(shù)據(jù),跑測(cè)試,刪除數(shù)據(jù)。那下面就開始實(shí)戰(zhàn):
客戶用2C4G的vm,掛載120G的SSD云盤做了性能測(cè)試,測(cè)試命令如下:
cd?/mnt/vdb??#一定要到你測(cè)試的磁盤目錄下執(zhí)行,否則可能測(cè)試系統(tǒng)盤了sysbench?fileio?--file-total-size=15G?--file-test-mode=rndrw?--time=300?--max-requests=0?prepare sysbench?fileio?--file-total-size=15G?--file-test-mode=rndrw?--time=300?--max-requests=0?run sysbench?fileio?--file-total-size=15G?--file-test-mode=rndrw?--time=300?--max-requests=0?cleanup
結(jié)果如下:
File?operations: ????reads/s:??????????????????????2183.76 ????writes/s:?????????????????????1455.84 ????fsyncs/s:?????????????????????4658.67Throughput:????read,?MiB/s:??????????????????34.12 ????written,?MiB/s:???????????????22.75General?statistics: ????total?time:??????????????????????????300.0030s ????total?number?of?events:??????????????2489528Latency?(ms): ?????????min:??????????????????????????????????0.00 ?????????avg:??????????????????????????????????0.12 ?????????max:????????????????????????????????204.04 ?????????95th?percentile:??????????????????????0.35 ?????????sum:?????????????????????????????298857.30Threads?fairness: ????events?(avg/stddev):???????????2489528.0000/0.00 ????execution?time?(avg/stddev):???298.8573/0.00
隨機(jī)讀寫性能好像不咋地,換算IOPS為(34.12+22.75)*1024/16.384=3554.375,與宣稱的5400IOPS有很大差距。眼尖的人肯定發(fā)現(xiàn)只有2個(gè)核,去遍歷128個(gè)文件,好像會(huì)降低效率,于是定制file-num去做了系列測(cè)試,測(cè)試結(jié)果如下:
| file-num | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
|---|---|---|---|---|---|---|---|---|
| read(MB/s) | 57.51 | 57.3 | 57.36 | 57.33 | 55.12 | 47.72 | 41.11 | 34.12 |
| write(MB/s) | 38.34 | 38.2 | 38.24 | 38.22 | 36.75 | 31.81 | 27.4 | 22.75 |
明顯可以看到,默認(rèn)測(cè)試方法會(huì)導(dǎo)致性能下降,文件數(shù)設(shè)置為1達(dá)到最大性能。
那file-num=128與file-num=1的區(qū)別是測(cè)試文件從128個(gè)變成1個(gè),但是總文件大小都是15G,都是隨機(jī)讀寫,按理性能應(yīng)該是一致的,區(qū)別是會(huì)在多個(gè)文件之間切換讀寫,那么可能會(huì)導(dǎo)致中斷增加和上下文切換開銷增大。通過(guò)vmstat命令得到了驗(yàn)證:
file-num=128的vmstat輸出是這樣的:
file-num=1的vmstat輸出是這樣的:
從上面兩個(gè)圖可以看出file-num=1的時(shí)候上下文切換只有8500左右比f(wàn)ile-num=128的時(shí)候24800小多了,in(中斷)也少太多了。減少了中斷和上下文切換開銷,吞吐能力顯著提升了。
再做了一個(gè)實(shí)驗(yàn),同樣磁盤大小,改成掛載到8C的vm下,改成8線程進(jìn)行測(cè)試,得到如下數(shù)據(jù):
| file-num | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
|---|---|---|---|---|---|---|---|---|
| read(MB/s) | 253.08 | 209.86 | 193.38 | 159.73 | 117.98 | 86.78 | 67.39 | 51.98 |
| write(MB/s) | 168.72 | 139.9 | 128.92 | 106.49 | 78.66 | 57.85 | 44.93 | 34.65 |
可以得出同樣的結(jié)論,file-num=1可以得到最好的性能,理由如上。
2. 與fio測(cè)試的比較
單進(jìn)程下,file-num=1換算到IOPS為(57.51+38.34)*1024/16.384=5990.625,這好像超過(guò)我們的IOPS設(shè)置限定了。通過(guò)fio是怎么測(cè)得這個(gè)IOPS的呢:
fio?-direct=1?-iodepth=128?-rw=randrw?-ioengine=libaio?-bs=4k?-size=1G?-numjobs=1?-runtime=1000?-group_reporting?-filename=iotest?-name=randrw_test
通過(guò)閱讀源代碼,發(fā)現(xiàn)很多不同:
一個(gè)是通過(guò)libaio,一個(gè)是通過(guò)pwrite/pread。libaio的性能是非常強(qiáng)勁的,詳情可以參考文章。
即使ioengine=psync,這個(gè)engine的讀寫方法是pread和pwrite,但是整個(gè)實(shí)現(xiàn)也是不一致的。fio測(cè)試的時(shí)候direct=1,就是每次都寫入磁盤,而sysbench默認(rèn)file-fsync-freq=100,也就是完成100次操作才會(huì)有一個(gè)fsync操作,這種操作涉及系統(tǒng)緩存。
3. 深入一步
上節(jié)認(rèn)為操作系統(tǒng)干擾以及io讀寫方式的差異,造成了測(cè)試數(shù)據(jù)的不一致。深入去研究了下源代碼,其實(shí)sysbench的作者是提倡用libaio,代碼里面大量地運(yùn)用了宏定義,如:
/*?異步寫的截取代碼?*/#ifdef?HAVE_LIBAIO
??else?if?(file_io_mode?==?FILE_IO_MODE_ASYNC)
??{????/*?Use?asynchronous?write?*/
????io_prep_pwrite(&iocb,?fd,?buf,?count,?offset);????if?(file_submit_or_wait(&iocb,?FILE_OP_TYPE_WRITE,?count,?thread_id))??????return?0;????return?count;
??}#endif那怎么啟用這個(gè)宏呢,默認(rèn)就是啟用這個(gè)宏的。
啟用這個(gè)宏后,執(zhí)行sysbench fileio help,會(huì)發(fā)現(xiàn)有這一項(xiàng):--file-async-backlog=N number of asynchronous operatons to queue per thread [128],說(shuō)明HAVE_LIBAIO這個(gè)宏確實(shí)生效了。
既然sysbench默認(rèn)有l(wèi)ibaio后,那整個(gè)測(cè)試方法需要調(diào)整:
#?--file-extra-flags=direct?文件讀寫模式改成direct#?--file-io-mode=async?確保libaio起效#?--file-fsync-freq=0?不需要執(zhí)行fsyncsysbench?fileio?--file-total-size=15G?--file-test-mode=rndrw?--time=300?--max-requests=0?--file-io-mode=async?--file-extra-flags=direct??--file-num=1?--file-rw-ratio=1?--file-fsync-freq=0?run
得到測(cè)試結(jié)果如下:
對(duì)于FIO命令也進(jìn)行了調(diào)整,把bs調(diào)整成16k,其他不變,還是達(dá)到上限5400。測(cè)試結(jié)果如下:
可以看到sysbench測(cè)試的效果與fio的測(cè)試效果完全一致!
不過(guò)個(gè)人還是推薦FIO來(lái)做IO的性能測(cè)試。
電子發(fā)燒友App







































































評(píng)論