本第二部分包含了“為SSD程式設計”的6個內容,包括1、2兩節,你可以參考目錄。這是我在閱讀了各種關於SSD的文件之後,為了分享我所學到的東西寫的一系列文章。如果你沒有時間慢慢看,你可以直接跳轉到第六部分,這部分總結了所有其他部分的內容。
在本部分,我將解釋NAND快閃記憶體的基本知識、快閃記憶體單元型別、和基本SSD內部架構。同樣包括了SSD基準和如何解釋這些基準。
1. SSD的架構
1.1 NAND快閃記憶體單元
固態硬碟(SSD)是基於快閃記憶體的資料儲存裝置。每個資料位儲存在由浮柵電晶體制成的快閃記憶體單元裡。SSD整個都是由電子元件製成的,沒有像硬碟那樣的移動或者機械的部分。
在浮柵電晶體中,使用電壓來實現每個位的讀寫和擦除。寫電晶體有兩個方法:NOR快閃記憶體和NAND快閃記憶體。我不會更加深入的討論NOR和NAND快閃記憶體的不同。本文將只包含被大多數製造商採用的NAND快閃記憶體。更多關於NOR和 NAND的不同點的資訊,你可以參考Lee Hutchinson寫的這篇文章[31]
NAND快閃記憶體模組的一個重要特徵是,他們的快閃記憶體單元是損耗性的,因此它們有一個壽命。實際上,電晶體是通過儲存電子來實現儲存位元資訊的。在每個P/E迴圈(Program/Erase,“Program”在這表示寫)中電子可能被電晶體誤捕,一段是時間以後,大量電子被捕獲會使得快閃記憶體單元不可用。
有限的壽命
每個單元有一個最大的P/E 迴圈數量,當快閃記憶體單元被認為有缺陷後,NAND快閃記憶體被損耗而擁有一個有限的壽命。不同型別的NAND快閃記憶體有不同的壽命[31]。
最近的研究表示,通過給NAND一個相當高的溫度,被捕獲的電子可以被清除[14, 51]。儘管這仍然還只是研究,並且還沒有確定到底哪一天能夠將這個研究應用的消費市場,但這確實可以極大地增加SSD的壽命。
目前業界中的快閃記憶體單元型別有:
- 單層單元(SLC),這種的電晶體只能儲存一個位元但壽命很長。
- 多層單元(MLC),這種的電晶體可以儲存2個位元,但是會導致增加延遲時間和相對於SLC減少壽命。
- 三層單元(TLC),這種的電晶體可以儲存3個位元,但是會有更高的延遲時間和更短的壽命。
快閃記憶體單元型別
固態硬碟(SSD)是基於快閃記憶體的資料儲存裝置。位元儲存在快閃記憶體單元中,有三種快閃記憶體單元型別:每個單元1位元(單層單元,SLC),每個單元2位元(多層單元,MLC),和每單元3位元(三層單元,TLC)。
下方的表1中是每種NAND型別的詳細資訊。為了比較,我新增了硬碟、記憶體、和L1/L2快取的平均延遲。
SLC |
MLC |
TLC |
HDD |
RAM |
L1 cache |
L2 cache |
|
P/E迴圈 |
100k |
10k |
5k |
* |
* |
* |
* |
每單元位元數量 |
1 |
2 |
3 |
* |
* |
* |
* |
定址用時(μs) |
* |
* |
* |
9000 |
* |
* |
* |
讀取用時(μs) |
25 |
50 |
100 |
2000-7000 |
0.04-0.1 |
0.001 |
0.004 |
寫入用時(μs) |
250 |
900 |
1500 |
2000-7000 |
0.04-0.1 |
0.001 |
0.004 |
擦除用時(μs) |
1500 |
3000 |
5000 |
* |
* |
* |
* |
備註 |
* 該種計量不適用此種儲存裝置 |
||||||
引用 |
P/E 迴圈 [20] |
表1:NAND快閃記憶體不同型別的特徵和用時與其他記憶元件比較
在相同數量的電晶體中的位元數更多可以降低生產成本。與基於MLC的SSD相比,基於SLC的SSD更可靠,並具有更長的壽命,但是有更高的生產成本。因此一般的大眾SSD是基於MLC或者TLC的,只有專業的SSD是基於SLC的。因此往往會基於硬碟的目標工作負載和可能的資料更新頻率,選擇正確的儲存型別。對於較高的更新工作負載,SLC是最後的選擇,而高讀取低寫入的工作負載(例如視訊儲存和直播),TLC將極其適合。另外,TLC硬碟基於實際工作負載的基準檢測顯示出在實際中不必考慮基於TLC的SSD壽命。
NAND快閃記憶體的頁和塊
快閃記憶體的模組組織在被稱為塊的格子中,而塊則組織成平面。塊中可以讀寫的最小單元稱為頁。頁不能獨立擦除,只能整塊擦除。NAND快閃記憶體的頁大小可能是不一樣的,大多數硬碟的頁大小是2 KB, 4 KB, 8 KB 或 16 KB。大多數SSD的塊有128或256頁,這即表示塊的大小也可能是256KB和4MB之間不同的值。例如Samsung SSD 840 EVO的塊大小是2048KB,而每個塊有256個8KB的頁。頁和塊訪問的細節在3.1節中
1.2 SSD的組織
下方的圖1是SSD硬碟及其元件的示例。我只是重複了數篇論文[2, 3, 6]中已有的基本示意圖。
圖1:固態硬碟的架構
來自使用者的命令是通過主機介面交換的。在我寫這篇文章的時候,最新發布的SSD有兩種最普遍的介面:SATA和PCIe。SSD控制器中的處理器接收這些命令並將它們傳遞給快閃記憶體控制器。SSD同樣內嵌有RAM儲存器,通常是作為快取和儲存對映資訊使用。章節4包含了關於對映策略的細節資訊。NAND快閃記憶體晶片通過多個通道組織在一起,和這些通道有關的資訊在章節6中。
下方的圖2和圖3是從StorageReview.com [26, 27] 複製過來的,展示出真的SSD是長的什麼樣子的。
- 1個SATA3.0介面
- 1個SSD控制器(Samsung MDX S4LN021X01-8030)
- 1個RAM模組(256 MB DDR2 Samsung K4P4G324EB-FGC2)
- 8個MLC NAND快閃記憶體模組,每個模組有64G的儲存空間(Samsung K9PHGY8U7A-CCK0)
圖2:三星固態硬碟840 Pro(512 GB)— 感謝StorageReview.com[26] 的圖片
圖3是一個美光P420m 企業級PCIe固態硬碟,2013年末釋出。主要元件有:
- PCIe 2.0介面 x8
- 1個SSD控制器
- 1個RAM模組(DRAM DDR3)
- 32通道上的64個MLC NAND快閃記憶體模組,每個模組有32GB的儲存空間(Micron 31C12NQ314?25nm)
總儲存空間為2048GB,但在應用over-provisioning技術後只有1.4TB可用。
圖3:美光P420m企業級PCIe固態硬碟(1.4TB)— 感謝StorageReview.com[27] 的圖片
1.3生產過程
很多SSD的生產商使用表面貼裝技術(SMT,電子元件直接放置在PCB板上的一種生產方法)來生產SSD。SMT生產線由一系列機器組成,每個機器上下銜接,並有各自生產過程中的任務,例如安放元件或者融化焊錫。整個生產過程中同樣貫穿了多重質量檢測。Steve Burke的兩篇參觀金士頓在加利福利亞芳泉谷市的生產工廠的文章[67, 68]和Cameron Wilmot的一篇關於臺灣金士頓組裝工廠的文章[69]中,有SMT生產線的照片和視訊。
另外還有兩個有趣的視訊,一個是關於美光Crucial SSD[70]的,而另一個是關於金士頓[71]。後邊一個視訊是Steve Burke文章的一部分,我同樣在下方引用了。金士頓的Mark Tekunoff領讀者參觀了他們SMT生產線。有意思的是,視訊中的每個人都穿著一套萌萌的抗靜電服,看起來很有意思。
2.基準和效能度量
2.1基本基準
下邊的表2展示的是不同的固態硬碟在順序和隨機工作負載下的讀寫速度。為了便於比較,這裡包含了2008年到2013年釋出的SSD、一個硬碟盒、和一個記憶體晶片
Samsung 64 GB |
Intel X25-M |
Samsung 840 EVO |
Micron P420m |
HDD |
RAM |
|
品牌 / 型號 |
Samsung(MCCDE64G5MPP-OVA) |
Intel X25-M(SSDSA2MH080G1GC) |
Samsung(SSD 840 EVO mSATA) |
Micron P420m |
Western Digital Black 7200 rpm |
Corsair Vengeance DDR3 |
儲存單元型別 |
MLC |
MLC |
TLC |
MLC |
* |
* |
上市年份 |
2008 |
2008 |
2013 |
2013 |
2013 |
2012 |
介面 |
SATA 2.0 |
SATA 2.0 |
SATA 3.0 |
PCIe 2.0 |
SATA 3.0 |
* |
總容量 |
64 GB |
80 GB |
1 TB |
1.4 TB |
4 TB |
4 x 4 GB |
每塊的頁數 |
128 |
128 |
256 |
512 |
* |
* |
頁大小 |
4 KB |
4 KB |
8 KB |
16 KB |
* |
* |
塊大小 |
512 KB |
512 KB |
2048 KB |
8196 KB |
* |
* |
順序讀取 (MB/s) |
100 |
254 |
540 |
3300 |
185 |
7233 |
順序寫入 (MB/s) |
92 |
78 |
520 |
630 |
185 |
5872 |
4KB 隨機讀取(MB/s) |
17 |
23.6 |
383 |
2292 |
0.54 |
5319 ** |
4KB 隨機寫入 (MB/s) |
5.5 |
11.2 |
352 |
390 |
0.85 |
5729 ** |
4KB 隨機讀取(KIOPS) |
4 |
6 |
98 |
587 |
0.14 |
105 |
4KB 隨機寫入 (KIOPS) |
1.5 |
2.8 |
90 |
100 |
0.22 |
102 |
注意 |
* 儲存裝置不支援該指標 |
|||||
指標 |
MB/s: MB每秒 |
|||||
引用 |
Samsung 64 GB[21] |
表2: 固態硬碟與其他儲存裝置比較,特徵和讀寫速度
影響效能的一個重要因素是介面。最新發布的SSD最常使用的介面是SATA3.0和PCI Express 3.0。使用SATA3.0介面時,資料傳輸速度可以達到6 Gbit/s,而在實際上大概能夠達到550MB/s。而使用PCIe 3.0可以達到每條8 GT/s,而實際上能達到大概1 GB/s(GT/s是指G次傳輸(Gigatransfers)每秒)。使用PCIe 3.0介面的SSD都會使用不止一條通道。使用4條通道的話(譯註:PCIe 3.0 x4),PCIe 3.0可以提供最大4 GB/s,的頻寬,相當於SATA3.0的四倍一些企業級的SSD同樣提供序列SCSI介面(SAS),最新版本的SAS可以提供最高12 GBit/s的速度,但是現在SAS的市場佔有量很小。
大部分近期的的SSD的內部速度可以滿足550 MB/s的SATA3.0限制,因此介面是其速度瓶頸。使用PCI Express 3.0或者SAS的SSD可以提供巨大的效能提升。
PCI Express 和SAS 比 SATA要快
生產商提供的兩個主要介面是SATA3.0(550MB/s)和PCI Express 3.0 (每通道1 GB/s, 使用多個通道)。序列SCSI(SAS)同樣應用在企業級SSD上。最新版本的介面定義中PCI Express 和SAS 比 SATA要快,但是同樣要更貴。
2.2 預處理
如果你折磨資料足夠久,它會招的 —— Ronald Coase
SSD生產商提供的資料資料充斥著令人驚訝的效能值。確實,通過各種亂七八糟的方法對資料處理足夠長的時間,生產商似乎總能找到方法在商業傳單上顯擺那些閃亮的數字。這些數字是否真的有意義,或者能否真的反映產品系統的效能則是另外的問題。Marc Bevand在他關於常見SSD效能基準缺陷的文章中[66],提到了一些例子。例如常見的報導隨機寫負載的IOPS(每秒讀寫操作次數)而不提所跨的LBA(邏輯區塊地址)的範圍,很多IOPS的資料只是基於佇列深度為1,而非整個硬碟最大值而測試的。同樣也有很多基準效能測試工具誤用的例子。
正確評估SSD的效能並非易事。硬體評測部落格上的很多文章都是在硬碟上隨機寫十分鐘,便聲稱硬碟可以進行測試,並且測試結果是可信的。然而SSD效能只會在足夠長時間的隨機寫工作負載下才會有效能降低,而所需的時間基於SSD的總大小會花費30分鐘到3小時不等。這即是更多認真的基準效能測試開始於相當長時間的隨機寫負載(稱為“預處理”)的原因[50]。下方的圖7來自StorageReview.com上的一篇文章[26],顯示出在多個SSD上預處理的效果。可以看見在30分鐘左右出現了明顯的效能下降,所有硬碟都出現讀寫速度下降和延遲上升。之後的四個小時中,硬碟效能緩慢降低到一個最小的常量值。
圖7:多個SSD上預處理的效果 — 感謝來自StorageReview.com[26]的圖片
5.2節解釋了圖7中實際上發生的事情,隨機寫入的量太大並以這種持續的方式進行使得垃圾回收程式不能維持在後臺。因為必須在寫命令到達時擦除塊,因此垃圾回收程式必須和來自主機的工作在前臺的操作競爭。使用預處理的人聲稱基準測試可以代表硬碟在最壞的情況下的表現。這種方法在所有工作負載下是否都是好模型還是值得商榷。
為了比較不同製造商的各種產品,找到可以比較的共同點是必要的,而最壞的情況是一個有效的共同點。然而選擇在最糟糕的工作負載下表現最好的硬碟並不能保證其在生產環境下所有的工作負載下都表現的最好。實際上大部分的生產環境下,SSD硬碟只會在唯一的一個系統下工作。因其內部特徵,這個系統有一個特定的工作負載。因此比較不同硬碟的更好更精確的方法是在這些硬碟上執行完全相同的工作負載,然後比較他們表現的效能。 這就是為何,即使使用持續的隨機寫工作負載的預處理可以公平的比較不同SSD,但還是有一點需要注意,如果可以的話,執行一個內部的基於目標工作負載的基準測試。
內部基準測試同樣可以通過避免使用“最好的”SSD來避免過度調配資源,譬如當一個比較便宜的SSD型號已經足夠並且能夠省下一大筆錢的時候。
基準測試很難
測試者是人,因此並不是所有的基準測試都是沒有錯的。在使用生產商或者第三方的基準測試的時候請小心,並且在相信這些資料之前參考多個訊息源,孤證不立。如果可以的話,使用你係統的特定工作負載來進行你自己的內部基準測試。
2.3工作負載和指標
效能基準都有相同的指標,並使用相同的度量。在本節中,對於如何解釋這些指標,我希望能夠給出一些見解。
通常使用的引數如下:
- 工作負載型別:可以是基於使用者控制資料的指定效能基準,或者只是順序或者隨機訪問的效能基準(例:僅隨機寫)
- 讀寫百分比(例:30%讀70%寫)
- 佇列長度:在硬碟上執行命令的併發執行執行緒的數量
- 訪問的資料塊大小(4 KB 8 KB等)
:基準測試的結果可能使用不同的度量指標。常用的如下:
- 吞吐量:資料傳輸的速度,通常單位是KB/s或MB/s,表示千位元組每秒和百萬位元組每秒。這個指標常用在順序讀寫基準測試中。
- IOPS:每秒讀寫操作的數量,每個操作都是相同大小的資料塊(通常是4KB/S)。這個指標通常用在隨機讀寫基準測試中。[17]
- 延遲:在傳送完命令後裝置的反應時間,通常是μs或ms,表示微秒或者毫秒。
雖然吞吐量這個指標很容易理解和接受,但IOPS卻比較難以領會。例如,如果一個硬碟在隨機寫上的表現是在4KB的資料塊上是1000 IOPS,這即表示吞吐量是1000 x 4096 = 4 MB/s.。因此,IOPS高只有在資料塊足夠大的時候才可以被解釋成吞吐量高,而IOPS高但平均資料塊小的話只能代表一個低吞吐量。
為了闡明這個觀點,不妨想象我們有一個登陸伺服器,每分鐘要對數千個不同的檔案執行微量的更新,表現出10k IOPS的效能。因為這些更新分佈在如此多的檔案裡,吞吐量能夠接近20 MB/s,然而在同一個伺服器中僅對同一個檔案進行順序寫入能夠將吞吐量提高到200 MB/s,這可是10倍的提升。例子中的數字是我編的,不過這些資料很接近我接觸到的生產環境。
另一個需要掌握的概念是,高吞吐量並不足以表示這是一個快的系統。實際上,如果延遲很高,不管吞吐量有多麼好,整個系統還是會慢。讓我們拿一個假象的單執行緒程式為例,這個程式需要連線25個資料庫,每個資料庫都有20ms的延遲。因為連線的延遲是累積的,獲取25個連線需要5 x 20 ms = 500 ms。因此,即便執行資料庫查詢的機器有很快的網路卡,就當5 GBits/s的頻寬吧,但這個指令碼仍然因為延遲而會很慢。
本節的重點在於,著眼於全部的指標是很重要的,這些指標會顯示出系統的不同特徵,並且可以在瓶頸出現時識別出來。當在看SSD的基準測試並確定所選擇的型號時,通常有一個很好的經驗就是,別忘了這些待選的SSD中,哪個指標對於系統是最關鍵的。
對於這個主題有一個很有意思的擴充套件閱讀:Jeremiah Peschka 寫的一篇文章“IOPS是騙局”[46]。
下一部分
第三部分在這。你同樣可以去內容目錄來看看這一系列的文章。如果你時間很緊,你同樣可以直接去總結了所有其他部分的內容的第六部分。
引用
[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]