一些flash memory SSD的基礎知識

2021-08-25 20:25:36 字數 3457 閱讀 1892

很久沒更新blog了。前一陣子經歷了人生第一次跳槽,比想象中的艱難多了。畢竟是第乙份工作,離開還是挺傷感的。新的工作剛剛開始,希望一切順利。這篇blog是五一期間寫的,今天正式貼出來。寫技術blog是個好習慣,我要保持!

在前東家的時候,一直很想去嘗試一下flash/ssd,可惜由於各種原因到今天也沒有實現。ssd在今天越來越流行,業內的很多公司都開始嘗試使用,甚至作為主要的儲存媒介,從research的角度講,ssd更是乙個重磅,因為它顛覆了原有hard disk的一些基本假設,所以,理論上講,原先基於hard disk的那些理論和實驗都可以在ssd重新實現一回(這又能造就多少*****啊 ...)。

這兩天有些空閒,找了幾篇相關的**科普了一遍,算是打些基礎,希望將來有機會動手嘗試。以下就是一些讀書筆記,純粹紙上談兵。

ps:以下所提及的flash/ssd,都特指nand flash,也是現在最常見的flash。

關於ssd的硬體原理不是這裡討論的重點(畢竟咱是軟體開發人員)。唯一一點我覺著需要提及的是ssd不是hard disk這種機電式的硬體,而是電子晶元(microchip)。所以,使用hard disk最耗時間的seek time在ssd中基本上不存在。這個特性在後面會更詳細的討論。

在傳統的計算機儲存架構中,分了這樣的幾個層級:

cpu cache

main memory (ram)

hard disk

它們的io效能自上而下遞減,當然它們的造價也是自上而下的遞減,但是,容量卻是自上而下的遞增。

在本文中,不考慮cpu cache,從main memory和hard disk 說起。這裡挑選最重要的乙個效能指標-latency,main memory的latency一般在100ns左右(實際中很多是幾十ns),而hard disk讀寫一次的latency大概是10ms。(這裡的100ns和10ms都不是精確資料,只表示大概的數量級,另外,hard disk的latency不考慮disk自帶的buffer的影響)。

ssd一般認為是介於main memory與hard disk之間的一種儲存介質:

main memory (ram)

flash / ssd

hard disk

它的latency大概是100us左右(這個值只是一般情況)。和main memory,hard disk比較:

disk = 100 * flash;

flash = 1000 * memory;

disk = 100 * flash = 100 * 1000 memory;

所以,對於flash/ssd,乙個最直觀的概念,它比disk要快上100倍。當然,它也同樣能夠提供persistent storage。

有了這個直觀的概念,我們再更詳細的比較一下hard disk和ssd的差異:

讀:

隨機讀:

正如前面所述,hard disk會有乙個非常討厭的seek time,它一般需要幾個ms,所以hard disk 的一次隨機讀被拖累到需要10ms;而ssd的random read的效能非常之棒,在100us左右。因此,在隨機讀的情況下,ssd要比hard disk快100倍。

順序讀:

順序讀的場景是一次讀入連續的資料塊,比如連續讀1m的資料。這種情況兩者的比較就麻煩了。hard disk的一次順序讀只需要消耗一次seek time,因此它的整體latency會大大降低;而對於ssd來說,它的順序讀和隨機讀是一樣的,比如順序讀16k資料就相當於隨機讀2k*8次,和hard disk相比,優勢就小多了。我手裡有個資料,flash讀取256kb的page,花費3.98ms,而hard disk也只需要12.85ms,差異遠不到100倍。

寫:

寫當然也包括了隨機寫和順序寫。對於hard disk來說,它的寫行為和讀是類似的,所以,hard disk的讀和寫的latency非常的接近,都是大概10ms+。

至於ssd,它的讀和寫就有很大差異了。首先,random write的latency要比random read的大一倍,比如random read的latency是100us的話,那麼random write的latency就大概是200us了。這主要是由於ssd的硬體特性決定的。當然,雖然latency大了近一倍,但是和hard disk的random write相比,還是快很多的。

