0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

超全的SPDK性能評估指南

SSDFans ? 來源:未知 ? 作者:胡薇 ? 2018-11-26 09:58 ? 次閱讀

通過fio工具測試磁盤性能

SPDK采用異步I/O(Asynchronous I/O)加輪詢(Polling)的工作模式,通常與Kernel的異步I/O作為對比。在此,主要介紹通過使用fio評估Kernel異步I/O,以及spdk fio_plugin的兩種模式。

01

fio評估kernel異步I/O(AIO)

fio支持多種模式的I/O引擎,同時也包含了測試異步I/O的引擎,即libaio。在測試異步I/O的時候,只需要將fio啟動配置文件中的ioengine設(shè)為libaio即可。通常在做異步I/O的時候,I/O請求會發(fā)送到相應(yīng)的隊列中,等待被處理,因此隊列深度將會影響磁盤性能。所以在測試異步I/O的時候,根據(jù)磁盤的特性指定相應(yīng)的隊列深度(iodepth)。

測試Kernel異步I/O的fio配置參數(shù)示例如下:

[Global]ioengine=libaiodirect=1rw=randrwrwmixread=100 (100% reads), 70 (70% reads 30% writes), 0 (100 writes)thread=1norandommap=1time_base=1runtime=300sramp_time=10sbs=4kiodepth=32Numjobs=1[test]filename=/dev/nvme0n1

參數(shù)詳解

ioengine:指定I/O引擎,在這里測試Kernel的異步I/O,因此指定I/O引擎為libaio;direct: 指定direct模式O_DIRECT,I/O會繞過系統(tǒng)的page buffer;rw:讀寫模式,這里指定randrw表示混合隨機讀寫;rwmixread:混合隨機讀寫模式下read請求所占比例;thread:指定使用線程模式。由于spdk fio_plugin只支持線程模式,因此與Kernel對比時,通常都統(tǒng)一指定線程模式來對比;norandommap:指定I/O時,每次都獲取一個新的隨機offset,防止額外的CPU使用消耗;time_based:指定采用時間模式;runtime:測試時長;ramp_time:統(tǒng)計性能之前所運行的時間,為了防止沒有進行穩(wěn)態(tài)而造成的性能虛高帶來的影響;bs:I/O塊大小;iodepth:隊列深度;numjobs:worker的個數(shù);filename:指定測試的對象。

02

基于NVMe的fio_plugin

安裝步驟

a. 下載編譯fio:

git clone https://github.com/axboe/fiocd fio && git checkout fio-3.3make

b.下載編譯SPDK:

git clone https://github.com/spdk/spdkcd spdk && git submodule update --init./configure --with-fio=/path/to/fio/repo make

注意:由于fio_plugin要依賴fio中提供的一些依賴包,因此在運行configure時,必須指定fio目錄,否則默認fio_plugin不會編譯

測試方法

a. 使用fio_plugin測試裸盤,需要引入fio_plugin路徑,因此在運行fio時,在fio命令之前加如下參數(shù):

LD_PRELOAD=/examples/nvme/fio_plugin/fio_plugin

b. 其次,需要在fio配置文件中設(shè)定ioengine為spdk。

c. 運行fio時候,不僅要指定fio運行配置文件,同時要通過額外的參數(shù)'--filename'指定spdk能夠識別的設(shè)備地址信息。通常,fio_plugin支持兩種模式下的測試,一是本地的NVMe設(shè)備,即NVMe over PCIe;二是遠端的NVMe設(shè)備,即NVMe over Fabrics。如下所示:

NVMe over PCIe:LD_PRELOAD=.../fio_plugin fio config.fio '--filename=trtype=PCIe traddr=0000.06.00.0 ns=1'NVMe over Fabrics:LD_PRELOAD=.../fio_plugin fio config.fio '--filename=trtype=RDMA adrfam=IPv4 traddr=192.0.0.1 trsvcid=4420 ns=1'

其它說明

a. 對于使用1個core,測試多塊盤的情況,通常只需要設(shè)定numjob為1,同時在fio命令通過多個filename參數(shù)來指定多塊要測試的盤(多個filename參數(shù)之間用空格相隔即可),例如同時測試三塊盤:

