SSD性能測試第一神器——FIO
對(duì)于SSD性能測試來說,最好的工具莫過于FIO了。
FIO作者Jens大神
圖中這個(gè)可愛的小伙子名字叫Jens Axboe,他是丹麥哥本哈根大學(xué)計(jì)算機(jī)系沒畢業(yè)的學(xué)生,他還有一個(gè)有名的同鄉(xiāng)叫Linus,沒想到老鄉(xiāng)后來也成了他的領(lǐng)導(dǎo)。Jens今年(2017年)40歲,16歲開始就接觸Linux,后來也成了Linux開發(fā)者,現(xiàn)在是Linux Kernel大拿了,負(fù)責(zé)塊設(shè)備層的維護(hù)。這個(gè)塊設(shè)備層就是跟我們SSD關(guān)系最緊密的層級(jí),聯(lián)系了上層文件系統(tǒng)和下層設(shè)備驅(qū)動(dòng)程序。他開發(fā)了不少有用的程序,比如Linux IO Scheduler里面的Deadline, CFQ Scheduler,還有著名的王牌測試工具FIO。Jens曾經(jīng)在Fusion-IO、Oracle等公司工作,現(xiàn)在在Facebook,阿呆聽說在硅谷Facebook給碼農(nóng)的薪水是最高的。
FIO是Jens開發(fā)的一個(gè)開源測試工具,功能非常強(qiáng)大,本文就只介紹其中一些基本功能。
線程,隊(duì)列深度,Offset,同步異步,DirectIO,BIO
使用FIO之前,首先要有一些SSD性能測試的基礎(chǔ)知識(shí)。
線程指的是同時(shí)有多少個(gè)讀或?qū)懭蝿?wù)在并行執(zhí)行,一般來說,CPU里面的一個(gè)核心同一時(shí)間只能運(yùn)行一個(gè)線程。如果只有一個(gè)核心,要想運(yùn)行多線程,只能使用時(shí)間切片,每個(gè)線程跑一段時(shí)間片,所有線程輪流使用這個(gè)核心。Linux使用Jiffies來代表一秒鐘被劃分成了多少個(gè)時(shí)間片,一般來說Jiffies是1000或100,所以時(shí)間片就是1毫秒或10毫秒。
一般電腦發(fā)送一個(gè)讀寫命令到SSD只需要幾微秒,但是SSD要花幾百微秒甚至幾毫秒才能執(zhí)行完這個(gè)命令。如果發(fā)一個(gè)讀寫命令,然后線程一直休眠,等待結(jié)果回來才喚醒處理結(jié)果,這種叫做同步模式??梢韵胂?,同步模式是很浪費(fèi)SSD性能的,因?yàn)镾SD里面有很多并行單元,比如一般企業(yè)級(jí)SSD內(nèi)部有8-16個(gè)數(shù)據(jù)通道,每個(gè)通道內(nèi)部有4-16個(gè)并行邏輯單元(LUN,Plane),所以同一時(shí)間可以執(zhí)行32-256個(gè)讀寫命令。同步模式就意味著,只有其中一個(gè)并行單元在工作,暴殄天物。
為了提高并行性,大部分情況下SSD讀寫采用的是異步模式。就是用幾微秒發(fā)送命令,發(fā)完線程不會(huì)傻傻的在那里等,而是繼續(xù)發(fā)后面的命令。如果前面的命令執(zhí)行完了,SSD通知會(huì)通過中斷或者輪詢等方式告訴CPU,CPU來調(diào)用該命令的回調(diào)函數(shù)來處理結(jié)果。這樣的好處是,SSD里面幾十上百個(gè)并行單元大家都能分到活干,效率暴增。
不過,在異步模式下,CPU不能一直無限的發(fā)命令到SSD。比如SSD執(zhí)行讀寫如果發(fā)生了卡頓,那有可能系統(tǒng)會(huì)一直不停的發(fā)命令,幾千個(gè),甚至幾萬個(gè),這樣一方面SSD扛不住,另一方面這么多命令會(huì)很占內(nèi)存,系統(tǒng)也要掛掉了。這樣,就帶來一個(gè)參數(shù)叫做隊(duì)列深度。舉個(gè)例子,隊(duì)列深度64就是說,系統(tǒng)發(fā)的命令都發(fā)到一個(gè)大小為64的隊(duì)列,如果填滿了就不能再發(fā)。等前面的讀寫命令執(zhí)行完了,隊(duì)列里面空出位置來,才能繼續(xù)填命令。
一個(gè)SSD或者文件有大小,測試讀寫的時(shí)候設(shè)置Offset就可以從某個(gè)偏移地址開始測試。比如從offset=4G的偏移地址開始。
Linux讀寫的時(shí)候,內(nèi)核維護(hù)了緩存,數(shù)據(jù)先寫到緩存,后面再后臺(tái)寫到SSD。讀的時(shí)候也優(yōu)先讀緩存里的數(shù)據(jù)。這樣速度可以加快,但是一旦掉電緩存里的數(shù)據(jù)就沒了。所以有一種模式叫做DirectIO,跳過緩存,直接讀寫SSD。
Linux讀寫SSD等塊設(shè)備使用的是BIO,Block-IO,這是個(gè)數(shù)據(jù)結(jié)構(gòu),包含了數(shù)據(jù)塊的邏輯地址LBA,數(shù)據(jù)大小和內(nèi)存地址等。
FIO初體驗(yàn)
一般Linux系統(tǒng)是自帶FIO的,如果沒有或者版本太老,要自己從https://github.com/axboe/fio下載最新版本源代碼編譯安裝。進(jìn)入代碼主目錄,輸入下列命令就編譯安裝好了。
./configure;make && make install
幫助文檔用下面命令查看:
man fio
先來看一個(gè)簡單的例子:
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
每一項(xiàng)的意思都可以從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:每個(gè)job是1個(gè)線程,這里用了幾,后面每個(gè)用-name指定的任務(wù)就開幾個(gè)線程測試。所以最終線程數(shù)=任務(wù)數(shù)* numjobs。
-iodepth=64:隊(duì)列深度64.
-filename=/dev/sdb4:數(shù)據(jù)寫到/dev/sdb4這個(gè)盤(塊設(shè)備)。這里可以是一個(gè)文件名,也可以是分區(qū)或者SSD。
-size=10G:每個(gè)線程寫入數(shù)據(jù)量是10GB。
-name=job1:一個(gè)任務(wù)的名字,名字隨便起,重復(fù)了也沒關(guān)系。這個(gè)例子指定了job1和job2,建立了兩個(gè)任務(wù),共享-name=job1之前的參數(shù)。-name之后的就是這個(gè)任務(wù)獨(dú)有的參數(shù)。
-offset=0MB:從偏移地址0MB開始寫。
-bs=4k:每一個(gè)BIO命令包含的數(shù)據(jù)大小是4KB。一般4KB IOPS測試,就是在這里設(shè)置。
–output TestResult.log:日志輸出到TestResult.log。
FIO結(jié)果解析
我們來看一個(gè)FIO測試隨機(jī)讀的結(jié)果。命令如下,2個(gè)任務(wù)并行測試,隊(duì)列深度64,異步模式,每個(gè)任務(wù)測試數(shù)據(jù)1GB,每個(gè)數(shù)據(jù)塊4KB。所以,這個(gè)命令是在測試兩個(gè)線程、隊(duì)列深度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會(huì)為每個(gè)Job打印統(tǒng)計(jì)信息。最后面是合計(jì)的數(shù)值。我們一般看重的總的性能和延遲。
首先看的是最后總的帶寬,aggrb=784568KB/s,算成4KB就是196KIOPS。
再來看看延遲Latency。Slat是發(fā)命令時(shí)間,slat (usec): min=6, max=79, avg= 9.05, stdev= 2.04說明最短時(shí)間6微秒,最長79微秒,平均9微秒,標(biāo)準(zhǔn)差2.04。clat是命令執(zhí)行時(shí)間,lat就是總的延遲。看得出來,讀的平均延遲在571微秒左右。
clat percentiles (usec)給出了延遲的統(tǒng)計(jì)分布。比如90.00th=[684]說明90%的讀命令延遲都在684微秒以內(nèi)。
用FIO做數(shù)據(jù)校驗(yàn)
用FIO可以檢驗(yàn)寫入數(shù)據(jù)是否出錯(cuò)。用-verify=str來選擇校驗(yàn)算法,有md5 crc16 crc32 crc32c crc32c-intel crc64 crc7 sha256 sha512 sha1等。為了校驗(yàn),需要用do_verify參數(shù)。如果是寫,那么do_verify=1就意味著寫完再讀校驗(yàn),這種會(huì)很占內(nèi)存,因?yàn)镕IO會(huì)把每個(gè)數(shù)據(jù)塊的校驗(yàn)數(shù)據(jù)保存在內(nèi)存里。do_verify=0時(shí)只寫校驗(yàn)數(shù)據(jù),不做讀校驗(yàn)。
讀的時(shí)候do_verify=1,那么讀出來的數(shù)據(jù)都會(huì)做校驗(yàn)值檢查,do_verify=0的話,只讀數(shù)據(jù),不做檢查。
另外,verify=meta時(shí),fio會(huì)在數(shù)據(jù)塊內(nèi)寫入時(shí)間戳、邏輯地址等,此時(shí)還能verify_pattern指定寫入數(shù)據(jù)pattern。
FIO其他功能
FIO功能非常強(qiáng)大,可以通過man來查看每一個(gè)功能,也有網(wǎng)頁版幫助文檔https://linux.die.net/man/1/fio。
FIO配置文件
前面的例子都是用命令行來測試,其實(shí)也可以用配置文件把這些參數(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對(duì)齊、4KB隨機(jī)讀寫和響應(yīng)時(shí)間的表現(xiàn),并給出一個(gè)綜合評(píng)分。另外有兩種模式可選,即MB/s與IOPS!
AS SSD Benchmark在測試時(shí)一共會(huì)生成和寫入5GB的測試數(shù)據(jù)文件,所有3個(gè)測試傳輸率項(xiàng)目都是去讀寫這些數(shù)據(jù)文件來換算速度的。其4KB QD64主要是用來測NCQ(NativeCommand Queuing,原生命令隊(duì)列)差距的。IDE模式下就和普通4KB隨機(jī)沒有任何區(qū)別。由于每個(gè)測試都需要進(jìn)行一定大小的數(shù)據(jù)讀寫,硬盤性能越低,測試需要花費(fèi)的時(shí)間就越久,拿機(jī)械硬盤來跑這個(gè)測試并不適宜,跑完全程大約需要1個(gè)小時(shí)左右。尋址時(shí)間測試,讀取是測試尋址隨機(jī)的4KB文件(全盤LBA區(qū)域),寫入是測試尋址隨機(jī)的512B文件(指定的1GB地址范圍)。注意,運(yùn)行AS SSD基準(zhǔn)測試至少需要2GB的空閑空間。
AS SSD Benchmark除了可以測試SSD的性能外,還可以檢測出SSD的固件算法,是否打開AHCI模式,是否進(jìn)行4K對(duì)齊等(如圖7-3所示),是目前應(yīng)用十分廣泛的SSD測試軟件。
AS SSD Benchmark使用的測試數(shù)據(jù)是隨機(jī)的。
ATTO Disk Benchmark
ATTO Disk Benchmark是一款簡單易用的磁盤傳輸速率檢測軟件,可以用來檢測硬盤、U盤、存儲(chǔ)卡及其它可移動(dòng)磁盤的讀取及寫入速率。該軟件使用了不同大小的數(shù)據(jù)測試包,數(shù)據(jù)包按512B、1K、 2K直到到8K進(jìn)行讀寫測試,測試完成后數(shù)據(jù)用柱狀圖的形式表達(dá)出來,體現(xiàn)文件大小比例不同對(duì)磁盤速度的影響。
ATTO測試是極限情況下的磁盤持續(xù)讀寫性能,采用的測試模型具有很高的可壓縮性,ATTO默認(rèn)測試全0數(shù)據(jù)。
CrystalDiskMark
CrystalDiskMark測試指標(biāo)
CrystalDiskMark軟件是一個(gè)測試硬盤或者存儲(chǔ)設(shè)備的小巧工具,測試存儲(chǔ)設(shè)備大小和測試次數(shù)都可以選擇。測試項(xiàng)目里分為,持續(xù)傳輸率測試(塊單位1024KB),隨機(jī)512KB傳輸率測試,隨機(jī)4KB測試,隨機(jī)4KB QD32(隊(duì)列深度32)測試。CrystalDiskMark默認(rèn)運(yùn)行5次,每次1000MB的數(shù)據(jù)量,取最好成績。CrystalDiskMark軟件測試前,同樣會(huì)生成一個(gè)測試文件(大小取決于用戶設(shè)置)。一般來說,設(shè)置得越大,數(shù)據(jù)緩存起到的干擾越少,成績就更能反映SSD的真實(shí)性能,不過缺點(diǎn)是會(huì)嚴(yán)重影響SSD的耐久度(寫入太多數(shù)據(jù)影響P/E)。所以一般測試時(shí)都采納軟件默認(rèn)值。
CrystalDiskMark設(shè)置不同填充Pattern
軟件默認(rèn)測試數(shù)據(jù)為不可壓縮數(shù)據(jù)。如果設(shè)置選項(xiàng)中選擇了
PCMark Vantage
PCMark Vantage可以衡量各種類型PC的綜合性能。從多媒體家庭娛樂系統(tǒng)到筆記本,從專業(yè)工作站到高端游戲平臺(tái),無論是在專業(yè)人士手中,還是屬于普通用戶,都能在PCMark Vantage里了解透徹,從而發(fā)揮最大性能。測試內(nèi)容可以分為以下三個(gè)部分:
1、處理器測試:基于數(shù)據(jù)加密、解密、壓縮、解壓縮、圖形處理、音頻和視頻轉(zhuǎn)碼、文本編輯、網(wǎng)頁渲染、郵件功能、處理器人工智能游戲測試、聯(lián)系人創(chuàng)建與搜索。
2、圖形測試:基于高清視頻播放、顯卡圖形處理、游戲測試。
3、硬盤測試:使用Windows Defender、《Alan Wake》游戲、圖像導(dǎo)入、Windows Vista啟動(dòng)、視頻編輯、媒體中心使用、Windows Media Player搜索和歸類,以及以下程序的啟動(dòng):Office Word 2007、Adobe Photoshop CS2、Internet Explorer、Outlook 2007。
IOMeter
IOMeter應(yīng)用截圖
IOMeter是一個(gè)單機(jī)或者集群的I/O子系統(tǒng)測量和描述工具。與前面介紹的測試軟件相比較,IOMeter在測試軟件中是屬于比較自由的,用戶可以按照測試需求去配置測試磁盤數(shù)據(jù)范圍,隊(duì)列深度,數(shù)據(jù)模式(可壓縮或者不可壓縮,有些版本支持,有些老版本不支持),測試模式(隨機(jī)或者順序訪問),讀寫測試比例,隨機(jī)和順序訪問比例,以及測試時(shí)間等等。
本地IO性能測試
啟動(dòng)程序,在windows上單擊IOMeter圖標(biāo);
在“Disk Targets”頁中選擇一個(gè)驅(qū)動(dòng)器;
在“AccessSpecifications”頁中選擇一個(gè)需要的測試項(xiàng)目;
在“ResultsDisplay”頁中設(shè)置“Update Frequency (Seconds)”設(shè)置多長時(shí)間統(tǒng)計(jì)一次測試結(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)時(shí)間,該值越小越好。
·CPU Utilization:CPU占用率,越低越好。
單擊工具欄中的“StartTests”按鈕,選擇一個(gè)測試結(jié)果輸出文件后開始一個(gè)測試(一般一次測試運(yùn)行10分鐘即可);
測試完成后單擊按鈕停止所有測試。
查看測試結(jié)果,由于IOMeter沒有提供一個(gè)GUI的查看測試報(bào)告的工具??梢允褂肊xcel打開測試結(jié)果文件“csv”,然后利用Excel的圖標(biāo)工具整理測試結(jié)果。或者使用IOMeter提供的“Import Wizard for MS Access”將測試結(jié)果導(dǎo)入一個(gè)Access文件。
-
cpu
+關(guān)注
關(guān)注
68文章
11186瀏覽量
221178 -
SSD
+關(guān)注
關(guān)注
21文章
3025瀏覽量
121193 -
性能測試
+關(guān)注
關(guān)注
0文章
225瀏覽量
22150
原文標(biāo)題:招標(biāo)和選購固態(tài)硬盤主流測試軟件詳解
文章出處:【微信號(hào):SSDFans,微信公眾號(hào):SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
探秘CPU對(duì)SSD性能影響
企業(yè)級(jí)與消費(fèi)級(jí)SSD的區(qū)別
致態(tài)Ti600 QLC SSD性能測試

Xilinx FPGA高性能NVMe SSD主機(jī)控制器,NVMe Host Controller IP
SSD是什么意思,什么是SSD
再入一個(gè)SSD,480G做倉庫盤真爽快
關(guān)于AS SSD Benchmark軟件和4K讀寫性能淺析

NVMe SSD與SATA SSD的性能對(duì)比
影響SSD性能的因素有哪些 NVMe SSD性能解析
AS SSD Benchmark固態(tài)硬盤性能測試工具應(yīng)用程序免費(fèi)下載
SSD測試軟件的介紹

凱智通SSD固態(tài)硬盤測試解決方案
WD Blue SN580 PCIe 4.0 SSD測試解析

評(píng)論