在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

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

比如垃圾回收(GC),一個優質的GC明白在什么時候,挑選哪些Block,將上面的數據搬到哪去。

GC的基本原理

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

關于GC的研究,可以看Memblaze金一同學的這個文章。

《GC算法仿真原理解析》

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

當有數據刪除之后,SSD并不能及時的知道誰是臟數據。形成了這樣的局面

只有操作系統往標注DEL的位置上寫數據時,盤才知道這是垃圾。

不然這些數據將一直被GC認為是有效數據搬移。為了更高效的執行GC,讓操作系統和文件系統高效的和SSD主控交流刪除文件的信息

就出現了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讓操作系統通過Trim命令(NVMe協議中有定義)告訴SSD哪些地址上的數據可以擦除,從而提升垃圾回收的效率。

Memblaze就是這么干的,

我們總結了TRIM的三大價值:

降低寫放大

提升寫性能

提高設備壽命

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

TRIM實現難在哪這里就不詳細討論了,有興趣的可以看Ron寫的文章《SSD Trim 詳解》

NVMe Spec對TRIM命令有詳細的規定,所以使NVMe Cli就可以對TRIM功能進行驗證

接下來就結合NVMe Spec的規定,發出我們的一條TRIM命令,然后做個驗證。

1

準備設備和環境

使用Memblaze官網Pblaze5 910/916系列產品中的4T U.2NVMe進行驗證測試。

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

寫入數據:從NVMe 10GiB的位置往后寫10G的數據,數據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

依據NVMe Spec準備測試文件和命令

使用nvmecli將這10G的數據trim掉,利用強大的strace命令跟蹤一下command的耗時,粗略的計算下Trim的速度。

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

Length in logical blocks和Starting LBA的計算

10G數據按照512byte的format格式得出是:

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

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

10*1024*1024*1024/512=20971520

利用python創建二進制文件代碼如下(簡單的寫個)

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命令的規范,使用nvmecli 發送NVMe command需要照著填寫

Dword11 :二進制:0b 0100=0x04

3

準備工作做足了,接下來就是發!

發TRIM時候,在命令前加上strace –ttt,可以粗略的計算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

我們經過計算得出TRIM耗時0.00124s,所以Trim的速度大約是:10 /0.00124= 8064.516GiB/s 大約8TB/s

4

TRIM后立即數據驗證

[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后數據都變成0了,至于更細節的說明,在此不再贅述。

通過一系列的介紹和實驗驗證,我們看到了TRIM的價值和實現原理。在TRIM的幫助下,NVMe SSD的GC等操作效率更高,進而達到降低寫放大,提高產品性能和壽命的效果。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • NAND
    +關注

    關注

    16

    文章

    1697

    瀏覽量

    136514
  • SSD
    SSD
    +關注

    關注

    21

    文章

    2893

    瀏覽量

    117915
  • 數據存儲
    +關注

    關注

    5

    文章

    986

    瀏覽量

    51108

原文標題:TRIM,讓你的SSD再次飛起來

文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SSD是什么意思,什么是SSD

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

    nand flash擦除寫入不成功

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

    程序燒擦除出現錯誤

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

    NAND與NOR相比有何優勢

    都可以以字節為單位,但NAND以page 為單位,而NOR 可以隨機每一個字節。NAND 和NOR 的
    發表于 12-23 06:52

    為什么我無法調用SFUD的擦除操作呢?

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

    嵌入式系統中Nand Flash平衡的研究

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

    電池管理器件的/操作

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

    Linux下flash操作擦除步驟

    的一段區域。 需要注意的是,在對NOR FLASH進行讀寫數據時,需要參考對應的datasheet,例如這里選用的NOR FLASH擦除步驟如下: 通過上面的表格就知道進行相應操作
    發表于 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技術正在迅速發展。隨著價格下降,速度和容量繼續增長,SSD在存儲市場獲得更強的立足點。盡管它們有著較長的使用壽命,但即使是SSD,最終也會被淘汰,就像硬盤驅動器一樣。到那個時候,我們必須考慮
    的頭像 發表于 09-08 09:36 ?2.9w次閱讀

    如何使用QSPI Flash控制器開發板上的 QSPI Flash進行操作

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

    PIC何謂-修改-,導致的問題及其解決之道

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

    Nand Flash驅動(實現初始化以及操作)

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

    基于STM32的內部Flash讀寫操作

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

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

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

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

    多塊操作之前的預擦除設置 設置預擦除塊數量(ACMD23)將使后續的多塊
    的頭像 發表于 08-07 10:36 ?375次閱讀
    瀚海微SD <b class='flag-5'>NAND</b>應用存儲功能描述(7)<b class='flag-5'>擦除</b>和寫保護
    主站蜘蛛池模板: www.色涩涩.com | 青草午夜精品视频在线观看 | 色多多免费视频 | 色天天综合网色鬼综合 | 亚洲午夜精品在线 | 亚洲亚洲人成网站在线观看 | 人与牲动交xx | 日本特级黄色录像 | 国产怡红院 | 女人张开双腿让男人桶爽免 | 天天爱天天做天天爽 | 久久大尺度 | 日韩porn| 日本wwwxx| 亚洲国产高清人在线 | 国产午夜三级 | 人人干日日操 | 免费看黄色网页 | 免费观看黄色网页 | 日本中文字幕在线播放 | 精品午夜久久福利大片免费 | 欲香欲色天天综合和网 | 偷自在线| 99热热热 | 色吧综合网 | 久久久久久久久久免免费精品 | 欧美1024 | 免费男女 | 77788色淫网站免费观看 | 国产美女一级ba大片免色 | 久久黄色一级片 | 337p欧洲亚洲大胆艺术 | 国产一级特黄aa大片免费 | 国产在线视频网站 | 亚洲资源最新版在线观看 | 欧美日韩国产网站 | 亚洲第一在线视频 | 日本三级香港三级人妇网站 | 国产美女叼嘿视频免费看 | 亚洲国产午夜精品理论片的软件 | 国产一级aa大片毛片 |