那曲檬骨新材料有限公司

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

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

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

讀、寫、擦除是SSD對NAND的三大基本操作

SSDFans ? 來源:lq ? 2019-04-28 11:39 ? 次閱讀

讀、寫、擦除是SSD對NAND的三大基本操作,但是針對NAND自身的特性和多樣化的I/O模型,SSD怎么讀、寫、擦除是門高級藝術(shù),也由此衍生了很多技術(shù)。

比如垃圾回收(GC),一個(gè)優(yōu)質(zhì)的GC明白在什么時(shí)候,挑選哪些Block,將上面的數(shù)據(jù)搬到哪去。

GC的基本原理

(如上圖)左側(cè)兩個(gè)Block中的有效數(shù)據(jù)被搬移/整合到一個(gè)新的Block,然后這兩個(gè)Block將被擦除,形成兩個(gè)可以寫入數(shù)據(jù)的新Block。

關(guān)于GC的研究,可以看Memblaze金一同學(xué)的這個(gè)文章。

《GC算法仿真原理解析》

有個(gè)問題,GC怎么才能知道垃圾是垃圾呢?討論這個(gè)問題需要先回到數(shù)據(jù)存儲的過程,開始是這樣的。

當(dāng)有數(shù)據(jù)刪除之后,SSD并不能及時(shí)的知道誰是臟數(shù)據(jù)。形成了這樣的局面

只有操作系統(tǒng)往標(biāo)注DEL的位置上寫數(shù)據(jù)時(shí),盤才知道這是垃圾。

不然這些數(shù)據(jù)將一直被GC認(rèn)為是有效數(shù)據(jù)搬移。為了更高效的執(zhí)行GC,讓操作系統(tǒng)和文件系統(tǒng)高效的和SSD主控交流刪除文件的信息

就出現(xiàn)了TRIM。

A trim command (known as TRIM in the ATA command set, and UNMAP in the SCSI command set) allows an operating system to inform a solid-state drive (SSD) which blocks of data are no longer considered in use and can be wiped internally.——Wikipediahttps://en.wikipedia.org/wiki/Trim_(computing)

維基百科給的這段介紹,在NVMe SSD上解釋就是,TRIM讓操作系統(tǒng)通過Trim命令(NVMe協(xié)議中有定義)告訴SSD哪些地址上的數(shù)據(jù)可以擦除,從而提升垃圾回收的效率。

Memblaze就是這么干的,

我們總結(jié)了TRIM的三大價(jià)值:

降低寫放大

提升寫性能

提高設(shè)備壽命

對于NVMe來說,Trim是讓GC長了一對翅膀。說著簡單,但是要通過Trim達(dá)到降低寫放大的目標(biāo)而不影響設(shè)備性能,其中NAND無效塊的擦寫時(shí)機(jī)、Tirm和其他一系列SSD核心算法的配合非常有講究。

TRIM實(shí)現(xiàn)難在哪這里就不詳細(xì)討論了,有興趣的可以看Ron寫的文章《SSD Trim 詳解》

NVMe Spec對TRIM命令有詳細(xì)的規(guī)定,所以使NVMe Cli就可以對TRIM功能進(jìn)行驗(yàn)證

接下來就結(jié)合NVMe Spec的規(guī)定,發(fā)出我們的一條TRIM命令,然后做個(gè)驗(yàn)證。

1

準(zhǔn)備設(shè)備和環(huán)境

使用Memblaze官網(wǎng)Pblaze5 910/916系列產(chǎn)品中的4T U.2NVMe進(jìn)行驗(yàn)證測試。

nvme list的信息如下 firmware version:001008R0

寫入數(shù)據(jù):從NVMe 10GiB的位置往后寫10G的數(shù)據(jù),數(shù)據(jù)pattern是0x12345678

