如何用sysbench做好IO性能測試

sysbench 是一個非常經典的綜合性能測試工具,通常都用它來做數據庫的性能壓測,但也可以用來做CPU,IO的性能測試。而對于IO測試,不是很推薦sysbench,倒不是說它有錯誤,工具本身沒有任何問題,它的測試方法導致測試的數據會讓人有些困惑:性能數據到底是不是這樣呢,跟云廠商承諾的性能有關系嘛。一般我們都用FIO來進行性能測試,云廠商都推薦用FIO進行性能測試,通過FIO性能測試,都能輕易達到云廠商承諾的性能。

插曲:關于sysbench的版本,現在主要有0.4.12和1.0.
版本。截止2006年sysbench好長時間沒有發展,2017年之前都是用舊版本0.4.12(所以網上一搜一大堆文章都是0.4.
的教程),然后作者估計修了幾個bug,變成0.5版本,然后就跟過去做了告別,從2017重新開發了一個新版本sysbench 1.0.*,這里講述的性能測試都是用了最新版。

1. sysbench fileio測試

言歸正傳,sysbench怎么做IO的性能測試呢,sysbench fileio help,參數如下:

#/usr/local/sysbench_1/bin/sysbench fileio help
sysbench 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的性能測試都需要做prepare,run,cleanup這三步,準備數據,跑測試,刪除數據。那下面就開始實戰:
客戶用2C4G的vm,掛載120G的SSD云盤做了性能測試,測試命令如下:

cd /mnt/vdb  #一定要到你測試的磁盤目錄下執行,否則可能測試系統盤了
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復制代碼

結果如下:

File operations:reads/s:                      2183.76writes/s:                     1455.84fsyncs/s:                     4658.67Throughput:read, MiB/s:                  34.12written, MiB/s:               22.75General statistics:total time:                          300.0030stotal number of events:              2489528Latency (ms):min:                                  0.00avg:                                  0.12max:                                204.0495th percentile:                      0.35sum:                             298857.30Threads fairness:events (avg/stddev):           2489528.0000/0.00execution time (avg/stddev):   298.8573/0.00復制代碼

隨機讀寫性能好像不咋地,換算IOPS為(34.12+22.75)*1024/16.384=3554.375,與宣稱的5400IOPS有很大差距。眼尖的人肯定發現只有2個核,去遍歷128個文件,好像會降低效率,于是定制file-num去做了系列測試,測試結果如下:

file-num1248163264128
read(MB/s)57.5157.357.3657.3355.1247.7241.1134.12
write(MB/s)38.3438.238.2438.2236.7531.8127.422.75

明顯可以看到,默認測試方法會導致性能下降,文件數設置為1達到最大性能。
那file-num=128與file-num=1的區別是測試文件從128個變成1個,但是總文件大小都是15G,都是隨機讀寫,按理性能應該是一致的,區別是會在多個文件之間切換讀寫,那么可能會導致中斷增加和上下文切換開銷增大。通過vmstat命令得到了驗證:
file-num=128的vmstat輸出是這樣的:

file-num=1的vmstat輸出是這樣的:

從上面兩個圖可以看出file-num=1的時候上下文切換只有8500左右比file-num=128的時候24800小多了,in(中斷)也少太多了。減少了中斷和上下文切換開銷,吞吐能力顯著提升了。
再做了一個實驗,同樣磁盤大小,改成掛載到8C的vm下,改成8線程進行測試,得到如下數據:

file-num1248163264128
read(MB/s)253.08209.86193.38159.73117.9886.7867.3951.98
write(MB/s)168.72139.9128.92106.4978.6657.8544.9334.65

可以得出同樣的結論,file-num=1可以得到最好的性能,理由如上。

2. 與fio測試的比較

單進程下,file-num=1換算到IOPS為(57.51+38.34)*1024/16.384=5990.625,這好像超過我們的IOPS設置限定了。通過fio是怎么測得這個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復制代碼

通過閱讀源代碼,發現很多不同:

  1. 一個是通過libaio,一個是通過pwrite/pread。libaio的性能是非常強勁的,詳情可以參考文章。
    即使ioengine=psync,這個engine的讀寫方法是pread和pwrite,但是整個實現也是不一致的。
  2. fio測試的時候direct=1,就是每次都寫入磁盤,而sysbench默認file-fsync-freq=100,也就是完成100次操作才會有一個fsync操作,這種操作涉及系統緩存。