LD_PRELOAD=.../fio_plugin fio config.fio '--filename=trtype=PCIe traddr=0000.06.00.0 ns=1' '--filename=trtype=PCIe traddr=0000.07.00.0 ns=1' '--filename=trtype=PCIe traddr=0000.08.00.0 ns=1'

b. 對于使用fio_plugin作為新的ioengine而引入的新的fio參數(shù)說明,可以通過以下命令查看相關(guān)參數(shù)說明:

LD_PRELOAD.../fio_plugin fio --enghelp=spdk

c. 此外,可以通過直接在ioengine中指定fio_plugin的絕對路徑,而無須每次運行fio都動態(tài)加載LD_PRELOAD。即: fio配置文件中添加修改ioengine=/examples/nvme/fio_plugin/fio_plugin;運行fio config.fio '--filename=trtype=PCIe traddr=0000.06.00.0 ns=1'即可測試。

03

基于bdev的fio_plugin

基于bdev的fio_plugin是將I/O在spdk塊設(shè)備bdev之上進行發(fā)送。而基于裸盤的fio_plugin,I/O是直接到裸盤上進行處理。因此兩者最大的差別在于I/O是否經(jīng)過bdev這一層。因此,基于bdev的fio_plugin能夠很好的評估spdk塊設(shè)備層bdev的性能。

其編譯安裝與裸盤的fio_plugin完全相同,下面詳細介紹其測試方法:

a. 使用fio_plugin測試bdev性能,需要bdev fio_plugin的路徑,因此在運行fio時,在fio命令之前加如下參數(shù):

LD_PRELOAD=/examples/bdev/fio_plugin/fio_plugin

b. 其次,需要在fio配置文件中設(shè)定ioengine為spdk_bdev

c. 需要在fio配置文件中指定spdk啟動配置文件。如下所示:

spdk_conf=./example/bdev/fio_plugin/bdev.conf

spdk運行配置文件中指定了所有bdev的配置信息,示例如下:

[Malloc]

NumberOfLuns 1LunSizeInMB 128

[Nvme]

TransportID "trtype:PCIe traddr:0000:82:00.0" Nvme0

RetryCount 4TimeoutUsec 0AcctionOnTimeout NoneAdminPollRate 100000

d.運行fio的時候,通過'--filename'直接指定所要測試的bdev名稱即可,示例如下:

LD_PRELOAD=.../fio_plugin fio config.fio '--filename=Nvme0n1'

其他說明

a. 使用基于bdev的fio_plugin測試多個設(shè)備時候,需要在spdk運行配置文件中寫入相應(yīng)的bdev配置信息,其次在fio運行時,指定多個filename參數(shù)即可,多個filename之間用空格相隔。例如同時測兩個設(shè)備Malloc0與Nvme0n1,如下所示:

LD_PRELOAD=.../fio_plugin fio config.fio '--filename=Nvme0n1' '--filename=Malloc0'

b.同理,若查看基于bdev的fio_plugin相關(guān)參數(shù)說明,可以通過如下命令:

LD_PRELOAD.../fio_plugin fio --enghelp=spdk_bdev

c. 此外,可以通過直接在ioengine中指定fio_plugin的絕對路徑,而無須每次運行fio都動態(tài)加載LD_PRELOAD。即:

fio配置文件中添加修改ioengine=/examples/bdev/fio_plugin/fio_plugin;運行fio config.fio '--filename=Nvme0n1'即可測試。

通過spdk perf測試磁盤性能

01

基于NVMe的perf工具

成功編譯spdk后,可在spdk/examples/nvme/perf/目錄下找到perf工具的二進制運行文件。perf使用方法如下所示:

perf -c -q -t

更多參數(shù)解析,請參考perf --help

perf支持本地的NVMe設(shè)備,同時也支持遠端的NVMeoF的設(shè)備。使用范例如下:

NVMe over PCIe:perf -q 32 -s 1024 -w randwrite -t 1200 -c 0xF -o 4096 -r 'trtype:PCIe traddr:0000:06:00.0'NVMe over Fabrics:perf -q 32 -s 1024 -w randwrite -t 1200 -c 0xF -o 4096 -r 'trtype:RDMA adrfam:IPv4 traddr:192.0.0.1 trsvcid:4420'

