在這個部分,我會解釋寫操作在頁和塊級是如何處理的,以及寫入放大和損耗均衡計算的基本概念。此外,我描述了快閃記憶體轉換層(FTL)的概念,以及應用了快閃記憶體轉換層的兩個技術:邏輯塊地址對映和垃圾回收。更詳細的說,我解釋了在混合邏輯塊對映背景下的寫操作是怎麼實現的。
3. 基本操作
3.1 讀出、寫入、擦除
因為NAND快閃記憶體單元的組織結構限制,單獨讀寫一個快閃記憶體單元是不可能的。儲存單元被組織起來並有著十分特別的屬性。要知道這些屬性對於為固態硬碟優化資料結構的過程和理解其行為來說是很重要的。我 在下方描述了關於讀寫擦除操作的SSD的基本屬性
讀是以頁大小對齊的
一次讀取少於一頁的內容是不可能的。作業系統當然可以只請求一位元組,但是SSD會訪問整個頁,強制讀取遠超所需的資料。
寫是以頁大小對齊的
將資料寫入SSD的時候,寫入的增量也是頁大小。因此即使一個寫入操作隻影響到一個位元組,無論如何整個頁都會寫入。寫入比所需更多的資料的行為被稱為寫入放大,其概念在3.3節。另外,向某頁寫入的行為有時候被稱為“編置(to program)”一頁,因此在大多數關於SSD的出版物和文章中“write 寫”和“program編置”是可以互相替換的
頁不能被複寫
NAND快閃記憶體頁只有在其“空閒”著的時候才能寫入。當資料改變後,這頁的內容被拷貝到一個內部暫存器,此時資料更新而新版本的資料儲存在一個“空閒”的頁中,這被稱為“讀-改-寫”操作。資料並非就地更新,因為“空閒”頁與原來儲存資料的頁不是同一個頁。一旦資料被硬碟儲存,原先的頁被標記為“stale(意為 腐敗的 不新鮮的)”,直到其被擦除。
擦除以塊對齊
頁不能被複寫,而一旦其成為stale,讓其重新空閒下來的唯一方法是擦除他們。但是對單個頁進行擦除是不可能的,只能一次擦除整個塊。在使用者看來,訪問資料的時候只有讀和寫命令。擦除命令則是當SSD控制器需要回收stale頁來獲取空閒空間的時候,由其垃圾回收程式觸發。
3.2 寫入的例子
讓我們用個例子來理清3.1節的這些概念。下邊的圖4是向SSD寫入的一個例子。只顯示了兩個塊,每個塊有4個頁。顯然這是一個為了簡化我在這使用的例子而精簡的NAND快閃記憶體封裝示意。圖中的每一步裡,圖右側的圓點解釋了發生的事情
圖4:向固態硬碟中寫資料
3.3 寫入放大
因為寫入是按頁大小對齊的,任何沒有對齊一個或者多個頁大小的寫操作都會寫入大於所需的資料,這是寫入放大的概念[13]。寫一個位元組最終導致一整頁都要寫入,而一頁的大小在某些型號的SSD中可能達到16KB,這是相當沒有效率的。
而這不是唯一的問題。除了寫入過多的資料外,這些額外的寫入也會觸發更多不必要的內部操作。實際上,用未對齊的方法寫入資料會導致在更改和寫回硬碟之前需要頁讀到快取,這比直接寫入硬碟要慢。這個操作被稱為讀-改-寫,且應該儘可能的避免[2, 5]。
絕不進行少於一頁的寫入
避免寫入小於NAND快閃記憶體頁大小的資料塊來最小化寫入放大和讀-改-寫操作。現在一頁的大小最大的是16KB,因此這個值應作為預設值使用。快閃記憶體頁大小的值基於SSD型號並且在未來SSD發展中可能會增加。
對齊寫入
以頁大小對齊寫入,並寫入大小為數個頁大小的資料塊。
快取化小寫入
為了最大化吞吐量,儘可能的將小資料寫入RAM快取中,當快取滿了之後執行一個大的寫入來合併所有的小寫入。
3.4 損耗均衡
如我們在1.1節討論的那樣,NAND快閃記憶體單元因其有P/E迴圈限制導致其有生命限制。想象一下我們有一個SSD,資料總是在同一個塊上寫入。這個塊將很快達到其P/E迴圈限制、耗盡。而SSD控制器井標記其為不可用。這樣硬碟的容量將減小。想象一下買了一個500GB的硬碟,過了幾年還剩250G,這會非常惱火。
因此,SSD控制器的一個主要目標是實現損耗均衡,即是將P/E迴圈在塊間儘可能的平均分配。理想上,所有的塊會在同一時間達到P/E迴圈上限並耗盡。[12, 14]
為了達到最好的全域性損耗均衡,SSD控制器需要明智的選擇要寫入的塊,且可能需要在數個塊之間移動,其內部的程式會導致寫入放大的增加。因此,塊的管理是在最大化損耗均衡和最小話寫入放大之間的權衡。
製造商想出各種各樣的功能來實現損耗均衡,例如下一節要講的垃圾回收。
損耗均衡
因為NAND快閃記憶體單元會耗盡,FTL的一個主要目標是儘可能平均的將工作分配給各個快閃記憶體單元,這樣使得各個塊將會在同一時間達到他們的P/E迴圈限制而耗盡。
4.快閃記憶體轉換層(FTL)
4.1 FTL存在的必要性
使用SSD如此容易的主要因素是其使用和HDD相同的主機介面。儘管一組邏輯塊地址(LBA)的出現使其感覺像HDD的扇區一樣可被複寫,但其並非完全符合快閃記憶體的工作方式。因此需要一個額外的元件來隱藏NAND快閃記憶體的內部特徵,並只向主機暴露一組LBA。這個元件稱為快閃記憶體轉換層(FTL),位於SSD控制器中。FTL很關鍵,並有兩個主要的作用,邏輯塊定址和垃圾回收。
4.2邏輯塊對映
邏輯塊對映將來自主機空間的邏輯塊地址(LBA)轉換為物理NAND快閃記憶體空間的物理塊地址(PBA)。為了訪問速度,這個對映表儲存在SSD的RAM中,並儲存在快閃記憶體中以防電源故障。當SSD啟動後,這個表從快閃記憶體中讀出並在SSD的RAM中重建[1, 5]。
一個比較簡單的方法是使用頁級對映來將主機的所有邏輯頁對映為物理頁。這個對映方法提供了很大的靈活性,然而主要的缺點是對映表需要大量的記憶體,這會顯著地增加生產成本。一個解決方案是使用塊級對映不再對頁,而是對塊進行對映。假設一個SSD硬碟每個塊有256個頁。這表示塊級對映需要的記憶體是頁級對映的256分之一,這是記憶體使用的巨大優化。然而這個對映仍然需要儲存在硬碟上以防掉電。同時,以防大量小更新的工作負載,無論頁是否是滿的,全部快閃記憶體塊都會寫入。這會增加寫入放大並使得塊級對映普遍低效[1, 2]。
頁級對映和塊級對映的折中其實是在效能和空間之間折中的一個表現。一些研究者試著在兩個方面都能夠最佳化,得到了稱為“hybrid(混合)”的方法[10]。最普遍的是日誌塊對映,其使用了一種比較像日誌結構檔案系統的方法。輸入的寫操作按順序寫入日誌塊中。當一個日誌塊滿了之後,將其和與其在相同邏輯塊編號(LBN)的資料塊合併到空塊中。只需要維護少量的日誌塊,且允許以頁粒度維護。而塊級對映是以塊粒度維護的。
下邊的圖5是對混合日誌塊FTL的一個簡單的陳述,每個塊有4個頁。FTL處理4個寫操作,都是頁大小尺寸的寫入。邏輯頁編號5和9都被對映到LBN(邏輯塊編號)=1,而LBN=1關聯到物理塊#1000。最初,在邏輯塊對映表中,LBN=1的所有物理頁offset都是null,而日誌塊#1000同樣是完全空的。
第一個寫入將b’寫到LPN=5,這被日誌塊對映表解釋到LBN=1,即為關聯到PBN=1000(日誌塊#1000)。因此頁b’寫到塊#1000的0號頁中。對映用的後設資料需要更新,為此,邏輯offset 1(隨便舉的例子)對應的物理offset從null改為0。
寫入操作繼續而對映後設資料隨之更新,當日志塊#1000完全填滿,將其和對應為相同的邏輯塊的資料塊(本例中是#3000)合併。這個資料可以從資料塊對映表中讀取,此表將邏輯塊對映為物理塊。合併操作的結果資料被寫到新的空塊中,本例中為#9000。當這個工作做完了,塊#1000和#3000可以被擦除成為空塊,而塊#9000成為一個資料塊。資料塊對映表中LBN=1的後設資料則從一開始的#3000改為新的資料塊#9000.
一個值得注意的很重要的事情是,四個寫操作只集中在兩個LPN中。邏輯塊方法在合併的過程中隱藏了b’和d’操作,直接使用更加新的b”和d”版本,使其能夠更好的降低寫入放大。最後,如果讀命令請求一個最新更新但還沒合併到資料塊中的頁,這個頁將會在日誌塊中讀取,否者將會在資料塊中找到。這就是如圖5中所示,讀操作即需要讀取日誌塊對映表又需要讀取資料塊對映表的原因。
圖5:混合日誌塊FTL
日誌塊FTL可以進行優化,其最值得注意的是切換合併,有時候也叫做“交換合併”。假設邏輯塊中所有地址都立馬寫滿了,這表示這些地址的所有新資料都將寫到一個像樣的日誌塊中。既然這個日誌塊包含的資料是一整個邏輯塊的資料,那麼將其和資料塊合併到新的空塊中是沒有意義的,因為儲存合併結果的空塊中的資料就是日誌塊中的資料。只更新資料塊對映表中的後設資料並將資料塊對映表中的資料塊切換為日誌塊將會更快,這就是切換合併。
很多論文都討論日誌塊對映方案,這些論文導致了一系列的改進,例如FAST(Fully Associative Sector Translation 完全關聯扇區轉換)、superblock mapping(超塊對映)、以及flexible group mapping(靈活組對映)。同樣還有其他的對映方案,例如Mitsubishi(三菱)演算法和SSR。下面兩篇論文是學習更多關於FTL和對映方案的很好的開始點
- “A Survey of Flash Translation Layer“, Chung et al., 2009 [9]
- “A Reconfigurable FTL (Flash Translation Layer) Architecture for NAND Flash-Based Applications“, Park et al., 2008 [10]
快閃記憶體轉換層
快閃記憶體轉換層是SSD控制器的一個元件,它將來自主機的邏輯塊地址(LBA)對映為硬碟上的物理塊地址(PBA)。大部分最新的硬碟使用了一種叫做“混合日誌塊對映”的技術或者其衍生技術,其工作方式比較像日誌結構檔案系統。這種技術可以將隨機寫入當做序列寫入處理。
4.3 關於行業狀態的註記.
在2014年2月2日,Wikipedia [64]上列出了70個SSD的生產商,有意義的是,只有11個主控的生產商[65]。在這11個主控生產商之中,只有4個是“captive(自給自足的)”,即僅對它們自己的產品使用自己的主控(譬如Intel和三星);而其他的7個是“independent(獨立的)”,即他們把自己的主控賣給其他的硬碟生產商。這些數字表示,這7個公司生產固態硬碟市場上90%的主控。
我沒有這90%中,關於哪個主控生產商賣給哪個硬碟生產商的資料嗎,但是根據帕雷託法則(二八定律或80/20法則——譯註),我賭只有兩三家主控制造商分享了大部分的蛋糕。直接結論是,來自非自給自足廠家的SSD,因其本質上使用相同的主控或至少其主控使用相同的全域性設計和底層思想,其行為會及其相似。
對映方案作為主控的一部分是SSD十分重要的元件,因為其往往完全定義了硬碟的表現。這就解釋了為什麼在有如此多競爭的產業中,SSD主控生產商不分享其FTL實現的細節。因此,即使有大量的公共可用的關於FTL演算法的研究,但仍然不清楚主控生產商使用了多少研究,以及某個牌子和型號具體實現了什麼。
這篇文章[3]的作者聲稱通過分析工作負載,他們可以對硬碟的對映策略進行反向工程。除非晶片中的二進位制程式碼本身被反向工程,我自己還是不太認同這種方法。因為沒有辦法完全確認某個硬碟中對映策略真正做了什麼。並且預測一個特定的工作負載下對映的行為更難。
因為有很大量的不同對映策略,而對市場上所有可用韌體進行反向工程所花費的時間的量值得考慮。然後,即使獲得了所有可能的對映政策的原始碼,你能拿來幹啥?新產品的系統需求經常導致全面改進,使用未標明和內部易變的硬體元件。因此,只為一個對映政策進行優化是不值當的,因為這個優化的方案可能在其他所有對映政策表現很差。某人想只對一種對映政策進行優化的唯一原因是他在為已經保證使用一致硬體的嵌入式系統進行開發。
綜上所述,我得說知道某一個SSD具體使用的是哪一個對映政策並不重要。唯一重要的事情是知道對映政策是LBA和PBA之間的轉換層,而其很像混合日誌塊或其衍生演算法的實現。因此,寫入大小至少是NAND快閃記憶體塊大小的資料片將會更加效率,因為對於FTL來說,更新對映及其後設資料的開支是最小化的。
4.4 垃圾回收
如我在4.1和4.2節中所說,頁不能被複寫。如果頁中的資料必須更新,新版本必須寫到空頁中,而儲存之前版本資料的頁被標記為stale。當塊被stale頁充滿後,其需要在能夠再寫入之前進行擦除。
垃圾回收
SSD控制器中的垃圾回收程式確保“stale”的頁被擦除並變為“free”狀態,使得進來的寫入命令可以訪問這個頁。
如第一節中所說,擦除命令需要1500-3500 μs,寫入命令需要250-1500 μs。因為擦除比寫入需要更高的延遲,額外的擦除步驟導致一個延遲使得寫入更慢。因此,一些控制器實現了後臺垃圾回收程式,或者被稱為閒置垃圾回收,其充分利用空閒時間並經常在後臺執行以回收stale頁並確保將來的前臺操作具有不足夠的空頁來實現最高效能[1]。其他的實現使用並行垃圾回收方法,其在來自主機的寫入操作的同時,以並行方式進行垃圾回收操作。
遇到寫入工作負載重到垃圾回收需要在主機來了命令之後實時執行的情況並非罕見。在這種情況下,本應執行在後臺的垃圾回收程式可能會干預到前臺命令[1]。TRIM命令和預留空間是減少這種影響的很好的方法,具體細節將在6.1和6.2節介紹。
後臺操作可能影響前臺操作
諸如垃圾回收後臺操作可能會對來自主機的前臺操作造成負面影響,尤其是在持續的小隨機寫入的工作負載下。
塊需要移動的一個不太重要的原因是read disturb(讀取擾亂)。讀取可能改變臨近單元的狀態,因此需要再一定數量的讀取之後移動塊資料[14]。
資料改變率是一個很重要的影響因素。有些資料很少變化,稱為冷資料或者靜態資料,而其他一些資料更新的很頻繁,稱為熱資料或者動態資料。如果一個頁一部分儲存冷資料,另一部分儲存熱資料,這樣冷資料會隨著熱資料一起在垃圾回收以損耗均衡的過程中拷貝,冷資料的存在增加了寫入放大。這可以通過將冷資料從熱資料之中分離出來,儲存到另外的頁中來避免。缺點是這樣會使儲存冷資料的頁更少擦除,因此必須將儲存冷資料和熱資料的塊經常交換以確保損耗均衡。
因為資料的熱度是在應用級確定的,FTL沒法知道一個頁中有多少冷資料和熱資料。改進SSD效能的一個辦法是儘可能將冷熱資料分到不同的頁中,使垃圾回收的工作更簡單。
分開冷熱資料
熱資料是經常改變的資料,而冷資料是不經常改變的資料。如果一些熱資料和冷資料一起儲存到同一個頁中,冷資料會隨著熱資料的讀-改-寫操作一起復制很多次,並在為了損耗均衡進行垃圾回收過程中一起移動。儘可能的將冷熱資料分到不同的頁中是垃圾回收的工作更簡單
快取熱資料
極其熱的資料應該儘可能多的快取,並儘可能的少的寫入到硬碟中。
以較大的量廢除舊資料
當一些資料不再需要或者需要刪除的時候,最好等其它的資料一起,在一個操作中廢除一大批資料。這會使垃圾回收程式一次處理更大的區域而最小化內部碎片。
引用
[1] Understanding Intrinsic Characteristics and System Implications of Flash Memory based Solid State Drives, Chen et al., 2009
[2] Parameter-Aware I/O Management for Solid State Disks (SSDs), Kim et al., 2012
[3] Essential roles of exploiting internal parallelism of flash memory based solid state drives in high-speed data processing, Chen et al, 2011
[4] Exploring and Exploiting the Multilevel Parallelism Inside SSDs for Improved Performance and Endurance, Hu et al., 2013
[5] Design Tradeoffs for SSD Performance, Agrawal et al., 2008
[6] Design Patterns for Tunable and Efficient SSD-based Indexes, Anand et al., 2012
[7] BPLRU: A Buffer Management Scheme for Improving Random Writes in Flash Storage, Kim et al., 2008
[8] SFS: Random Write Considered Harmful in Solid State Drives, Min et al., 2012
[9] A Survey of Flash Translation Layer, Chung et al., 2009
[10] A Reconfigurable FTL (Flash Translation Layer) Architecture for NAND Flash-Based Applications, Park et al., 2008
[11] Reliably Erasing Data From Flash-Based Solid State Drives, Wei et al., 2011
[12] http://en.wikipedia.org/wiki/Solid-state_drive
[13] http://en.wikipedia.org/wiki/Write_amplification
[14] http://en.wikipedia.org/wiki/Flash_memory
[15] http://en.wikipedia.org/wiki/Serial_ATA
[16] http://en.wikipedia.org/wiki/Trim_(computing)
[17] http://en.wikipedia.org/wiki/IOPS
[18] http://en.wikipedia.org/wiki/Hard_disk_drive
[19]http://en.wikipedia.org/wiki/Hard_disk_drive_performance_characteristics
[20] http://centon.com/flash-products/chiptype
[21] http://www.thessdreview.com/our-reviews/samsung-64gb-mlc-ssd/
[22] http://www.anandtech.com/show/7594/samsung-ssd-840-evo-msata-120gb-250gb-500gb-1tb-review
[23] http://www.anandtech.com/show/6337/samsung-ssd-840-250gb-review/2
[24] http://www.storagereview.com/ssd_vs_hdd
[25]http://www.storagereview.com/wd_black_4tb_desktop_hard_drive_review_wd4003fzex
[26]http://www.storagereview.com/samsung_ssd_840_pro_review
[27]http://www.storagereview.com/micron_p420m_enterprise_pcie_ssd_review
[28] http://www.storagereview.com/intel_x25-m_ssd_review
[29]http://www.storagereview.com/seagate_momentus_xt_750gb_review
[30]http://www.storagereview.com/corsair_vengeance_ddr3_ram_disk_review
[31] http://arstechnica.com/information-technology/2012/06/inside-the-ssd-revolution-how-solid-state-disks-really-work/
[32] http://www.anandtech.com/show/2738
[33] http://www.anandtech.com/show/2829
[34] http://www.anandtech.com/show/6489
[35] http://lwn.net/Articles/353411/
[36]http://us.hardware.info/reviews/4178/10/hardwareinfo-tests-lifespan-of-samsung-ssd-840-250gb-tlc-ssd-updated-with-final-conclusion-final-update-20-6-2013
[37] http://www.anandtech.com/show/6489/playing-with-op
[38]http://www.ssdperformanceblog.com/2011/06/intel-320-ssd-random-write-performance/
[39]http://en.wikipedia.org/wiki/Native_Command_Queuing
[40] http://superuser.com/questions/228657/which-linux-filesystem-works-best-with-ssd/
[41] http://blog.superuser.com/2011/05/10/maximizing-the-lifetime-of-your-ssd/
[42] http://serverfault.com/questions/356534/ssd-erase-block-size-lvm-pv-on-raw-device-alignment
[43] http://rethinkdb.com/blog/page-alignment-on-ssds/
[44] http://rethinkdb.com/blog/more-on-alignment-ext2-and-partitioning-on-ssds/
[45] http://rickardnobel.se/storage-performance-iops-latency-throughput/
[46] http://www.brentozar.com/archive/2013/09/iops-are-a-scam/
[47] http://www.acunu.com/2/post/2011/08/why-theory-fails-for-ssds.html
[48]http://security.stackexchange.com/questions/12503/can-wiped-ssd-data-be-recovered
[49]http://security.stackexchange.com/questions/5662/is-it-enough-to-only-wipe-a-flash-drive-once
[50]http://searchsolidstatestorage.techtarget.com/feature/The-truth-about-SSD-performance-benchmarks
[51]http://www.theregister.co.uk/2012/12/03/macronix_thermal_annealing_extends_life_of_flash_memory/
[52]http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html
[53] http://blog.nuclex-games.com/2009/12/aligning-an-ssd-on-linux/
[54] http://www.linux-mag.com/id/8397/
[55] http://tytso.livejournal.com/2009/02/20/
[56] https://wiki.debian.org/SSDOptimization
[57] http://wiki.gentoo.org/wiki/SSD
[58]https://wiki.archlinux.org/index.php/Solid_State_Drives
[59]https://www.kernel.org/doc/Documentation/block/cfq-iosched.txt
[60]http://www.danielscottlawrence.com/blog/should_i_change_my_disk_scheduler_to_use_NOOP.html
[61] http://www.phoronix.com/scan.php?page=article&item=linux_iosched_2012
[62] http://www.velobit.com/storage-performance-blog/bid/126135/Effects-Of-Linux-IO-Scheduler-On-SSD-Performance
[63] http://www.axpad.com/blog/301
[64] http://en.wikipedia.org/wiki/List_of_solid-state_drive_manufacturers
[65]http://en.wikipedia.org/wiki/List_of_flash_memory_controller_manufacturers
[66] http://blog.zorinaq.com/?e=29
[67] http://www.gamersnexus.net/guides/956-how-ssds-are-made
[68] http://www.gamersnexus.net/guides/1148-how-ram-and-ssds-are-made-smt-lines
[69]http://www.tweaktown.com/articles/4655/kingston_factory_tour_making_of_an_ssd_from_start_to_finish/index.html
[70] http://www.youtube.com/watch?v=DvA9koAMXR8
[71] http://www.youtube.com/watch?v=3s7KG6QwUeQ
[72] Understanding the Robustness of SSDs under Power Fault, Zheng et al., 2013 — [discussion on HN]
[73] http://lkcl.net/reports/ssd_analysis.html —[discussion on HN]