3. 深入一步

上節認為操作系統干擾以及io讀寫方式的差異,造成了測試數據的不一致。深入去研究了下源代碼,其實sysbench的作者是提倡用libaio,代碼里面大量地運用了宏定義,如:

/* 異步寫的截取代碼 */
#ifdef HAVE_LIBAIOelse 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復制代碼

那怎么啟用這個宏呢,默認就是啟用這個宏的。
啟用這個宏后,執行sysbench fileio help,會發現有這一項:--file-async-backlog=N number of asynchronous operatons to queue per thread [128],說明HAVE_LIBAIO這個宏確實生效了。
既然sysbench默認有libaio后,那整個測試方法需要調整:

# --file-extra-flags=direct 文件讀寫模式改成direct
# --file-io-mode=async 確保libaio起效
# --file-fsync-freq=0 不需要執行fsync
sysbench 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復制代碼

得到測試結果如下:

對于FIO命令也進行了調整,把bs調整成16k,其他不變,還是達到上限5400。測試結果如下:

可以看到sysbench測試的效果與fio的測試效果完全一致!
不過個人還是推薦FIO來做IO的性能測試。

轉載于:https://juejin.im/post/5c1c9ce5e51d451ffd254011

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388814.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

XCode、Objective-C、Cocoa 說的是幾樣東西

大部分有一點其他平臺開發基礎的初學者看到XCode,第一感想是磨拳擦掌,看到 Interface Builder之后,第一感想是躍躍欲試,而看到Objective-C的語法,第一感想就變成就望而卻步了。好吧,我是在說我自己。 如果…

java http2_探索HTTP/2: HTTP 2協議簡述(原)

探索HTTP/2: HTTP/2協議簡述HTTP/2的協議包含著兩個RFC:Hypertext Transfer Protocol Version 2 (RFC7540),即HTTP/2;HPACK: Header Compression for HTTP/2 (RFC7541),即HPACK。RFC7540描述了HTTP/2的語義,RFC7541則描…

錯誤處理

錯誤處理: 許多系統調用和函數在失敗后,會在失敗時設置外部變量errno的值來指明失敗原因。許多不同的函數庫都把這個變量作為報告錯誤的標準方法。程序必須在函數報告出錯后立刻檢查errno變量,因為它可能被下一個函數調用所覆蓋&#xff…

Android類庫介紹

Android類庫介紹 GPhone開發包Android SDK含了很多豐富的類庫: android.util 涉及系統底層的輔助類庫 android.os 提供了系統服務、消息傳輸、IPC管道 android.graphics GPhone圖形庫,包含了文本顯示、輸入輸出、文字樣式 android.database 包含底層的AP…

遞歸函數基例和鏈條_鏈條和叉子

遞歸函數基例和鏈條因果推論 (Causal Inference) This is the fifth post on the series we work our way through “Causal Inference In Statistics” a nice Primer co-authored by Judea Pearl himself.這是本系列的第五篇文章,我們通過“因果統計推斷”一書進行…

前端技能拾遺

本文主要是對自己前端知識遺漏點的總結和歸納,希望對大家有用,會持續更新的~ 解釋語言和編譯型語言 解釋型語言與編譯型語言的區別翻譯時間的不同。 編譯型語言在程序執行之前,有一個單獨的編譯過程,將程序翻譯成機器語言&#xf…

java lock 信號_java各種鎖(ReentrantLock,Semaphore,CountDownLatch)的實現原理

先放結論:主要是實現AbstractQueuedSynchronizer中進入和退出函數,控制不同的進入和退出條件,實現適用于各種場景下的鎖。JAVA中對于線程的同步提供了多種鎖機制,比較著名的有可重入鎖ReentrantLock,信號量機制Semapho…

Intent.ACTION_MAIN

1 Intent.ACTION_MAIN String: android.intent.action.MAIN 標識Activity為一個程序的開始。比較常用。 Input:nothing Output:nothing 例如&#xff1a; 1 <activity android:name".Main"android:label"string/app_name">2 <intent-filter…

足球預測_預測足球熱