對于同時測試多塊盤,只需要添加-r并指定設(shè)備地址即可,例如一個core測試三塊盤:

perf -q 32 -s 1024 -w randwrite -t 1200 -c 0x1 -o 4096 -r 'trtype:PCIe traddr:0000:06:00.0' -r 'trtype:PCIetraddr:0000:07:00.0' -r 'trtype:PCIe traddr:0000:08:00.0'

02

perf評估Linux異步I/O(AIO)

使用方式與測試spdkdriver相同,只需要在perf命令后添加設(shè)備名稱即可。使用范例如下:

perf -q 32 -s 1024 -w randwrite -t 1200 -c 0xF -o 4096 /dev/nvme0n1

03

基于bdev的perf工具

成功編譯spdk后,可在spdk/test/bdev/bdevperf/目錄下找到bdevperf工具的二進制運行文件。bdevperf使用方法如下所示:

bdevperf -c -q -t

更多參數(shù)解析,請參考perf --help。

其中,-c是指定bdevperf的配置文件,需要測試的bdev設(shè)備都在配置文件中指定,例如,若需要測試本地的兩塊NVMe設(shè)備,則bdevperf的配置文

件示例如下:

[Nvme]

TransportID "trtype:PCIe traddr:0000:82:00.0" Nvme0RetryCount 4TimeoutUsec 0AcctionOnTimeout NoneAdminPollRate 100000

相應(yīng)的bdevperf啟動參數(shù)示例如下:

bdevperf -q 32 -s 1024 -w randwrite -t 1200 -o 4096 -m 0xF -c bdevperf.conf

對于bdevperf,若要測試多塊盤,則只需要在spdk配置文件中配置多塊盤的信息即可,例如同時測試三塊盤:

[Nvme]

TransportID "trtype:PCIe traddr:0000:82:00.0" Nvme0

TransportID "trtype:PCIe traddr:0000:83:00.0" Nvme1TransportID "trtype:PCIe traddr:0000:84:00.0" Nvme2RetryCount 4TimeoutUsec 0AcctionOnTimeout NoneAdminPollRate 100000

常見問題

1

通過fio與perf對SPDK進行性能評估,得到的結(jié)果不同,大部分的時候perf所得到的性能會比fio所得到的性能要高。

兩種工具最大的差別在于,fio是通過與Linux fio工具進行集成,使其可以用fio_plugin引擎測試SPDK設(shè)備。而由于fio本身架構(gòu)的問題,不能充分發(fā)揮SPDK的優(yōu)勢,整個應(yīng)用框架仍然使用fio原本的架構(gòu)。例如fio使用Linux的線程模型,在使用的時候,線程仍然被內(nèi)核調(diào)度。而對于perf來說,是針對SPDK所設(shè)計的性能測試工具,因此在底層,不僅是I/O通過SPDK下發(fā),同時一些底層應(yīng)用框架都是為SPDK所設(shè)計的。例如剛剛所提到的線程模型,perf中是使用DPDK所提供的線程模型,通過使用CPU的親和性將CPU核與線程捆綁,不再受內(nèi)核調(diào)度,因此可以充分發(fā)揮SPDK下發(fā)I/O時的異步無鎖化優(yōu)勢。這就是為什么perf所測得的性能要比fio高,尤其是在使用單個線程(單核)同時測試多塊盤的情況下,fio所得性能要明顯小于perf所得性能。因此,在同等情況下,我們更推薦用戶使用perf工具對SPDK進行性能評估。

此外,在多numjob的情況下,fio與perf對iodepth的分配是不同的。通常在fio中,指定的iodepth表示所有的job一共的iodepth,而在perf指定的iodepth(perf中-q參數(shù))通常指的是每個job所使用的iodepth。舉例如下:Fio:numjob=4, iodepth=128。則每個job對應(yīng)的iodepth為32(128/4)。Perf:-c 0xF (相當(dāng)于fio中numjob=4),-q 128(相當(dāng)于fio中iodepth=128)。則每個job對應(yīng)的iodepth為128。

2

對SPDK和內(nèi)核的性能評估時,雖然性能有所提升,但是沒有看到SPDK官方所展示的特別大的性能差異。