[root@localhost~]#fio--thread--direct=1--allow_file_creat=0--ioengine=libaio--rw=write--bs=128k--iodepth=128--numjobs=1--name=nvme0n1--filename=/dev/nvme0n1--offset=10g--size=10g--verify=pattern--do_verify=0--verify_pattern=0x12345678nvme0n1:(g=0):rw=write,bs=(R)128KiB-128KiB,(W)128KiB-128KiB,(T)128KiB-128KiB,ioengine=libaio,iodepth=128fio-3.12Starting1threadJobs:1(f=1):[W(1)][-.-%][w=3165MiB/s][w=25.3kIOPS][eta00m:00s]nvme0n1:(groupid=0,jobs=1):err=0:pid=4787:MonMar415:59:352019write:IOPS=25.2k,BW=3156MiB/s(3309MB/s)(10.0GiB/3245msec)slat(nsec):min=3204,max=81924,avg=9364.20,stdev=2437.54clat(usec):min=1177,max=17333,avg=5058.82,stdev=387.21lat(usec):min=1187,max=17347,avg=5068.25,stdev=387.16clatpercentiles(usec):|1.00th=[4555],5.00th=[5014],10.00th=[5014],20.00th=[5014],|30.00th=[5014],40.00th=[5014],50.00th=[5080],60.00th=[5080],|70.00th=[5080],80.00th=[5080],90.00th=[5080],95.00th=[5080],|99.00th=[5145],99.50th=[6063],99.90th=[11207],99.95th=[13042],|99.99th=[16909]bw(MiB/s):min=3145,max=3166,per=100.00%,avg=3157.17,stdev=7.59,samples=6iops:min=25160,max=25334,avg=25257.33,stdev=60.68,samples=6lat(msec):2=0.11%,4=0.48%,10=99.30%,20=0.11%cpu:usr=3.73%,sys=25.09%,ctx=74895,majf=0,minf=13IOdepths:1=0.1%,2=0.1%,4=0.1%,8=0.1%,16=0.1%,32=0.1%,>=64=99.9%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.0%,>=64=0.1%issuedrwts:total=0,81920,0,0short=0,0,0,0dropped=0,0,0,0latency:target=0,window=0,percentile=100.00%,depth=128Runstatusgroup0(alljobs):WRITE:bw=3156MiB/s(3309MB/s),3156MiB/s-3156MiB/s(3309MB/s-3309MB/s),io=10.0GiB(10.7GB),run=3245-3245msecDiskstats(read/write):nvme0n1:ios=62/79409,merge=0/0,ticks=1/401029,in_queue=401403,util=96.86%[root@localhost~]#

2

依據(jù)NVMe Spec準(zhǔn)備測試文件和命令

使用nvmecli將這10G的數(shù)據(jù)trim掉,利用強(qiáng)大的strace命令跟蹤一下command的耗時(shí),粗略的計(jì)算下Trim的速度。

首先需要按照NVMe Spec協(xié)議中的Dataset Manager設(shè)置(如下圖),創(chuàng)建一個(gè)4096byte的二進(jìn)制文件。一個(gè)range最多trim32bit(0xffffffff*512byte 大約2047GiB)的LBA。

Length in logical blocks和Starting LBA的計(jì)算

10G數(shù)據(jù)按照512byte的format格式得出是:

10*1024*1024*1024/512=20971520個(gè)(LBA)

Fio中offset=10g,因此start LBA也是 :

10*1024*1024*1024/512=20971520

利用python創(chuàng)建二進(jìn)制文件代碼如下(簡單的寫個(gè))

importarraybuf=array.array("B",[0x00]*4096)defsetValue(buf,offset,num,value):#Commonfunctiontosetunsignedintegervaluewithinthegivenrange#offset&numareinbytesforthisfunctionseries.ifnum==1:buf[offset]=valueelse:foriinxrange(num):buf[offset+i]=(value>>(8*i))&0xffreturnbufdefwriteBinaryFile(buf,filepath):withopen(filepath,"wb")asf:buf.tofile(f)#Length in logical blocks :offset=4 num=4 value=20971520buf=setValue(buf,4,4,20971520)#StartingLBAoffset=8num=8value=20971520buf=setValue(buf,8,8,20971520)writeBinaryFile(buf,“/root/trim.bin”)