足球預測By Aditya Pethe通過阿蒂亞皮特(Aditya Pethe) From September to January every year, football takes over America. Games dominate TV Sunday and Monday nights, and my brother tears his hair out each week over his consistently underperforming fantasy te…

C#的特性Attribute

一、什么是特性 特性是用于在運行時傳遞程序中各種元素&#xff08;比如類、方法、結構、枚舉、組件等&#xff09;的行為信息的聲明性標簽&#xff0c;這個標簽可以有多個。您可以通過使用特性向程序添加聲明性信息。一個聲明性標簽是通過放置在它所應用的元素前面的方括號&am…

java 技能鑒定_JAVA試題-技能鑒定

一、單選題1.以下創建了幾個對象( B)String A,B,CA"a";B"b":AAB;StringBuffer Dnew StringBuffer("abc");DD.append("567");A.6B.4C.3D.52.關于以下程序段&#xff0c;正確的說法是( C )1&#xff0e;String s1“a”“b”;2&#xff0…

ADD_SHORTCUT_ACTION

String ADD_SHORTCUT_ACTION 動作&#xff1a;在系統中添加一個快捷方式。. “android.intent.action.ADD_SHORTCUT”   String ALL_APPS_ACTION 動作&#xff1a;列舉所有可用的應用。   輸入&#xff1a;無。 “android.intent.action.ALL_APPS”   String ALTERNATIVE…

python3中樸素貝葉斯_貝葉斯統計:Python中從零開始的都會都市

python3中樸素貝葉斯你在這里 (You are here) If you’re reading this, odds are: (1) you’re interested in bayesian statistics but (2) you have no idea how Markov Chain Monte Carlo (MCMC) sampling methods work, and (3) you realize that all but the simplest, t…

java映射的概念_Java 反射 概念理解

文章來源:http://hollischuang.gitee.io/tobetopjavaer/#/basics/java-basic/reflection反射反射機制指的是程序在運行時能夠獲取自身的信息。在java中&#xff0c;只要給定類的名字&#xff0c;那么就可以通過反射機制來獲得類的所有屬性和方法。反射有什么作用在運行時判斷任…

【轉載】移動端布局概念總結

布局準備工作及布局思想及概念: 一個顯示器&#xff08;pc端顯示器 及 手機屏顯示器&#xff09;&#xff0c;既有物理像素&#xff0c;又有獨立像素&#xff08;獨立像素也叫作css像素&#xff0c;用于前端人員使用&#xff09;&#xff1b; -->重要 首先確定設計稿的尺寸…

深入淺出:HTTP/2

上篇文章深入淺出&#xff1a;5G和HTTP里給自己挖了一根深坑&#xff0c;說是要寫一篇關于HTTP/2的文章&#xff0c;今天來還賬了。 本文分為以下幾個部分&#xff1a; HTTP/2的背景HTTP/2的特點HTTP/2的協議分析HTTP/2的支持 HTTP/2簡介 HTTP/2主要是為了解決現HTTP 1.1性能不…

畫了個Android

畫了個Android 今晚瞎折騰&#xff0c;閑著沒事畫了個機器人——android&#xff0c;浪費了一個晚上的時間。畫這丫還真不容易&#xff0c;為那些坐標&#xff0c;差點砸了鍵盤&#xff0c;好在最后畫出個有模有樣的&#xff0c;心稍安。 下面來看看畫這么個機器人需要些什么東…

數據治理 主數據 元數據_我們對數據治理的誤解

數據治理 主數據 元數據Data governance is top of mind for many of my customers, particularly in light of GDPR, CCPA, COVID-19, and any number of other acronyms that speak to the increasing importance of data management when it comes to protecting user data.…

mysql 選擇前4個_mysql從4個表中選擇

不要認為GROUP BY是必需的 . 雖然如果一個孩子有2個父記錄&#xff0c;你可能想用它來將2個父母分組到一行 - 但不確定這是否是你的要求 . 因為如果一個孩子有2個父母&#xff0c;那么將為該孩子返回的父母是未定義的 .假設所有孩子都有父母&#xff0c;所有父母都會有姓&#…

提高機器學習質量的想法_如何提高機器學習的數據質量?

提高機器學習質量的想法The ultimate goal of every data scientist or Machine Learning evangelist is to create a better model with higher predictive accuracy. However, in the pursuit of fine-tuning hyperparameters or improving modeling algorithms, data might …