SSD性能測試第一神器——FIO
對于SSD性能測試來說,最好的工具莫過于FIO了。
FIO作者Jens大神
圖中這個可愛的小伙子名字叫Jens Axboe,他是丹麥哥本哈根大學(xué)計算機(jī)系沒畢業(yè)的學(xué)生,他還有一個有名的同鄉(xiāng)叫Linus,沒想到老鄉(xiāng)后來也成了他的領(lǐng)導(dǎo)。Jens今年(2017年)40歲,16歲開始就接觸Linux,后來也成了Linux開發(fā)者,現(xiàn)在是Linux Kernel大拿了,負(fù)責(zé)塊設(shè)備層的維護(hù)。這個塊設(shè)備層就是跟我們SSD關(guān)系最緊密的層級,聯(lián)系了上層文件系統(tǒng)和下層設(shè)備驅(qū)動程序。他開發(fā)了不少有用的程序,比如Linux IO Scheduler里面的Deadline, CFQ Scheduler,還有著名的王牌測試工具FIO。Jens曾經(jīng)在Fusion-IO、Oracle等公司工作,現(xiàn)在在Facebook,阿呆聽說在硅谷Facebook給碼農(nóng)的薪水是最高的。
FIO是Jens開發(fā)的一個開源測試工具,功能非常強(qiáng)大,本文就只介紹其中一些基本功能。
線程,隊列深度,Offset,同步異步,DirectIO,BIO
使用FIO之前,首先要有一些SSD性能測試的基礎(chǔ)知識。
線程指的是同時有多少個讀或?qū)懭蝿?wù)在并行執(zhí)行,一般來說,CPU里面的一個核心同一時間只能運(yùn)行一個線程。如果只有一個核心,要想運(yùn)行多線程,只能使用時間切片,每個線程跑一段時間片,所有線程輪流使用這個核心。Linux使用Jiffies來代表一秒鐘被劃分成了多少個時間片,一般來說Jiffies是1000或100,所以時間片就是1毫秒或10毫秒。
一般電腦發(fā)送一個讀寫命令到SSD只需要幾微秒,但是SSD要花幾百微秒甚至幾毫秒才能執(zhí)行完這個命令。如果發(fā)一個讀寫命令,然后線程一直休眠,等待結(jié)果回來才喚醒處理結(jié)果,這種叫做同步模式。可以想象,同步模式是很浪費(fèi)SSD性能的,因為SSD里面有很多并行單元,比如一般企業(yè)級SSD內(nèi)部有8-16個數(shù)據(jù)通道,每個通道內(nèi)部有4-16個并行邏輯單元(LUN,Plane),所以同一時間可以執(zhí)行32-256個讀寫命令。同步模式就意味著,只有其中一個并行單元在工作,暴殄天物。
為了提高并行性,大部分情況下SSD讀寫采用的是異步模式。就是用幾微秒發(fā)送命令,發(fā)完線程不會傻傻的在那里等,而是繼續(xù)發(fā)后面的命令。如果前面的命令執(zhí)行完了,SSD通知會通過中斷或者輪詢等方式告訴CPU,CPU來調(diào)用該命令的回調(diào)函數(shù)來處理結(jié)果。這樣的好處是,SSD里面幾十上百個并行單元大家都能分到活干,效率暴增。
不過,在異步模式下,CPU不能一直無限的發(fā)命令到SSD。比如SSD執(zhí)行讀寫如果發(fā)生了卡頓,那有可能系統(tǒng)會一直不停的發(fā)命令,幾千個,甚至幾萬個,這樣一方面SSD扛不住,另一方面這么多命令會很占內(nèi)存,系統(tǒng)也要掛掉了。這樣,就帶來一個參數(shù)叫做隊列深度。舉個例子,隊列深度64就是說,系統(tǒng)發(fā)的命令都發(fā)到一個大小為64的隊列,如果填滿了就不能再發(fā)。等前面的讀寫命令執(zhí)行完了,隊列里面空出位置來,才能繼續(xù)填命令。
一個SSD或者文件有大小,測試讀寫的時候設(shè)置Offset就可以從某個偏移地址開始測試。比如從offset=4G的偏移地址開始。
Linux讀寫的時候,內(nèi)核維護(hù)了緩存,數(shù)據(jù)先寫到緩存,后面再后臺寫到SSD。讀的時候也優(yōu)先讀緩存里的數(shù)據(jù)。這樣速度可以加快,但是一旦掉電緩存里的數(shù)據(jù)就沒了。所以有一種模式叫做DirectIO,跳過緩存,直接讀寫SSD。
Linux讀寫SSD等塊設(shè)備使用的是BIO,Block-IO,這是個數(shù)據(jù)結(jié)構(gòu),包含了數(shù)據(jù)塊的邏輯地址LBA,數(shù)據(jù)大小和內(nèi)存地址等。
FIO初體驗
一般Linux系統(tǒng)是自帶FIO的,如果沒有或者版本太老,要自己從https://github.com/axboe/fio下載最新版本源代碼編譯安裝。進(jìn)入代碼主目錄,輸入下列命令就編譯安裝好了。
./configure;make && make install
幫助文檔用下面命令查看:
man fio
先來看一個簡單的例子:
fio -rw=randwrite -ioengine=libaio -direct=1 –thread –numjobs=1 -iodepth=64 -filename=/dev/sdb4 -size=10G -name=job1 -offset=0MB -bs=4k -name=job2 -offset=10G -bs=512 –output TestResult.log
每一項的意思都可以從fio幫助文檔查到,這里的參數(shù)解釋如下:
fio:軟件名稱。
-rw=randwrite:讀寫模式,randwrite是隨機(jī)寫測試,還有順序讀read,順序?qū)憌rite,隨機(jī)讀randread,混合讀寫等。
-ioengine=libaio:libaio指的是異步模式,如果是同步就要用sync。
-direct=1:是否使用directIO。
-thread:使用pthread_create創(chuàng)建線程,另一種是fork創(chuàng)建進(jìn)程。進(jìn)程的開銷比線程要大,一般都采用thread測試。
–numjobs=1:每個job是1個線程,這里用了幾,后面每個用-name指定的任務(wù)就開幾個線程測試。所以最終線程數(shù)=任務(wù)數(shù)* numjobs。
-iodepth=64:隊列深度64.
-filename=/dev/sdb4:數(shù)據(jù)寫到/dev/sdb4這個盤(塊設(shè)備)。這里可以是一個文件名,也可以是分區(qū)或者SSD。
-size=10G:每個線程寫入數(shù)據(jù)量是10GB。
-name=job1:一個任務(wù)的名字,名字隨便起,重復(fù)了也沒關(guān)系。這個例子指定了job1和job2,建立了兩個任務(wù),共享-name=job1之前的參數(shù)。-name之后的就是這個任務(wù)獨(dú)有的參數(shù)。
-offset=0MB:從偏移地址0MB開始寫。
-bs=4k:每一個BIO命令包含的數(shù)據(jù)大小是4KB。一般4KB IOPS測試,就是在這里設(shè)置。
–output TestResult.log:日志輸出到TestResult.log。
FIO結(jié)果解析
我們來看一個FIO測試隨機(jī)讀的結(jié)果。命令如下,2個任務(wù)并行測試,隊列深度64,異步模式,每個任務(wù)測試數(shù)據(jù)1GB,每個數(shù)據(jù)塊4KB。所以,這個命令是在測試兩個線程、隊列深度64下的4KB隨機(jī)讀IOPS。
# fio -rw=randread -ioengine=libaio -direct=1 -iodepth=64 -filename=/dev/sdc -size=1G -bs=4k -name=job1 -offset=0G -name=job2 -offset=10G
job1: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
job2: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.13
Starting 2 processes
Jobs: 2 (f=2)
job1: (groupid=0, jobs=1): err= 0: pid=27752: Fri Jul 28 14:16:50 2017
read : io=1024.0MB, bw=392284KB/s, iops=98071, runt= 2673msec
slat (usec): min=6, max=79, avg= 9.05, stdev= 2.04
clat (usec): min=148, max=1371, avg=642.89, stdev=95.08
lat (usec): min=157, max=1380, avg=651.94, stdev=95.16
clat percentiles (usec):
| 1.00th=[ 438], 5.00th=[ 486], 10.00th=[ 516], 20.00th=[ 564],
| 30.00th=[ 596], 40.00th=[ 620], 50.00th=[ 644], 60.00th=[ 668],
| 70.00th=[ 692], 80.00th=[ 724], 90.00th=[ 756], 95.00th=[ 796],
| 99.00th=[ 884], 99.50th=[ 924], 99.90th=[ 1004], 99.95th=[ 1048],
| 99.99th=[ 1144]
lat (usec) : 250=0.01%, 500=6.82%, 750=81.14%, 1000=11.93%
lat (msec) : 2=0.11%
cpu : usr=9.09%, sys=90.08%, ctx=304, majf=0, minf=98
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued : total=r=262144/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=64
job2: (groupid=0, jobs=1): err= 0: pid=27753: Fri Jul 28 14:16:50 2017
read : io=1024.0MB, bw=447918KB/s, iops=111979, runt= 2341msec
slat (usec): min=5, max=41, avg= 6.30, stdev= 0.79
clat (usec): min=153, max=1324, avg=564.61, stdev=100.40
lat (usec): min=159, max=1331, avg=570.90, stdev=100.41
clat percentiles (usec):
| 1.00th=[ 354], 5.00th=[ 398], 10.00th=[ 430], 20.00th=[ 474],
| 30.00th=[ 510], 40.00th=[ 540], 50.00th=[ 572], 60.00th=[ 596],
| 70.00th=[ 620], 80.00th=[ 644], 90.00th=[ 684], 95.00th=[ 724],
| 99.00th=[ 804], 99.50th=[ 844], 99.90th=[ 932], 99.95th=[ 972],
| 99.99th=[ 1096]
lat (usec) : 250=0.03%, 500=27.57%, 750=69.57%, 1000=2.79%
lat (msec) : 2=0.04%
cpu : usr=11.62%, sys=75.60%, ctx=35363, majf=0, minf=99
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued : total=r=262144/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
READ: io=2048.0MB,aggrb=784568KB/s, minb=392284KB/s, maxb=447917KB/s, mint=2341msec, maxt=2673msec
Disk stats (read/write):
sdc: ios=521225/0, merge=0/0, ticks=277357/0, in_queue=18446744073705613924, util=100.00%
FIO會為每個Job打印統(tǒng)計信息。最后面是合計的數(shù)值。我們一般看重的總的性能和延遲。
首先看的是最后總的帶寬,aggrb=784568KB/s,算成4KB就是196KIOPS。
再來看看延遲Latency。Slat是發(fā)命令時間,slat (usec): min=6, max=79, avg= 9.05, stdev= 2.04說明最短時間6微秒,最長79微秒,平均9微秒,標(biāo)準(zhǔn)差2.04。clat是命令執(zhí)行時間,lat就是總的延遲。看得出來,讀的平均延遲在571微秒左右。
clat percentiles (usec)給出了延遲的統(tǒng)計分布。比如90.00th=[684]說明90%的讀命令延遲都在684微秒以內(nèi)。
用FIO做數(shù)據(jù)校驗
用FIO可以檢驗寫入數(shù)據(jù)是否出錯。用-verify=str來選擇校驗算法,有md5 crc16 crc32 crc32c crc32c-intel crc64 crc7 sha256 sha512 sha1等。為了校驗,需要用do_verify參數(shù)。如果是寫,那么do_verify=1就意味著寫完再讀校驗,這種會很占內(nèi)存,因為FIO會把每個數(shù)據(jù)塊的校驗數(shù)據(jù)保存在內(nèi)存里。do_verify=0時只寫校驗數(shù)據(jù),不做讀校驗。
讀的時候do_verify=1,那么讀出來的數(shù)據(jù)都會做校驗值檢查,do_verify=0的話,只讀數(shù)據(jù),不做檢查。
另外,verify=meta時,fio會在數(shù)據(jù)塊內(nèi)寫入時間戳、邏輯地址等,此時還能verify_pattern指定寫入數(shù)據(jù)pattern。
FIO其他功能
FIO功能非常強(qiáng)大,可以通過man來查看每一個功能,也有網(wǎng)頁版幫助文檔https://linux.die.net/man/1/fio。
FIO配置文件
前面的例子都是用命令行來測試,其實也可以用配置文件把這些參數(shù)寫進(jìn)去。比如新建FIO配置文件test.log內(nèi)容如下:
[global]
filename=/dev/sdc
direct=1
iodepth=64
thread
rw=randread
ioengine=libaio
bs=4k
numjobs=1
size=10G
[job1]
name=job1
offset=0
[job2]
name=job2
offset=10G
;–end job file
保存后,只需要fio test.log就能執(zhí)行測試任務(wù)了。是不是很方便?
AS SSD Benchmark
AS SSD Benchmark測試指標(biāo)
AS SSD Benchmark是一款來自德國的SSD專用測試軟件,可以測試連續(xù)讀寫、4K對齊、4KB隨機(jī)讀寫和響應(yīng)時間的表現(xiàn),并給出一個綜合評分。另外有兩種模式可選,即MB/s與IOPS!
AS SSD Benchmark在測試時一共會生成和寫入5GB的測試數(shù)據(jù)文件,所有3個測試傳輸率項目都是去讀寫這些數(shù)據(jù)文件來換算速度的。其4KB QD64主要是用來測NCQ(NativeCommand Queuing,原生命令隊列)差距的。IDE模式下就和普通4KB隨機(jī)沒有任何區(qū)別。由于每個測試都需要進(jìn)行一定大小的數(shù)據(jù)讀寫,硬盤性能越低,測試需要花費(fèi)的時間就越久,拿機(jī)械硬盤來跑這個測試并不適宜,跑完全程大約需要1個小時左右。尋址時間測試,讀取是測試尋址隨機(jī)的4KB文件(全盤LBA區(qū)域),寫入是測試尋址隨機(jī)的512B文件(指定的1GB地址范圍)。注意,運(yùn)行AS SSD基準(zhǔn)測試至少需要2GB的空閑空間。
AS SSD Benchmark除了可以測試SSD的性能外,還可以檢測出SSD的固件算法,是否打開AHCI模式,是否進(jìn)行4K對齊等(如圖7-3所示),是目前應(yīng)用十分廣泛的SSD測試軟件。
AS SSD Benchmark使用的測試數(shù)據(jù)是隨機(jī)的。
ATTO Disk Benchmark
ATTO Disk Benchmark是一款簡單易用的磁盤傳輸速率檢測軟件,可以用來檢測硬盤、U盤、存儲卡及其它可移動磁盤的讀取及寫入速率。該軟件使用了不同大小的數(shù)據(jù)測試包,數(shù)據(jù)包按512B、1K、 2K直到到8K進(jìn)行讀寫測試,測試完成后數(shù)據(jù)用柱狀圖的形式表達(dá)出來,體現(xiàn)文件大小比例不同對磁盤速度的影響。
ATTO測試是極限情況下的磁盤持續(xù)讀寫性能,采用的測試模型具有很高的可壓縮性,ATTO默認(rèn)測試全0數(shù)據(jù)。
CrystalDiskMark
CrystalDiskMark測試指標(biāo)
CrystalDiskMark軟件是一個測試硬盤或者存儲設(shè)備的小巧工具,測試存儲設(shè)備大小和測試次數(shù)都可以選擇。測試項目里分為,持續(xù)傳輸率測試(塊單位1024KB),隨機(jī)512KB傳輸率測試,隨機(jī)4KB測試,隨機(jī)4KB QD32(隊列深度32)測試。CrystalDiskMark默認(rèn)運(yùn)行5次,每次1000MB的數(shù)據(jù)量,取最好成績。CrystalDiskMark軟件測試前,同樣會生成一個測試文件(大小取決于用戶設(shè)置)。一般來說,設(shè)置得越大,數(shù)據(jù)緩存起到的干擾越少,成績就更能反映SSD的真實性能,不過缺點是會嚴(yán)重影響SSD的耐久度(寫入太多數(shù)據(jù)影響P/E)。所以一般測試時都采納軟件默認(rèn)值。
CrystalDiskMark設(shè)置不同填充Pattern
軟件默認(rèn)測試數(shù)據(jù)為不可壓縮數(shù)據(jù)。如果設(shè)置選項中選擇了
PCMark Vantage
PCMark Vantage可以衡量各種類型PC的綜合性能。從多媒體家庭娛樂系統(tǒng)到筆記本,從專業(yè)工作站到高端游戲平臺,無論是在專業(yè)人士手中,還是屬于普通用戶,都能在PCMark Vantage里了解透徹,從而發(fā)揮最大性能。測試內(nèi)容可以分為以下三個部分:
1、處理器測試:基于數(shù)據(jù)加密、解密、壓縮、解壓縮、圖形處理、音頻和視頻轉(zhuǎn)碼、文本編輯、網(wǎng)頁渲染、郵件功能、處理器人工智能游戲測試、聯(lián)系人創(chuàng)建與搜索。
2、圖形測試:基于高清視頻播放、顯卡圖形處理、游戲測試。
3、硬盤測試:使用Windows Defender、《Alan Wake》游戲、圖像導(dǎo)入、Windows Vista啟動、視頻編輯、媒體中心使用、Windows Media Player搜索和歸類,以及以下程序的啟動:Office Word 2007、Adobe Photoshop CS2、Internet Explorer、Outlook 2007。
IOMeter
IOMeter應(yīng)用截圖
IOMeter是一個單機(jī)或者集群的I/O子系統(tǒng)測量和描述工具。與前面介紹的測試軟件相比較,IOMeter在測試軟件中是屬于比較自由的,用戶可以按照測試需求去配置測試磁盤數(shù)據(jù)范圍,隊列深度,數(shù)據(jù)模式(可壓縮或者不可壓縮,有些版本支持,有些老版本不支持),測試模式(隨機(jī)或者順序訪問),讀寫測試比例,隨機(jī)和順序訪問比例,以及測試時間等等。
本地IO性能測試
啟動程序,在windows上單擊IOMeter圖標(biāo);
在“Disk Targets”頁中選擇一個驅(qū)動器;
在“AccessSpecifications”頁中選擇一個需要的測試項目;
在“ResultsDisplay”頁中設(shè)置“Update Frequency (Seconds)”設(shè)置多長時間統(tǒng)計一次測試結(jié)果,如果不設(shè)置不但在測試期間不顯示測試結(jié)果而且在測試結(jié)束后在測試結(jié)果文件中也沒有數(shù)據(jù);
·Total I/Os per Second:數(shù)據(jù)存取速度,該值越大越好。
·Total MBs per Second:數(shù)據(jù)傳輸速度,該值越大越好。
·Average I/O Response Time:平均響應(yīng)時間,該值越小越好。
·CPU Utilization:CPU占用率,越低越好。
單擊工具欄中的“StartTests”按鈕,選擇一個測試結(jié)果輸出文件后開始一個測試(一般一次測試運(yùn)行10分鐘即可);
測試完成后單擊按鈕停止所有測試。
查看測試結(jié)果,由于IOMeter沒有提供一個GUI的查看測試報告的工具??梢允褂肊xcel打開測試結(jié)果文件“csv”,然后利用Excel的圖標(biāo)工具整理測試結(jié)果。或者使用IOMeter提供的“Import Wizard for MS Access”將測試結(jié)果導(dǎo)入一個Access文件。
-
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211576 -
SSD
+關(guān)注
關(guān)注
21文章
2857瀏覽量
117368 -
性能測試
+關(guān)注
關(guān)注
0文章
209瀏覽量
21327
原文標(biāo)題:招標(biāo)和選購固態(tài)硬盤主流測試軟件詳解
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論