下面是NVMe Spec里TRIM命令的規(guī)范,使用nvmecli 發(fā)送NVMe command需要照著填寫

Dword11 :二進(jìn)制:0b 0100=0x04

3

準(zhǔn)備工作做足了,接下來就是發(fā)!

發(fā)TRIM時(shí)候,在命令前加上strace –ttt,可以粗略的計(jì)算TRIM的速度。

[root@localhost~]#strace–tttnvmeio-passthru/dev/nvme0--opcode=0x09--namespace-id=1--cdw10=0x00--cdw11=0x04--input-file=trim.bin--data-len=4096–write

我們經(jīng)過計(jì)算得出TRIM耗時(shí)0.00124s,所以Trim的速度大約是:10 /0.00124= 8064.516GiB/s 大約8TB/s

4

TRIM后立即數(shù)據(jù)驗(yàn)證

[root@localhost~]#fio--thread--direct=1--allow_file_creat=0--ioengine=libaio--rw=read--bs=128k--iodepth=128--numjobs=1--name=nvme0n1--filename=/dev/nvme0n1--offset=10g--size=10g--verify=pattern--do_verify=1--verify_pattern=0x00nvme0n1:(g=0):rw=read,bs=(R)128KiB-128KiB,(W)128KiB-128KiB,(T)128KiB-128KiB,ioengine=libaio,iodepth=128fio-3.12Starting1threadJobs:1(f=1):[V(1)][-.-%][r=3176MiB/s][r=25.4kIOPS][eta00m:00s]nvme0n1:(groupid=0,jobs=1):err=0:pid=9241:MonMar421:37:352019read:IOPS=25.4k,BW=3171MiB/s(3325MB/s)(10.0GiB/3229msec)slat(usec):min=9,max=225,avg=11.21,stdev=3.14clat(usec):min=1938,max=11585,avg=5010.57,stdev=1313.65lat(usec):min=1948,max=11595,avg=5021.85,stdev=1313.57clatpercentiles(usec):|1.00th=[2147],5.00th=[2868],10.00th=[3294],20.00th=[3884],|30.00th=[4293],40.00th=[4621],50.00th=[4948],60.00th=[5342],|70.00th=[5735],80.00th=[6194],90.00th=[6783],95.00th=[7242],|99.00th=[8029],99.50th=[8225],99.90th=[8717],99.95th=[9110],|99.99th=[9765]bw(MiB/s):min=3168,max=3176,per=100.00%,avg=3172.88,stdev=3.26,samples=6iops:min=25348,max=25410,avg=25383.00,stdev=26.07,samples=6lat(msec):2=0.47%,4=22.76%,10=76.75%,20=0.01%cpu:usr=45.94%,sys=29.43%,ctx=22554,majf=0,minf=25IOdepths:1=0.1%,2=0.1%,4=0.1%,8=0.1%,16=0.1%,32=0.1%,>=64=99.9%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.0%,>=64=0.1%issuedrwts:total=81920,0,0,0short=0,0,0,0dropped=0,0,0,0latency:target=0,window=0,percentile=100.00%,depth=128Runstatusgroup0(alljobs):READ:bw=3171MiB/s(3325MB/s),3171MiB/s-3171MiB/s(3325MB/s-3325MB/s),io=10.0GiB(10.7GB),run=3229-3229msecDiskstats(read/write):nvme0n1:ios=79930/0,merge=0/0,ticks=394735/0,in_queue=395214,util=96.95%[root@localhost~]#

可以看到加上--verify_pattern=0x00之后,err= 0,證明TRIM后數(shù)據(jù)都變成0了,至于更細(xì)節(jié)的說明,在此不再贅述。

通過一系列的介紹和實(shí)驗(yàn)驗(yàn)證,我們看到了TRIM的價(jià)值和實(shí)現(xiàn)原理。在TRIM的幫助下,NVMe SSD的GC等操作效率更高,進(jìn)而達(dá)到降低寫放大,提高產(chǎn)品性能和壽命的效果。

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

    關(guān)注

    16

    文章

    1690

    瀏覽量

    136461
  • SSD
    SSD
    +關(guān)注

    關(guān)注

    21

    文章

    2887

    瀏覽量

    117857
  • 數(shù)據(jù)存儲
    +關(guān)注

    關(guān)注

    5

    文章

    983

    瀏覽量

    51058