首先,如問題1中所述,不同的工具之間所得出的性能結(jié)果是不同的,另外最主要的因素還是硬盤本身的性能瓶頸所導(dǎo)致的問題。例如,以2D NAND為介質(zhì)的Intel DC P3700,本身的性能都存在一定的瓶頸,因此無論是SPDK用戶態(tài)驅(qū)動還是內(nèi)核驅(qū)動,都不會達到較高的IOPS。若換用更高性能的硬盤,例如使用以3D Xpoint為介質(zhì)的Optane(Intel DC P4800X)為測試對象,便會看到很大的性能差異。因此,硬盤性能越高,SPDK所發(fā)揮出的優(yōu)勢越明顯,這也是SPDK產(chǎn)生的初衷,其本身就是為高性能硬盤所訂制的。

3

關(guān)于評估不同硬盤的隊列深度(iodepth)與CPU core的問題。

通常根據(jù)不同硬盤的特點,選擇不同的iodepth以及所使用的CPUcore。通常在評估以2D NAND、3D NAND介質(zhì)的硬盤,一般情況下,為了達到磁盤的最高性能,通常會選擇較高的iodepth(128或256)。對于P4XXX的硬盤,通常可能一個CPU core無法達到滿IOPS,此時并不是由于一個core的能力不夠,而是由于硬盤中硬件隊列本身限制的問題。因此,通常需要使用兩個CPU core才能夠達到specification中的滿IOPS。此外,對于以3D Xpoint為介質(zhì)的Optane(Intel P4800X),通常只需要一個core并使用較小的iodepth即可達到滿IOPS,此時已經(jīng)達到硬盤的上限,若再次增大iodepth只會是latency變大而IOPS不再增長。

下面給出各種硬盤建議的評估參數(shù):Intel P3700: numjob=1, iodepth=128Intel P4500、Intel P4510、Intel P4600:numjob=2, iodepth=256Intel Optane(Intel P4800X):numjob=1, iodepth=8/16/32

4

關(guān)于寫性能虛高的問題。

通常以2D NAND、3D NAND為介質(zhì)的硬盤,在測試write/randwrite的性能時候,通常要比sepcification里的最高值高很多。這是由于這類介質(zhì)本身的問題,所以在測試時會出現(xiàn)write/randwrite性能虛高的問題。因此在測試該類硬盤,為了避免此類現(xiàn)象,通常需要對磁盤做一次precondition。通常的做法為:在格式化之后,對磁盤不斷進行寫操作,寫滿整個磁盤,使其進行穩(wěn)態(tài)。以DC P3700 800GB為例,通常首先以4KB的大小順序?qū)憙尚r,之后再隨機寫一小時。此外,在測試的時候,fio參數(shù)中的ramp_time可以設(shè)置較大一些,避免初始的虛高值計入最終結(jié)果。

5

關(guān)于磁盤性能測試指標(biāo)。

通常,對于一個磁盤的性能,我們主要從三方面去評估:IOPS、bandwidth、latency。

IOPS:通常評估磁盤的IOPS,主要關(guān)注塊大小為4k,隨機讀寫的情況。因此,通常fio關(guān)鍵參數(shù)為:bs=4k,iodepth=128,direct=1,rw=randread/randwrite。

Bandwidth:評估磁盤的bandwidth,通常是關(guān)注塊大小為128k,順序讀寫的情況。因此,通常fio關(guān)鍵參數(shù)為:bs=128k,iodepth=128,direct=1,rw=read/write。

Latency:評估latency通常情況下,是關(guān)注一個I/O發(fā)送/完成的延遲情況,因此,通常選擇iodepth為1。因此,通常fio關(guān)鍵參數(shù)為:bs=4k,iodepth=1,direct=1,rw=randread/randwrite。此外,對于latency的結(jié)果,不僅要關(guān)注平均值,同時也要注意長尾延遲,即99.99%的延遲情況。

注意:通常在測試磁盤的性能時,要添加direct=1,即繞過系統(tǒng)的cache buffer。這時測得的性能為裸盤的性能 。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SSD
    SSD
    +關(guān)注

    關(guān)注

    20

    文章

    2791

    瀏覽量

    116659
  • 磁盤
    +關(guān)注

    關(guān)注

    1

    文章

    355

    瀏覽量

    25096