其次,順序寫的情況下,ssd也面臨著和順序讀一樣的問題,即它不會因為順序的操作方式而獲得額外的好處,因為,和hard disk相比,它的優勢會縮小;

最後,也是最有意思的一點,over-write(覆蓋寫)的情況。對於hard disk而言,覆蓋寫和普通的寫沒有區別;但是在ssd中,不存在嚴格意義的over-write,也就是說,ssd是不允許直接向一塊已經寫入資料的區域再寫入資料。如果要達到over-write的效果,必須首先執行一次erase操作,將資料塊的原有資料進行擦除,然後再寫入新的資料。而一次erase操作,大概耗時1.5ms。這就完了嗎?不,還有更慘的。比如over-write乙個2k的資料,但是,一次erase操作所執行的區域(稱為erase unit)可能是128k,所以,為了寫入這個2k的資料,需要擦除128k的資料,再將這些資料和新的2k資料寫回到ssd上。整個過程有可能導致這次write操作比在hard disk上執行還慢。

分析過後,我們可以歸納,ssd在random read的時候比hard disk快兩個數量級,在執行順序讀寫的時候也會比hard disk好一些,最恐怖的是出現了over-write,這種情況下ssd有可能比hard disk效能還差。

接下來,簡單的回答乙個有趣的問題:到底應該怎樣使用ssd呢?

一種簡單的做法,就是將ssd作為hard disk的替代品,拋棄hard disk,完全用ssd作為資料的持久化介質。這樣做當然沒什麼問題,而且,基本上所有的ssd對外的介面都是block device - 和hard disk一樣。所以,操作ssd和操作hard disk從作業系統上看來介面沒區別。唯一可能要考慮的,就是ssd較高的出錯率。這是個麻煩。

另外的更複雜的做法,就是將ssd當成memory和hard disk之間的一種新的介質,三者同時存在。這種情況下,或者將ssd作為memory的乙個擴充套件的buffer pool,或者作為disk之外的乙個persistent storage的擴充套件。應該選哪個呢?

文獻給出了答案。整個論證過程比較複雜,就不多說,直接看*****好了。簡單來說,不同的系統用法不一樣。file system中,檔案往往是一塊很大的位元組流,對於檔案的操作往往是將整個檔案讀入到記憶體中。一般在disk上要分配多個連續的block以儲存乙個檔案。在這種情況下,更適合將flash當成是memory的擴充套件。因為當把檔案都讀入到flash(相當於記憶體)中進行操作時,一旦系統崩潰,flash中的正在修改的檔案能夠被寫回到disk上。但是,對於database system,flash更適用於做成disk的擴充套件。具體原因見*****吧。

the five-minute rule twenty years later,and how flash memory changes the rules

一些人,一些事,一些

我覺得這是國內it企業浮躁和傳統的官本位性質決定的,導致國內企業都本末倒置。要想改變命運,我覺得有以下出路 1.不做技術了,改做混混 混混的概念很廣泛的,比如銷售 經理 幹部 皮包公司之類其實都屬於這類。中國就是這樣,越浮越掙錢,只有混混才能發財。要不更進一步,做流氓,廣義的流氓,也很不錯。2.專心...

AND一些經驗

目錄 一 參考 1 程式設計師2020工作規範范文 總結 good 適合多看,程式設計師每天 每月做的事情總結了 一 目的 1 在公司來了很久了,有時候一些經驗想把記錄下來,專案 做人 等等 一 專案 1 板卡 pci2012a分為支援和不支援音效卡的 一 做人 1 不要過度依賴別人 1 有問題立馬...

一路走來,一些感觸,一些想法

頂著春運風暴,終於到家了。其實是昨天到家的,到家累的不行倒頭大睡,沒來得及寫。今天有時間就把自己的想法和大家分享下 記得在上篇博文中,我跟大家說過我們的團隊要代表學校參加乙個微軟的創新杯比賽,所以我也就隨團隊留校做那個參賽專案。今天是16號,其實我們8號就放假了,在學校待了將近一星期。本來買的是16...