原文標(biāo)題:TRIM,讓你的SSD再次飛起來

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

收藏 人收藏

    評論

    相關(guān)推薦

    SSD是什么意思,什么是SSD

    星、SONY等一大批國外實(shí)力廠家的不斷開發(fā)研究,SSD市場已經(jīng)全面開花了。不過不要擔(dān)心,中國第一款SSD已經(jīng)由深圳億正存儲科技公司于2007年1月1日宣布研發(fā)完成,并可以大批量進(jìn)行生產(chǎn),而且
    發(fā)表于 03-25 16:20

    nand flash擦除寫入不成功

    我依照視頻新一期的步驟來進(jìn)行nandflash的擦除操作,我的代碼都是參考源碼的。參考016nandflash 文件夾下的004_erase_write_016_005問題現(xiàn)象:可以實(shí)現(xiàn)從n
    發(fā)表于 03-28 06:06

    程序燒擦除出現(xiàn)錯誤

    之前程序可以順利跑下來,將程序燒寫進(jìn)入nand以后,發(fā)現(xiàn)沒有之前的效果,擦除以后仿真發(fā)現(xiàn)程序出現(xiàn)問題(擦除我是用的燒時(shí)nand
    發(fā)表于 04-17 11:25

    NAND與NOR相比有何優(yōu)勢

    都可以以字節(jié)為單位,但NAND以page 為單位,而NOR 可以隨機(jī)每一個(gè)字節(jié)。NAND 和NOR 的
    發(fā)表于 12-23 06:52

    為什么我無法調(diào)用SFUD的擦除操作呢?

    我再用SFUD的時(shí)候遇到個(gè)奇怪的問題:環(huán)境:rt-thread 4.0.2stm32f103zet6w25q16問題:1.使用SFUD,初始化,操作都正常,因此排除是初始化什么的問題。2.在
    發(fā)表于 01-16 16:21

    嵌入式系統(tǒng)中Nand Flash平衡的研究

    由于Nand Flash 之前需要擦除且使用壽命有限,為了提高Nand Flash 的使用壽命,需要對Nand Flash 存儲塊進(jìn)行均衡
    發(fā)表于 08-11 08:10 ?17次下載

    電池管理器件的/操作

    電池管理器件的/操作 Dallas Semiconductor 的電池管理IC 采用相同的通信協(xié)議和相同的存儲器地址不同類型的存儲器可以分別進(jìn)行/
    發(fā)表于 04-12 08:50 ?21次下載

    Linux下flash操作擦除步驟

    的一段區(qū)域。 需要注意的是,在對NOR FLASH進(jìn)行讀寫數(shù)據(jù)時(shí),需要參考對應(yīng)的datasheet,例如這里選用的NOR FLASH擦除步驟如下: 通過上面的表格就知道進(jìn)行相應(yīng)操作
    發(fā)表于 06-30 09:49 ?1.5w次閱讀
    Linux下flash<b class='flag-5'>操作</b><b class='flag-5'>讀</b>、<b class='flag-5'>寫</b>、<b class='flag-5'>擦除</b>步驟

    如何徹底擦除和銷毀SSD的技巧

    SSD技術(shù)正在迅速發(fā)展。隨著價(jià)格下降,速度和容量繼續(xù)增長,SSD在存儲市場獲得更強(qiáng)的立足點(diǎn)。盡管它們有著較長的使用壽命,但即使是SSD,最終也會被淘汰,就像硬盤驅(qū)動器一樣。到那個(gè)時(shí)候,我們必須考慮
    的頭像 發(fā)表于 09-08 09:36 ?2.9w次閱讀

    如何使用QSPI Flash控制器開發(fā)板上的 QSPI Flash進(jìn)行操作

    學(xué)習(xí)內(nèi)容 本文首先介紹Flash和QSPI Flash控制器的相關(guān)內(nèi)容,然后使用 QSPI Flash 控制器,開發(fā)板上的 QSPI Flash 進(jìn)行操作。通過對比讀出的數(shù)據(jù)是否等于寫入
    的頭像 發(fā)表于 06-10 17:08 ?1.4w次閱讀
    如何使用QSPI Flash控制器開發(fā)板上的 QSPI Flash進(jìn)行<b class='flag-5'>寫</b><b class='flag-5'>讀</b><b class='flag-5'>操作</b>

    PIC何謂-修改-,導(dǎo)致的問題及其解決之道

    命令。因?yàn)檫@類命令的操作,可以再細(xì)分為個(gè)小步驟,即是(READ),修改(MODIFY),接著才是(WRITE)。 如:ADDWF,DECF,IORWF,XORWF,BSF,B
    發(fā)表于 11-16 15:51 ?2次下載
    PIC何謂<b class='flag-5'>讀</b>-修改-<b class='flag-5'>寫</b>,導(dǎo)致的問題及其解決之道

    Nand Flash驅(qū)動(實(shí)現(xiàn)初始化以及操作)

    Nand Flash驅(qū)動(實(shí)現(xiàn)初始化以及操作)
    發(fā)表于 12-02 12:36 ?11次下載
    <b class='flag-5'>Nand</b> Flash驅(qū)動(實(shí)現(xiàn)初始化以及<b class='flag-5'>讀</b><b class='flag-5'>操作</b>)

    基于STM32的內(nèi)部Flash讀寫操作

    在執(zhí)行閃存操作時(shí),任何對閃存的操作都會鎖住總線,在操作完成后讀
    的頭像 發(fā)表于 06-22 14:28 ?5315次閱讀
    基于STM32的內(nèi)部Flash讀寫<b class='flag-5'>操作</b>

    NAND Flash的寫入速度和擦除速度分別是多少

    NAND Flash的寫入速度和擦除速度會受到多種因素的影響,包括Flash芯片的具體型號、制造工藝、以及操作環(huán)境等。因此,無法給出確切的數(shù)值。
    的頭像 發(fā)表于 02-19 12:41 ?4428次閱讀

    瀚海微SD NAND應(yīng)用存儲功能描述(7)擦除和寫保護(hù)

    多塊操作之前的預(yù)擦除設(shè)置 設(shè)置預(yù)擦除塊數(shù)量(ACMD23)將使后續(xù)的多塊
    的頭像 發(fā)表于 08-07 10:36 ?369次閱讀
    瀚海微SD <b class='flag-5'>NAND</b>應(yīng)用存儲功能描述(7)<b class='flag-5'>擦除</b>和寫保護(hù)
    澳门百家乐官网经| 百家乐官网大眼仔路| 百家乐视| 联众百家乐官网的玩法技巧和规则| 余杭棋牌世界| 澳门百家乐大小| 百家乐官网在线娱乐可信吗| 棋牌游戏评测网| 澳门百家乐网上赌博| 百家乐官网大娱乐场开户注册| 武功县| 百家乐园选| 百家乐策略详解| 太阳城百家乐官网看牌| 360棋牌游戏| 百家乐赌博论坛| 中原百家乐官网的玩法技巧和规则| 万全县| 大发888娱乐场优惠| 百家乐网络赌博地址| 安桌百家乐官网游戏百家乐官网| 成都市| 大发888娱乐城可靠吗| 百家乐游戏世界视频| 百家乐官网透明发牌靴| 百家乐官网投注法则| 亲朋棋牌捕鱼辅助| 连环百家乐的玩法技巧和规则| 百家乐招商用语| 泰来百家乐官网导航| 大发888娱乐城官方网站| 百家乐娱乐分析软件v4.0| 百家乐官网技巧开户| 澳门百家乐官网鸿运| 富锦市| 六合彩开奖现场直播| 大发888娱乐城真钱lm0| 百家乐9点直赢| 百家乐拍是什么| 欧洲百家乐官网的玩法技巧和规则| 真钱百家乐官网游戏大全|