原文標(biāo)題:基于SPDK的NVMe SSD性能評估指南

文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    [分享] 的EDA軟件生成坐標(biāo)文件教程

    點下邊文字即可下載  的EDA軟件生成坐標(biāo)文件教程
    發(fā)表于 11-14 18:29

    超強布線經(jīng)驗教程大全

    超強布線經(jīng)驗教程大全
    發(fā)表于 08-03 21:42

    單片機編程實例

    單片機編程實例
    發(fā)表于 07-05 22:07

    超強布線經(jīng)驗教程大全

    超強布線經(jīng)驗教程大全
    發(fā)表于 09-30 09:00

    超強布線經(jīng)驗教程大全

    本帖最后由 lee_st 于 2017-10-31 08:43 編輯 超強布線經(jīng)驗教程大全
    發(fā)表于 10-21 21:01

    分享高性能Android應(yīng)用開發(fā)清版PDF

    `性能問題在很大程度上決定了用戶是否會使用一款A(yù)pp,本書正是android性能方面的關(guān)鍵性指南。全書共8章,主要從電池、內(nèi)存、CPU和網(wǎng)絡(luò)方面講解了電池管理、工作效率和速度這幾個方面的性能
    發(fā)表于 08-13 10:40

    半橋焊機器件選擇指南評估

    半橋焊機(IGBT /二極管)器件選擇指南評估板。各種拓撲結(jié)構(gòu),包括兩個SW正向,半橋和橋,已用于低壓/大電流DC-ARC焊接機,以最大限度地提高系統(tǒng)效率并提高效率。在這些拓撲結(jié)構(gòu)中,半橋最常用于小型,低于230A的焊接機
    發(fā)表于 04-13 09:52

    實用的電路圖合集

    實用電路圖合集
    發(fā)表于 09-25 08:13

    UG-025:評估板用戶指南

    UG-025:評估板用戶指南
    發(fā)表于 05-14 20:03 ?1次下載
    UG-025:<b class='flag-5'>評估</b>板用戶<b class='flag-5'>指南</b>

    Zynq-7000可編程SoC ZC706評估套件(ISE Design Suite 14.5)入門指南

    Zynq-7000可編程SoC ZC706評估套件(ISE Design Suite 14.5)入門指南
    發(fā)表于 05-19 14:20 ?20次下載
    Zynq-7000<b class='flag-5'>全</b>可編程SoC ZC706<b class='flag-5'>評估</b>套件(ISE Design Suite 14.5)入門<b class='flag-5'>指南</b>

    SPDK Thread模型設(shè)計與實現(xiàn) NVMe-oF的使用案例

    SPDK Thread 模型是SPDK誕生以來十分重要的模塊,它的設(shè)計確保了spdk應(yīng)用的無鎖化編程模型,本文基于spdk最新的release 19.07版本介紹了整體thread模型
    的頭像 發(fā)表于 07-03 16:20 ?2272次閱讀

    FT 6000 評估板硬件指南

    FT 6000 評估板硬件指南
    發(fā)表于 03-13 19:29 ?2次下載
    FT 6000 <b class='flag-5'>評估</b>板硬件<b class='flag-5'>指南</b>

    DA9230/31 評估指南用戶指南

    DA9230/31 評估指南用戶指南
    發(fā)表于 03-17 19:09 ?0次下載
    DA9230/31 <b class='flag-5'>評估</b><b class='flag-5'>指南</b>用戶<b class='flag-5'>指南</b>

    DA9230/31 評估指南用戶指南

    DA9230/31 評估指南用戶指南
    發(fā)表于 07-06 20:34 ?0次下載
    DA9230/31 <b class='flag-5'>評估</b><b class='flag-5'>指南</b>用戶<b class='flag-5'>指南</b>

    SPDK在虛擬化場景下的使用方法

    ? SPDK(全稱Storage Performance Development Kit),提供了一整套工具和庫,以實現(xiàn)高性能、擴展性強、用戶態(tài)的存儲應(yīng)用程序。它是繼DPDK之后,intel在存儲領(lǐng)域
    的頭像 發(fā)表于 11-10 10:12 ?1118次閱讀
    <b class='flag-5'>SPDK</b>在虛擬化場景下的使用方法