給SSD(固態硬盤)編程

簡介點擊打開鏈接

我想爲我的鍵值對存儲項目弄一個固態硬盤(SSD)最佳存儲解決方案。爲此,我必須確保我完全瞭解SSD是如何工作的,這樣就可以優化我的hash表實例來適合SSD的內部特徵。網上有很多不完全和相悖的的信息,找到關於SSD的可靠信息並不簡單。爲了找到適當的文獻和基準以說服自己,我必須要進行大量的閱讀。如果我要爲SSD編程,我需要知道我在做什麼。

研究完之後我搞明白了,相信將我所得到的結論向大家分享會有用的。我的意圖是將所有的可用信息轉化爲實用知識。最後我寫了一篇30頁的文章,但它不太適合發佈在博客上。因此我決定將這篇文章分爲數個可被獨立消化的數個邏輯部分。而目錄在本文的下方。

第六部分有最爲顯著的貢獻,這一部分是整個“爲SSD編程”文章系列的總結,我相信那些心急的程序員最爲喜歡。這個總結涵蓋了SSD的基本知識以及所有推薦的實現固態硬盤的最佳讀寫性能的訪問模式。

另外一個重要的細節是,“爲SSD編程”與我的鍵值對存儲項目(IKVS series)之間是相互獨立的,因此並不需要IKVS文章中的知識。我正打算寫一篇關於IKVS series的文章,內容是關於 如何用hash表來實現利用SSD的內部特徵,不過我還沒有具體的發佈時間。

我唯一的遺憾就是,我還沒有寫任何代碼,以證明我建議的訪問模式確實是最好的。但是即使有這些代碼,我也需要在大量不同的固態硬盤上測試性能基準,這將消耗我所不能承受的大量的時間和金錢。我仔細列舉了我引用的文章,如果你認爲我的建議不對,請留下評論指明。當然,如果你有什麼疑問或想在任何方面做出貢獻,請隨意留下評論。

最後,不要忘了訂閱電子報,以便在每當有新文章發表在Code Capsule上時能夠收到通知。訂閱面板在博客的右上角。

目錄

第一部分:簡介和目錄

第二部分:SSD的架構和基準

1. SSD的結構
1.1 NAND閃存單元
1.2 SSD的組織
1.3 製造過程

2. 基準和性能指標
2.1 基本基準
2.2 預處理
2.3 任務負載和指標

第三部分:頁、塊、和閃存轉換層

3. 基本操作
3.1 讀、寫、擦除
3.2 寫入的例子
3.3 寫入放大
3.4 耗損均衡

4. 閃存轉換層(FTL)
4.1 FTL的必要性
4.2 邏輯塊映射
4.3 產業狀態的備註
4.4 垃圾回收

第四部分:高級功能和內部並行

5. 高級功能
5.1 TRIM
5.2 預留空間
5.3 完全抹除
5.4 本地命令隊列(NCQ)
5.5 掉電保護

6. SSD的內部並行
6.1 被限制的I/O總線帶寬
6.2 多層並行
6.3 塊的集羣

第五部分:訪問模式和系統優化

7. 訪問模式
7.1 定義順序和隨機I/O操作
7.2 寫入
7.3 讀出
7.4 合併讀寫

8.系統操作
8.1 分區對齊
8.2 文件系統參數
8.3 操作系統I/O調度
8.4 交換空間
8.5 臨時文件

第六部分:總結——每個程序員都應該瞭解的固態硬盤知識

下一部分

第二部分在這。如果你比較忙,你可以直接去總結了所有其他部分內容的第六部分



爲SSD編程(2):SSD的架構和基準


本第二部分包含了“爲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]
SLC/MLC用時 [1]
TLC用時 [23]
硬盤用時 [18, 19, 25]
內存用時 [30, 52]
L1 和L2 緩存用時 [52]

表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

注意

* 存儲設備不支持該指標
** 以2MB的塊測量,而非 4 KB

指標

MB/s: MB每秒
KIOPS:千操作每秒,每秒1000輸入/輸出操作

引用

Samsung 64 GB[21]
Intel X25-M[2, 28]
Samsung SSD 840 EVO[22]
Micron P420M[27]
Western Digital Black 4 TB[25]
Corsair Vengeance DDR3 RAM[30]

 

表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]





爲SSD編程(3):頁、塊和閃存轉換層



在這個部分,我會解釋寫操作在頁和塊級是如何處理的,以及寫入放大和損耗均衡計算的基本概念。此外,我描述了閃存轉換層(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]




爲SSD編程(4):高級功能和內部並行



在這個部分,我將簡要的介紹固態硬盤(SSD)的一些主要功能,如TRIM和預留空間。還會介紹SSD中不同等級的內部並行。

5. 高級功能

5.1 TRIM 

讓我們假設一個程序向SSD所有的邏輯塊地址都寫入文件,這個SSD當然會被裝滿。然後刪除這些文件。文件系統會報告所有的地方都是空的,儘管硬盤實際上還是滿的,因爲SSD主控沒法知道邏輯數據是什麼時候被主機刪掉的。SSD主控只會在這些邏輯塊地址被複寫的時候才知道這些是空閒空間。此時,垃圾回收進程將會擦除與這些文件相關的塊,爲進來的寫操作提供空的頁。其結果就是,擦除操作並非在知道保存有無用數據之後立刻執行,而是被延遲了,這將嚴重影響性能。

另一個值得關心的是,既然SDD主控不知道這些頁保存有已刪除的文件,垃圾回收機制仍然會爲了損耗均衡而移動這些頁上的數據。這增加了寫入放大,並毫無意義地影響了來自主機的前臺工作負載。

延遲擦除問題的一個解決方法是TRIM命令,這個命令由操作系統發送,通知SSD控制器邏輯空間中的這些頁不會再使用了。有了這個信息,垃圾回收進程就會知道自己不必再移動這些頁,並可以在任何需要的時間擦除它們。TRIM命令只會在當SSD、操作系統和文件系統都支持的時候才起作用。

TRIM命令的維基百科頁面列出了支持TRIM的操作系統和文件系統[16]Linux下,ATA TRIM的支持是在2.6.33版本加入的。儘管ext2和ext3 文件系統不支持TRIM,ext4 和XFS以及其他的一些是支持的。在Mac OS 10.6.8下,HFS+支持TRIM操作。Windows 7則只支持使用SATA接口的SSD的TRIM,使用PCI-Express的則不支持。

現在大部分的硬盤都支持TRIM,確實,允許垃圾回收儘早的工作顯著地提升了將來的性能。因此強烈建議使用支持TRIM的SSD,並確保操作系統和文件系統級都啓用了TRIM功能。

 

5.2 預留空間

預留空間只是簡單的使物理塊比邏輯塊多,即爲主控保留一定比例的,用戶不可見的物理塊。大多專業級SSD生產商已經包括了一些預留空間,通常是7~25%[13]。用戶可以簡單的通過創建比最大物理容量小的邏輯容量分區來創建更多的預留空間。例如,你可以在100G的硬盤上創建一個90G的分區,而把剩下的10G作爲預留空間。即使預留空間在操作系統級是不可見的,但SSD主控仍然是可以看見的。生產商提供預留空間的主要原因是爲了對付NAND閃存單元固有的獸獸門限制。不可見的預留空間的塊將無縫的替換可見空間上的已耗損殆盡的塊。

AnandTech有一篇有意思的文章顯示出預留空間對SSD壽命和性能的影響[34]。在他們研究的硬盤上,結果顯示出僅通過保證25%的預留空間(把所有的預留空間加在一起)就可以使性能極大地提升。在Percona的一篇文章中有另外一個有意思的結果,在他們測試了一塊Intel 320 SSD,顯示出當硬盤逐漸填滿時,寫入吞吐量將隨之下降[38]

這裏是我的實驗中發生的事情。垃圾回收是使用空閒時間在後臺擦除頁上不再使用的數據的。但既然擦除操作比寫入操作的延遲更久,或者說擦除要的時間比寫入長,在持續的重隨機寫入工作負載下的SSD將會在垃圾回收有機會擦除之前用盡所有的空塊。此時,FTL將不能跟上前臺的隨機寫入工作負載,而垃圾回收進程將必須在寫入命令進來的同時擦除塊。這就是在基準測試中SSD性能下降的厲害,而SSD顯得性能超差的時候,如下圖7所示。因此,預留空間可以吸收高吞吐量寫入負載,起到緩衝的作用,爲垃圾回收跟上寫入操作並重新開始擦除無用塊留夠時間。預留空間需要多少大部分基於SSD使用環境的工作負載,和其需要的承受的寫入操作的量。作爲參考,持續隨機寫入的工作負載比較推薦使用大約25%的預留空間[34]。如果工作負載不是很重,大概10~15%估計夠大的了。

預留空間對損耗均衡和性能表現是有用的

SSD可以簡單地通過格式化時設置比最大物理容量小的邏輯容量來啓動預留空間。餘下的不被用戶所見的空間仍會被SSD主控所用。預留空間幫助損耗均衡機制來對付NAND閃存單元的壽命限制。對於寫入不是很重的工作負載,10~15%的預留空間足夠了。對於持續的隨機寫入工作負載,保持25%的預留空間將會提升性能。預留空間將會扮演NAND閃存塊的緩衝區的角色,幫助垃圾回收進程吸收寫入峯值。

從此,同樣可以推導出,預留空間甚至可能爲不支持TRIM命令的環境提供更大的性能提升——注意我只是在這進行個假設,我仍然在尋找材料來支持這個觀點。假設只有75%的硬盤空間可被操作系統使用,餘下的25%留作預留空間。因爲SSD控制器可以看見整個硬盤,儘管在某一時刻只有75%的物理NAND閃存被使用,但100%的塊都在已使用、已廢棄、已擦除三種狀態中交替轉換。這表示餘下的25%物理閃存將可以安全的認爲沒有保存有數據,因爲其並沒有被映射到任何邏輯塊地址上。因此,即使不支持TRIM,垃圾回收進程也能夠提前擦除這些預留空間中塊。

5.3 安全擦除

一些SSD主控提供ATA安全擦除功能,其作用是當硬盤處於意料之外的狀態時恢復其性能。這個命令擦除所有用戶寫入的數據並重置FTL映射表,但這顯然不能克服P/E循環有限造成的物理限制。儘管其功能上看上去非常有前途,但需要每個生產商爭取的實現它。Wei等人2011年在他們關於安全擦除命令的review中顯示,在他們研究的超過12個型號SSD中,只有8個提供了ATA安全擦除功能,而在這8個硬盤中,三個都有各種bug[11]

對於性能的影響是很重要的,並且在安全方面更加重要,但我不想展開說。這裏有幾個Stack Overflow上的討論可以解釋關於如何可靠地刪除SSD中的數據的細節。

5.4 原生命令隊列(NCQ)

原生命令隊列(NCQ)是SATA的一個功能,其允許SSD接受來自主機的多個命令,使SSD可以使用內部並行同時完成這些命令[3]。除了減少因爲硬盤造成的延遲外,一些新的硬盤同樣使用NCQ來應對來自主機的延遲。例如NCQ可以優先傳入的命令來確保當主機CPU忙的時候硬盤總是有命令處理。

5.5 斷電保護

無論是在家還是在數據中心,斷電都是有可能發生的。一些生產商在他們的SSD結構中設置有超級電容,這個電容設計爲存有足夠提交總線中所有I/O請求所需的能量以防掉電。問題在於並非所有的SSD生產商都爲他們的硬盤設置超級電容或者某種掉電保護,而有超級電容的不總是在說明書中提及。然後,和安全擦除命令一樣,斷電保護機制的實現是否正確,並且是否確實能夠在掉電時避免數據損壞是搞不清楚的。

Zheng等人2013年的研究中測試了15個SSD,但沒有透露品牌[72]。他們給硬盤各種各樣的電源故障,發現測試的15個SSD中有13個最終丟失數據或者大規模的數據損壞。在另外一篇Luke Kenneth Casson Leighton寫的關於電源故障的文章中顯示出,測試的4個硬盤有3個最終都在不正確的狀態,剩下的一個沒有問題(是Intel的硬盤)[73] 。

SSD還是一個非常年輕的技術,並且我相信這些電源故障下造成數據損壞的阻力將會在接下來的產品中克服。然而現在,在數據中心配置不間斷電源(UPS)可能還是應該做的。並且和任何其他存儲解決方案一樣,經常備份敏感數據。

6.SSD中的內部並行

6.1 總線帶寬限制

因爲物理限制的存在,異步NAND閃存I/O總線無法提供32-40 MB/s以上的帶寬[5]。SSD生產商提升性能的唯一辦法是以某種方法讓他們的硬盤中的多個存儲芯片可以並行或者交錯。[2]的2.2節中有一個比較好的關於交錯的解釋。

通過組合SSD內所有層次的內部並行,不同芯片中的多個塊可以作爲一個叫clustered block(直譯是集羣塊,但我感覺用比較親切,本譯文中所有的簇都是指它)東西同時訪問。我不打算解釋關於SSD內部並行的所有細節,因此我只簡述一下並行的層次和簇。獲取更多關於這個話題的信息,以及SSD內部並行的概括,這裏的兩篇論文是很好的開始[2, 3]。此外,一些高級命令如copybackinter-plane transfer[5]中有闡述。

內部並行

在SSD內部,數個層次的並行允許一次將數個塊寫入到不同的NAND閃存芯片中,這些塊稱爲簇。

6.2 並行的多級別

下邊的圖6展示了NAND閃存芯片的內部,其組織爲一種分級的結構。這些級別包括通道、封裝、芯片、面、塊和頁。如[3]中揭示的,這些不同的層通過下邊的方法提供並行

  • 通道級並行 閃存主控和閃存封裝之間的通信通過數個通道。這些通道可以獨立或者同時訪問。每個獨立通道有數個封裝共享。
  • 封裝級並行 一個通道中的不同封裝可以獨立訪問。交錯可以使命令同時在同一個通道中的不同封裝中運行。
  • 芯片級並行 一個封裝包含兩個或者更多的芯片,芯片可以並行獨立訪問。注:芯片通常也被稱爲核心(chips are also called “dies”)
  • 面級並行 一個芯片包含兩個或者更多的面。相同的操作(讀、寫或者擦除)可以在芯片中多個面上同時運行。麪包含了塊,塊包含了頁。面也包含了寄存器(小RAM緩存),其用在面級操作上。

圖6: NAND 閃存封裝

6.3 簇

譯註: 本節標題原文是“clustered blocks”,詞典上沒有這個詞(詞組?),Google了也沒有發現合適的翻譯,其直譯是“集羣的塊”或者“成簇的塊”。因爲這個“clustered blocks”和“簇”的英文“Data cluster”比較像,特性上也相似(都是若干存儲單位的集合),決定將這個“clustered blocks”在本文中譯爲“簇”。但這個簇與機械硬盤的簇不是相同的東西,請讀者注意分辨。如果有更爲合適或者正規的翻譯請告訴我。

從多個芯片中訪問到的多個塊被稱爲一個[2]。這個做法比較像RAID系統中的striping[1, 5]

一次訪問的邏輯塊地址被分到不同SSD閃存封裝中的不同芯片上。這歸功於FTL的映射算法,並且這與這些地址是否連續無關。分割塊允許同時使用多個通道來整合其帶寬,並同樣可以並行執行多個讀、寫和擦除操作。這即表示I/O操作按簇大小對齊來確保SSD中多個級別的內部並行所提供的性能能夠最大程度的利用。

 


爲SSD編程(5):訪問模式和系統優化



在之前的章節中我敘述了固態硬盤大部分的內部工作,我可以提供數據來幫助理解應該使用哪種訪問模式一起爲何這種模式確實比其它的好。在這個部分,我解釋了寫入和讀取是如何完成的,以及併發的寫入和讀取會相互干擾。我同樣介紹了文件系統級可以提升性能的一點優化方法。

7. 訪問模式

7.1 定義順序和隨機I/O操作

在接下來的部分,我打算從“順序”或“隨機”入手。如果I/O操作開始的邏輯塊地址(LBA)直接跟着前一個I/O操作的最後LBA,則稱值爲順序訪問。如果不是這樣,那這個I/O操作稱爲隨機訪問。這很一點重要,因爲FTL執行動態映射,相鄰的邏輯空間地址可能被應用於不相鄰的物理空間地址上。

7.2 寫入

基準測試和生產商提供的數據表顯示出,隨機寫入比序列寫入要慢,但這並不總是對的,因爲隨機寫入的速度實際上取決於工作負載的類型。如果寫入比較小,小是說小於簇(譯註:關於簇的翻譯請見上一篇文章)大小(就是說 <32MB),那麼是的,隨機寫入比順序寫入慢。然而,如果隨機寫入是按照簇大小對齊的,其性能將會和順序寫入一樣。

解釋如下。如第六節所說,SSD的內部並行機制通過並行和交錯,允許簇中的塊同時訪問。因此,無論是隨機或者序列寫入,都會同樣將數據寫入到多個通道和芯片上,從而執行簇大小的寫入可以確保全部的內部並行都用上了。簇上的寫入操作將在後邊的7.3節解釋。至於性能,如來自 [2]和 [8] 的圖8和圖9所示。當基準測試寫入緩存和簇大小(大部分SSD是16或32MB)相同或者更大時,隨機寫入達到和順序寫入同樣高的吞吐量。

圖8:4塊SSD順序寫入負載和隨機寫入負載效率對照——根據Kim et al., 2012 [2] 重製

圖9:3塊SSD順序寫入負載和隨機寫入負載效率對照——根據Min et al., 2012 [8]重製

然而,如果是小寫入——小是指比NAND閃存頁小,就是說<  16 KB——主控需要做更多的工作以維護用來做塊映射的元數據上。確實,一些SSD使用樹形的數據結構來實現邏輯塊地址和物理塊地址之間的映射[1],而大量小隨機寫入將轉換成RAM中映射的大量更新。因爲這個映射表需要在閃存中維護[1, 5],這將導致閃存上的大量寫入。而順序工作負載只會導致少量元數據的更新,因此閃存的寫入較少。

隨機寫入並不總是比順序寫入慢

如果寫入很小(就是說比簇大小要小),隨機寫入將比順序寫入慢。如果寫入是按簇大小對齊,隨機寫入將使用所有可用層級上的內部並行,並顯示出和隨機寫入相同的性能。

另外一個原因是,如果隨機寫入很小,其將在塊中引起大量的複製-擦除-寫入操作。另一方面,大於等於塊大小的順序寫入可以使用更快的交換合併優化操作。再者,小隨機寫入顯然會有隨機的無效數據。大量的塊將只有一頁是無效的,而非只有幾個塊全部無效,這樣會導致作廢的頁將遍佈物理空間而非集中在一起。這種現象被稱爲內部碎片,並導致清除效率下降,垃圾回收進程通過請求大量的擦除操作才能創建空頁。

最後關於併發性,已有的研究已經顯示出,單線程寫入大數據和用很多並非線程寫入大量小數據是一樣快的。確實,大寫入可以確保SSD所有的內部並行都用上了。因此試着實現併發的多個寫入並不會提高吞吐量[1, 5]。然而,多並行寫入和單線程訪問相比將會有延遲[3, 26, 27]

一個單一的大寫入比很多小的併發寫入要好

單一的大寫入請求和很多小併發寫入請求相比,表現出相同的吞吐量,但會導致延遲。單一的大寫入比並發寫入在響應時間上表現的更好。因此,只要可能,最好使用大寫入,

當寫入小並且沒有經過組織或緩存,多線程比較好

很多併發的小寫入請求將比單一的小寫入請求提供更好的吞吐量。因此如果I/O比較小並不能整合到一起,最好是使用多線程。

7.3 Reads 讀取

讀取比寫入要快。無論是順序讀取還是隨機讀取,都是這樣。FTL是邏輯塊到物理塊地址的動態映射,並且將寫入分佈到各個通道上。這個方法有時候被稱爲“基於寫入順序的”映射[3]。如果數據是以和原本寫入的順序完全不相關,完全隨機讀取的,那就無法保證連續的讀取分佈在不同的通道。甚至有可能連續的隨機讀取訪問的是同一個通道中的不同塊,因此無法從內部並行中獲取任何優勢。Acunu寫了一篇博文講了這個情況,至少在他們測試的硬盤上是這樣,讀取性能和讀取訪問模式與數據原始寫入方式有多相似直接掛鉤[47]

爲了提升讀取性能,將相關數據寫在一起

讀取性能由寫入模式決定。當大塊數據一次性寫入時,其將被分散到不同的NAND閃存芯片上。因此你應該將相關的數據寫在相同的頁、塊、或者簇上,這樣稍後你可以利用內部並行的優勢,用一個I/O訪問較快的讀取。

下面的圖10表示出一個有兩個通道4塊芯片,每塊芯片只有一個面的SSD。注意這技術上是不成立的,因爲SSD每塊芯片都有兩個以上的面,但爲了保持圖片簡潔,我決定只讓每塊芯片只有一面。大寫字母代表大小和NAND閃存塊相同的數據。圖10上邊的操作是順序寫入4個塊:[A B C D],在這個例子裏剛好是一個簇的大小。寫操作通過並行和交錯被分配到四個面上使其更快。即便4個塊在邏輯塊地址上是連續的,但他們存儲在四個不同的面中。

基於寫入順序的FTL,面上所有的塊被選作寫入操作的可能是近乎於相同的,因此簇不必由各自面上相同物理塊地址(PBN)的塊組成。在圖10的例子中,第一個簇由四個不同面上的塊組成,各自面上的PBN分別是1, 23, 11, 和51。

圖10下邊有兩個讀取操作,[A B E F] 和 [A B G H]。對於[A B E F]來說,A和E在同一個面上,這使其必須只從一個通道的兩個面上讀取。對於[A B G H]來說,A、B、G、和H存儲在四個不同的面上,因此[A B G H]能夠同時從兩個通道的四個面上讀取。從更多的面和通道上讀取可以從內部並行上獲得更多的優勢,從而有更好的讀取性能。

圖10: 利用SSD的內部並行

內部並行的一個直接結果是,使用多線程同時讀取數據不是提升性能所必須的。實際上,如果這些並不知道內部映射的線程訪問這些地址,將無法利用內部並行的優勢,其可能導致訪問相同的通道。同時,併發讀取線程可能影響SSD預讀能力(預讀緩存)[3]

一個單一的大讀取比很多小的併發讀取要好

併發隨機讀取不能完全使用預讀機制。並且,多個邏輯塊地址可能被映射到相同的芯片上,不能利用內部並行的優勢。再者,一個大的讀取操作會訪問連續的地址,因此能夠使用預讀緩存(如果有的話)。因此,進行大讀取請求更加可取。

SSD生產商通常不說頁、塊和簇的大小。但可以通過運行簡單的工作負載來進行反向工程獲取大部分SSD的基礎特徵[2, 3]。這些信息可以用在優化讀寫操作的緩存大小上,同時可以在格式化硬盤的時候使得分區與SSD內部特徵對齊,如8.4節中所說。

7.4 併發讀寫

小的讀和寫交錯會導致性能下降[1, 3]。其主要原因是對於同一個內部資源來說讀寫是相互競爭的,而這種混合阻止了諸如預讀取機制的完全利用。

分離讀寫請求

混合了小讀取和小寫入的工作負載將會阻止內部緩存和預讀取機制的正常工作,並導致吞吐量下降。最好是能夠避免同時的讀寫,並以一個一個的較大的數據塊來進行,最好是簇的大小。例如,如果必須更新1000個文件,你可以遍歷這些文件,對每個文件進行讀和寫然後移動到下一個文件,但這將會很慢。如果一次讀取全部1000個文件然後一次寫入1000個文件會更好。

8. 系統優化

8.1 分區對齊

如3.1節中解釋的那樣,寫入是頁對齊的。大小是頁大小,並且和頁大小是對齊的寫入請求,會被直接寫入到一個NAND閃存物理頁中。大小是頁大小,但不對齊的寫入請求將會被寫入到兩個個NAND閃存物理頁中,並導致兩個讀-改-寫操作[53]。因此,確保用來寫入的SSD分區是和硬盤採用的物理NAND閃存頁的大小對齊是很重要的。很多教程和指引都講了格式化的時候如何將分區對齊SSD的參數[54, 55]。稍微Google一下就能知道某型號的SSD的NAND閃存頁、閃存塊和簇的大小。就算是沒法拿到這些信息,通過一些反向工程也可以揭示出這些參數[2, 3]

有人指出分區對齊可以顯著地提高性能[43]。還有人指出,在對某塊硬盤的測試中,繞過文件系統對硬盤直接進行寫入會提高性能,不過提高很小[44]

分區對齊

爲了確保邏輯寫入真的是和物理存儲是對齊的,必須將分區和硬盤的NAND閃存頁大小對齊。

8.2 文件系統參數

如5.1節所說,並不是所有的文件系統都支持TRIM命令[16]。Linux 2.6.33及以上,ext4和XFS支持TRIM,但仍需要使用discard參數來啓用。此外,還有一些其它的微調,如果沒有什麼東西需要的話,可以通過移除relatime參數並添加noatimenodiratime [40, 55, 56, 57] 將元數據的更新關掉。

啓用TRIM命令

確認你的核心和文件系統支持TRIM命令。當某個塊被刪除的時候,TRIM命令會通知SSD主控。垃圾回收進程可以在閒的時候後臺擦除這些塊,爲面對大寫入工作負載準備硬盤。

8.3 操作系統I/O調度器

Linux上的默認I/O調度器是CFQ調度器(Completely Fair Queuing 完全公平隊列)。CFQ被設計用來通過將物理上接近的I/O請求組合到一起從而最小化機械硬盤尋道時間的。這種請求重新排序對於SSD是 不必要的,因爲它們沒有機械部分。幾個指引和討論文章主張將I/O調度器從CFQ換爲NOOP或Deadline將會減少SSD的延遲[56, 58]。然而子Linux 3.1版之後,CFQ爲固態硬盤提供了一些優化[59]。基準測試同樣顯示出調度器的性能取決於應用在SSD上的工作負載(即應用),和硬盤自身[40, 60, 61, 62]

我個人從中學到的是,除非工作負載十分特殊並且特定應用的基準測試顯示出某個調度器確實比另一個好,CFQ是一個比較安全的選擇。

8.4 交換分區

因爲相當數量的I/O請求是由向硬盤上進行頁交換導致的,SSD上的交換分區會增加損耗並顯著降低壽命。在Linux內核,vm.swappiness參數控制想硬盤交換頁的頻率。其可用值是0到100,0表示內核需要儘可能的避免交換。以Ubuntu來說,默認swappiness是60。當使用SSD的時候,儘可能降低這個值(就是說設爲0)會避免不必要的向硬盤的寫入並增加其壽命[56, 63]。一些教程建議設置爲1,而在實踐中實際上和0一樣的[57, 58]

另外的做法的使用內存作爲交換分區,或者完全避免使用交換分區。

8.5 臨時文件

所有臨時文件和日誌文件沒有必要,否則只是浪費SSD的生命週期。一些可以保存在RAM中的文件可以使用tmpfs文件系統[56, 57, 58]



爲SSD編程(6):總結—每個程序員都應該瞭解的固態硬盤知識


在這部分,我以獨立的簡單段落的形式總結了其它部分的內容。每個段落概括了其他部分一節或幾節的內容,這樣可以讓讀者在每個主題下能夠得到更多細節。

基礎

1. 存儲單元類型

固態硬盤(SSD)是基於閃存的數據存儲設備。每個比特都存儲在存儲單元中,而存儲單元分爲三類:每個單元1比特(單層單元,SLC),每個單元2比特(多層單元,MLC),每個單元3比特(三層單元,TLC)。

>> 詳見第1.1節

2. 壽命限制

每個單元都有P/E(寫/擦)循環的最大限制,在此之後存儲單元被認爲是損壞的。這表示NAND閃存已經損耗殆盡,並有一個壽命限制。

>> 詳見第1.1節

3. 基準測試很難

測試者是人,因此並不是所有的基準測試都毫無破綻。在讀生產商或者第三方的基準測試結果的時候請小心,並在相信這些數據之前使用多個來源的數據。在有可能的時候,使用你的系統特定的工作負載在你打算使用的SSD型號上,運行自己的內部基準測試。最後,着眼於與你的系統最相關的性能指標。

>> 詳見第2.2節和第2.3節

 

頁和塊

4. NAND閃存頁和塊

閃存單元組織成爲陣列,稱爲塊,而塊組織成爲面。塊中能夠進行讀寫操作的最小單元是頁。頁不能獨立擦除,只能整塊擦除。NAND閃存頁大的大小並不一致,大多數硬盤的頁大小是2KB、4KB、8 KB 或16 KB。大多數SSD每個塊有128或256個頁。這即表示一個塊的大小可能在256 KB 到4 MB之間。例如Samsung SSD 840 EVO的塊大小是2048 KB,每塊包括256頁每頁8KB。

>> 詳見第3.2節

5. 讀是頁對齊的

一次讀取少於一頁是不可能的。當然可以通過操作系統只請求一個字節,但SSD中會取回整個頁,強制讀取比所需多的多的數據。

>> 詳見第3.2節

6. 寫是頁對齊的

寫入到SSD的時候,寫入將補齊到頁大小。所以即便寫入操作隻影響一字節,都會重寫整個頁。寫入比所需更多的數據被稱爲寫入放大。寫入一個頁也被稱爲“(編置to program)”一個頁。

>> 詳見第3.2節

7.頁不能覆寫

NAND閃存頁只能在其爲“空”的狀態下進行寫入。當數據改變,頁的內容被複制到內部寄存器中,數據更新,然後新版本的數據將存儲字啊一個”空“頁中,這個操作被稱爲”讀-改-寫“。數據並非原地更新,因爲”空”頁並非原先存儲數據的頁。一旦數據被保存到硬盤上,原來的頁將被標記爲“廢棄”,並一直保持這樣直到被擦除。

>> 詳見第3.2節

8.擦除是塊對齊的

頁不能被覆寫,一旦頁成爲“廢棄的”,讓其重新空下來的方法是擦除它們。然而,獨立擦除一個頁是不可能的,並且只能一次擦除整個塊。

>> 詳見第3.2節

 

主控和內部

9.閃存轉換層

閃存轉換層(FTL)是SSD主控中的一個組件,它將來自主機的邏輯塊地址(LBA)映射爲硬盤上的物理塊地址(PBA)。很多最新的硬盤使用了類似於“混合日誌塊”或其派生者的技術,其以類似於日誌結構文件系統的方式工作。這允許將隨機寫入當做順序寫入處理。

>> 詳見第4.2節

10.內部並行

在內部,數個層次的並行使得可以一次向不同NAND閃存芯片上寫數個塊的數據,這幾個塊被稱爲“簇”。

>> 詳見第6節

11.損耗均衡

因爲NAND閃存單元會損耗殆盡,FTL的一個主要目標是額能的將工作分散到各個單元上,這樣塊中的閃存單元可以在同一時間損壞。

>> 詳見第3.4節

12.垃圾回收

SSD主控中的垃圾回收確保廢棄的塊能夠擦除並重新變爲空狀態,使新進入的寫入命令可以訪問。

>> 詳見第4.4節

(譯註:你沒看錯,少了13,原文就是這樣)

14.後臺操作可能影響前臺操作

例如垃圾回收的後臺操作可能對來自主機的前臺操作有負面影響,尤其是在持續的小隨機寫入工作負載下。

>> 詳見第4.4節

訪問模式

15.絕不寫入少於一頁的數據

避免寫入少於NAND閃存頁大小的數據以最小化寫入放大並避免讀-改-寫操作。目前一頁最大爲16KB,因此此值應該作爲默認值使用。這個值取決於SSD型號,並且在將來SSD改進之後你可能需要增加。

>> 詳見第3.2和3.3節

16.對齊寫入

將寫入對齊爲頁大小,寫入數據塊大小爲頁大小的倍數。

>> 詳見第3.2和3.3節

17.小寫入緩存化

爲了最大化吞吐量,在任何可能的時候將小寫入緩存到內存中,當緩存滿了再進行一次大寫入,這樣來將小寫入打包。

>> 詳見第3.2和3.3節

18.爲了提升讀性能,將相關的數據寫在一起。

讀取性能取決於寫入模式。當大數據塊一次寫入的時候,其將被分配到不同的NAND閃存芯片上。因此你需要將相關的數據寫到相同的頁、塊、或簇上,這樣在你之後讀取的時候可以利用內部並行,用一個I/O請求更快的讀取。

>> 詳見7.3節

19.分離讀寫請求

混合的小讀寫交叉的工作負載會妨礙內部緩存和預讀取機制正常工作,並會導致吞吐量下降。最好的辦法是避免同時發生的讀操作和寫操作,並將其以一個接一個的大數據塊的形式實現,數據塊大小推薦和簇大小相同。舉個例子,如果要更新1000個文件,你可以遍歷文件逐一讀寫,但會很慢。如果一次讀取1000個文件然後一次寫回1000個文件將會好很多。

>> 詳見7.4節

20.批量廢棄數據

當有數據不再需要或者需要刪除的時候,最好等到廢棄數據量比較大的時候在一個操作中統一廢棄它們。這可以使垃圾回收進程可以一次處理更大範圍的數據,可以最小化內部碎片。

>> 詳見第4.4節

21.隨機寫入並不遠總是比順序寫入慢

如果寫入很小(即小於簇大小)。隨機寫入將比順序寫入慢。如果寫入都是數倍於且對齊簇大小的話,隨機寫入將會利用所有可用層次的內部並行,並達到和順序寫入相同的水平。對於大部分硬盤來說,簇大小是16或32MB,因此使用32MB應該是安全的。

>> 詳見第7.2節

22.一個大的單線程的讀取比很多小的併發讀取要好

併發隨機讀取不能完全使用預讀取機制。並且,多個邏輯塊地址會指向同一個芯片而不能利用內部並行。一個大的書籤操作將會訪問連續地址並在預讀取緩存可用的時候利用之,並使用內部並行。因此如果用例允許的話,發出一個大的讀取請求會好一些。

>> 詳見第7.3節

23.一個大的單線程寫入比很多小的併發寫入要好

大的單線程寫入請求提供的吞吐量和很多併發寫入是相同的,然而就延遲來說,一個大的單一寫入比並發寫入反應時間要短一些。因此,在可用的時候,使用單線程大寫入是最好的。

>> 詳見7.2節

24.當寫入小且無法緩存或組織在一起的時候,多線程是有用的。

很多併發寫入請求將比單一小寫入請求提供的吞吐量要大。因此,如果I/O很小並且不能組織,用多線程比較好。

>> 詳見第7.2節

25.分離冷熱數據

熱數據是經常改變的數據,而冷數據是不經常改變的數據。如果一些熱數據和冷數據被保存在同一個頁中,冷數據將會隨着熱數據的每次讀-改-寫操作一起復制,並且會因爲垃圾回收的損耗均衡不停移動位置。儘可能的將冷熱數據分離到不同的也中將減輕垃圾回收的工作。

>> 詳見4.4節

26.緩存熱數據

極其熱的速進和其他高頻變化的元數據應該儘可能的緩存並儘可能少的寫入硬盤。

>> 詳見4.4節

 

系統優化

27. PCI Express 和SAS比SATA快

生產商提供的兩個主要的接口是SATA 3.0 (550 MB/s) 和 PCI Express 3.0 (1 GB/s 每通道,使用多個通道)。串行SCSI(SAS)同樣在企業級的SSD上可用。在最新版本中,PCI Express和SAS比SATA要快,但也更貴。

>> 詳見2.1節

28.預留空間對提高性能和損耗均衡十分有用

硬盤可以簡單地通過在格式化的時候讓邏輯分區容量比最大物理容量小來設置預留空間。預留的空間對用戶不可見,但SSD主控仍然可見。預留空間幫助損耗均衡機制應付NAND閃存單元固有的壽命限制。對於寫入負載不是很重的工作環境,10%~15%的預留空間足夠了。對於持續隨機寫入的工作負載,保持25%的工作負載將會提升性能。預留空間將會扮演NAND閃存塊的緩存的角色,幫助垃圾回收進程吸收寫入峯值。

>> 詳見5.2節

29.啓用TRIM命令

確認你的系統內核和文件系統支持TRIM命令。TRIM命令在塊被刪除的時候通知SSD主控。當垃圾回收進程能夠在空閒時候後臺擦除這些塊,爲將來的寫入負載準備硬盤。

>> 詳見第5.1節

30.對齊分區

爲了確保邏輯寫入確實和物理存儲設備對齊,你需要將分區和硬盤的NAND閃存頁對齊。

>> 詳見第8.1節

 

總結

這是爲“SSD編程”系列文章的總結。我希望我用易於理解的方法表述了我在固態硬盤上的個人研究中學到的東西。

如果你讀了這個系列並想深入瞭解SSD,比較好的起步點是讀一些我在第二部分和第五部分列出的引用文獻和文章。

另外一個很好的學習資源是FAST大會(the USENIX Conference on File and Storage Technologies,USENIX文件和存儲技術大會)。會上每年都有大量出色的研究。我高度推薦他們的網站,FAST 2013視頻和文獻的集散地。(譯註:截至本文翻譯完畢, FAST 2014的網站已經可用了。)





References

[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]




文章來源:http://blog.jobbole.com/?s=%E4%B8%BASSD%E7%BC%96%E7%A8%8B  





第二部分:(英文原文)


來源:http://codecapsule.com/2014/02/12/coding-for-ssds-part-2-architecture-of-an-ssd-and-benchmarking/



This is Part 2 over 6 of “Coding for SSDs”, covering Sections 1 and 2. For other parts and sections, you can refer to the Table to Contents. This is a series of articles that I wrote to share what I learned while documenting myself on SSDs, and on how to make code perform well on SSDs. If you’re in a rush, you can alsoGo directly to Part 6, which is summarizing the content from all the other parts.

In this part, I am explaining the basics of NAND-flash memory, cell types, and basic SSD internal architecture. I am also covering SSD benchmarking and how to interpret those benchmarks.

 

ssd-presentation-02

 

To receive a notification email every time a new article is posted on Code Capsule, you can subscribe to the newsletter by filling up the form at the top right corner of the blog.
As usual, comments are open at the bottom of this post, and I am always happy to welcome questions, corrections and contributions!

1. Structure of an SSD

1.1 NAND-flash memory cells

A solid-state drives (SSD) is a flash-memory based data storage device. Bits are stored into cells, which are made of floating-gate transistors. SSDs are made entirely of electronic components, there are no moving or mechanical parts like in hard drives.

Voltages are applied to the floating-gate transistors, which is how bits are being read, written, and erased. Two solutions exist for wiring transistors: the NOR flash memory, and the NAND flash memory. I will not go into more details regarding the difference between NOR and NAND flash memory. This article only covers NAND flash memory, which is the solution chosen by the majority of the manufacturers. For more information on the difference between NOR and NAND, you can refer to this article by Lee Hutchinson [31].

An important property of NAND-flash modules is that their cells are wearing off, and therefore have a limited lifespan. Indeed, the transistors forming the cells store bits by holding electrons. At each P/E cycle (i.e. Program/Erase, “Program” here means write), electrons might get trapped in the transistor by mistake, and after some time, too many electrons will have been trapped and the cells would become unusable.

Limited lifespan

Each cell has a maximum number of P/E cycles (Program/Erase), after which the cell is considered defective. NAND-flash memory wears off and has a limited lifespan. The different types of NAND-flash memory have different lifespans [31].

Recent research has shown that by applying very high temperatures to NAND chips, trapped electrons can be cleared out [14, 51]. The lifespan of SSDs could be tremendously increased, though this is still research and there is no certainty that this will one day reach the consumer market.

The types of cells currently present in the industry are:

  • Single level cell (SLC), in which transistors can store only 1 bit but have a long lifespan
  • Multiple level cell (MLC), in which transistors can store 2 bits, at the cost of a higher latency and reduced lifespan compared to SLC
  • Triple-level cell (TLC), in which transistors can store 3 bits, but at an even higher latency and reduced lifespan

Memory cell types

A solid-state drives (SSD) is a flash-memory based data storage device. Bits are stored into cells, which exist in three types: 1 bit per cell (single level cell, SLC), 2 bits per cell (multiple level cell, MLC), and 3 bits per cell (triple-level cell, TLC).

Table 1 below shows detailed information for each NAND-flash cell type. For the sake of comparison, I have also added the average latencies of hard drives, main memory (RAM), and L1/L2 caches.

 

 

  SLC MLC TLC HDD RAM L1 cache L2 cache
P/E cycles 100k 10k 5k * * * *
Bits per cell 1 2 3 * * * *
Seek latency (μs) * * * 9000 * * *
Read latency (μs) 25 50 100 2000-7000 0.04-0.1 0.001 0.004
Write latency (μs) 250 900 1500 2000-7000 0.04-0.1 0.001 0.004
Erase latency (μs) 1500 3000 5000 * * * *
Notes * metric is not applicable for that type of memory
Sources P/E cycles [20]
SLC/MLC latencies [1]
TLC latencies [23]
Hard disk drive latencies [18, 19, 25]
RAM latencies [30, 52]
L1 and L2 cache latencies [52]

 

Table 1: Characteristics and latencies of NAND-flash memory types compared to other memory components

 

 

Having more bits for the same amount of transistors reduces the manufacturing costs. SLC-based SSDs are known to be more reliable and have a longer life expectancy than MLC-based SSDs, but at a higher manufacturing cost. Therefore, most general public SSDs are MLC- or TLC-based, and only professional SSDs are SLC-based. Choosing the right memory type depends on the workload the drive will be used for, and how often the data is likely to be updated. For high-update workloads, SLC is the best choice, whereas for high-read and low-write workloads (ex: video storage and streaming), then TLC will be perfectly fine. Moreover, benchmarks of TLC drives under a workload of realistic usage show that the lifespan of TLC-based SSDs is not a concern in practice [36].

NAND-flash pages and blocks

Cells are grouped into a grid, called a block, and blocks are grouped into planes. The smallest unit through which a block can be read or written is a page. Pages cannot be erased individually, only whole blocks can be erased. The size of a NAND-flash page size can vary, and most drive have pages of size 2 KB, 4 KB, 8 KB or 16 KB. Most SSDs have blocks of 128 or 256 pages, which means that the size of a block can vary between 256 KB and 4 MB. For example, the Samsung SSD 840 EVO has blocks of size 2048 KB, and each block contains 256 pages of 8 KB each. The way pages and blocks can be accessed is covered in details in Section 3.1.

1.2 Organization of an SSD

Figure 1 below is representing an SSD drive and its main components. I have simply reproduced the basic schematic already presented in various papers [2, 3, 6].

 

ssd-architecture

Figure 1: Architecture of a solid-state drive

 

 

Commands come from the user through the host interface. At the moment I am writing this article, the two most common interfaces for newly released SSDs are Serial ATA (SATA), PCI Express (PCIe). The processor in the SSD controller takes the commands and pass them to the flash controller. SSDs also have embedded RAM memory, generally for caching purposes and to store mapping information. Section 4 covers mapping policies in more details. The packages of NAND flash memory are organized in gangs, over multiple channels, which is covered in Section 6.

Figure 2 and 3 below, reproduced from StorageReview.com [26, 27], show what SSDs look like in real life. Figure 2 shows the 512 GB version of the Samsung 840 Pro SSD, released in August 2013. As it can be seen on the circuit board, the main components are:

  • 1 SATA 3.0 interface
  • 1 SSD controller (Samsung MDX S4LN021X01-8030)
  • 1 RAM module (256 MB DDR2 Samsung K4P4G324EB-FGC2)
  • 8 MLC NAND-flash modules, each offering 64 GB of storage (Samsung K9PHGY8U7A-CCK0)

 

samsungssd840pro-01
samsungssd840pro-02

 

Figure 2: Samsung SSD 840 Pro (512 GB) — Pictures courtesy of StorageReview.com [26]

 

 

Figure 3 is a Micron P420m Enterprise PCIe, released late 2013. The main components are:

  • 8 lanes of a PCI Express 2.0 interface
  • 1 SSD controller
  • 1 RAM module (DRAM DDR3)
  • 64 MLC NAND-flash modules over 32 channels, each module offering 32 GB of storage (Micron 31C12NQ314 25nm)

The total memory is 2048 GB, but only 1.4 TB are available after over-provisioning.

 

micron-p420m-01
micron-p420m-02

 

Figure 3: Micron P420m Enterprise PCIe (1.4 TB) — Pictures courtesy of StorageReview.com [27]

 

 

1.3 Manufacturing process

Many SSD manufacturers use surface-mount technology (SMT) to produce SSDs, a production method in which electronic components are placed directly on top of printed circuit boards (PCBs). SMT lines are composed of a chain of machines, each machine being plugged into the next and having a specific task to perform in the process, such as placing components or melting the solder. Multiple quality checks are also performed throughout the entire process. Photos and videos of SMT lines can be seen in two articles by Steve Burke [67, 68], in which he visited the production facilities of Kingston Technologies in Fountain Valley, California, and in an article by Cameron Wilmot about the Kingston installations in Taiwan [69].

Other interesting resources are two videos, the first one about the Crucial SSDs by Micron [70] and the second one about Kingston [71]. In the latter, which is part of Steve Burke’s articles and that I also have embedded below, Mark Tekunoff from Kingston is giving a tour of one of their SMT lines. Interesting detail, everyone in the video is wearing a cute antistatic pyjama and seems to be having a lot of fun!

 

 

 

2. Benchmarking and performance metrics

2.1 Basic benchmarks

Table 2 below shows the throughput for sequential and random workloads on different solid-state drives. For the sake of comparison, I have included SSDs released in 2008 and 2013, along with one hard drive, and one RAM memory chip.

 

 

  Samsung 64 GB Intel X25-M Samsung 840 EVO Micron P420m HDD RAM
Brand/Model Samsung(MCCDE64G5MPP-OVA) Intel X25-M(SSDSA2MH080G1GC) Samsung (SSD 840 EVO mSATA) Micron P420m Western Digital Black 7200 rpm Corsair Vengeance DDR3
Memory cell type MLC MLC TLC MLC * *
Release year 2008 2008 2013 2013 2013 2012
Interface SATA 2.0 SATA 2.0 SATA 3.0 PCIe 2.0 SATA 3.0 *
Total capacity 64 GB 80 GB 1 TB 1.4 TB 4 TB 4 x 4 GB
Pages per block 128 128 256 512 * *
Page size 4 KB 4 KB 8 KB 16 KB * *
Block size 512 KB 512 KB 2048 KB 8196 KB * *
Sequential reads (MB/s) 100 254 540 3300 185 7233
Sequential writes (MB/s) 92 78 520 630 185 5872
4KB random reads (MB/s) 17 23.6 383 2292 0.54 5319 **
4KB random writes (MB/s) 5.5 11.2 352 390 0.85 5729 **
4KB Random reads (KIOPS) 4 6 98 587 0.14 105
4KB Random writes (KIOPS) 1.5 2.8 90 100 0.22 102
Notes * metric is not applicable for that storage solution
** measured with 2 MB chunks, not 4 KB
Metrics MB/s: Megabytes per Second
KIOPS: Kilo IOPS, i.e 1000 Input/Output Operations Per Second
Sources Samsung 64 GB [21]
Intel X25-M [2, 28]
Samsung SSD 840 EVO [22]
Micron P420M [27]
Western Digital Black 4 TB [25]
Corsair Vengeance DDR3 RAM [30]

 

Table 2: Characteristics and throughput of solid-state drives compared to other storage solutions

 

 

An important factor for performance is the host interface. The most common interfaces for newly released SSDs are SATA 3.0, PCI Express 3.0. On a SATA 3.0 interface, data can be transferred up to 6 Gbit/s, which in practice gives around 550 MB/s, and on a PCIe 3.0 interface, data can be transferred up to 8 GT/s per lane, which in practice is roughly 1 GB/s (GT/s stands for Gigatransfers per second). SSDs on the PCIe 3.0 interface are more than a single lane. With four lanes, PCIe 3.0 can offer a maximum bandwidth of 4 GB/s, which is eight times faster than SATA 3.0. Some enterprise SSDs also offer a Serial Attached SCSI interface (SAS) which in its latest version can offer up to 12 GBit/s, although at the moment SAS is only a tiny fraction of the market.

Most recent SSDs are fast enough internally to easily reach the 550 MB/s limitation of SATA 3.0, therefore the interface is the bottleneck for them. The SSDs using PCI Express 3.0 or SAS offer tremendous performance increases [15].

PCI Express and SAS are faster than SATA

The two main host interfaces offered by manufacturers are SATA 3.0 (550 MB/s) and PCI Express 3.0 (1 GB/s per lane, using multiple lanes). Serial Attached SCSI (SAS) is also available for enterprise SSDs. In their latest versions, PCI Express and SAS are faster than SATA, but they are also more expensive.

2.2 Pre-conditioning

If you torture the data long enough, it will confess.
— Ronald Coase

The data sheets provided by SSD manufacturers are filled with amazing performance values. And indeed, by banging whatever random operations for long enough, manufacturers seem to always find a way to show shinny numbers in their marketing flyers. Whether or not those numbers really mean anything and allow to predict the performance of a production system is a different problem.

In his articles about common flaws in SSD benchmarking [66], Marc Bevand mentioned that for instance it is common for the IOPS of random write workloads to be reported without any mention of the span of the LBA, and that many IOPS are also reported for queue depth of 1 instead of the maximum value for the drive being tested. There are also many cases of bugs and misuses of the benchmarking tools.

Correctly assessing the performance of SSDs is not an easy task. Many articles from hardware reviewing blogs run ten minutes of random writes on a drive and claim that the drive is ready to be tested, and that the results can be trusted. However, the performance of SSDs only drops under a sustained workload of random writes, which depending on the total size of the SSD can take just 30 minutes or up to three hours. This is why the more serious benchmarks start by applying such a sustained workload of random writes, also called “pre-conditioning” [50]. Figure 7 below, reproduced from an article on StorageReview.com [26], shows the effect of pre-conditioning on multiple SSDs. A clear drop in performance can be observed after around 30 minutes, where the throughput decreases and the latency increases for all drives. It then takes another four hours for the performance to slowly decay to a constant minimum.

 

writes-preconditioning

 

Figure 7: Effect of pre-conditioning on multiple SSD models — Pictures courtesy of StorageReview.com[26]

 

 

What is happening in Figure 7 essentially is that, as explained in Section 5.2, the amount of random writes is so large and applied in such a sustained way that the garbage collection process is unable to keep up in background. The garbage collection must erase blocks as write commands arrive, therefore competing with the foreground operations from the host. People using pre-conditioning claim that the benchmarks it produces accurately represent how a drive will behave in its worst possible state. Whether or not this is a good model for how a drive will behave under all workloads is arguable.

In order to compare various models coming from different manufacturers, a common ground must be found, and the worst possible state is a valid one. But picking the drive that performs best under the worst possible workload does not always guarantee that it will perform best under the workload of a production environment. Indeed, in most production environments, an SSD drive will serve one and only one system. That system has a specific workload due to its internal characteristics, and therefore a better and more accurate way to compare different drives would be to run the same replay of this workload on those drives, and then compare their respective performance. This is why, even though a pre-conditioning using a sustained workload of random writes allows for a fair comparison of different SSDs, one has to be careful and should, whenever possible, run in-house benchmarks based on the target workload. Benchmarking in-house also allows not to over-allocate resources, by avoiding using the “best” SSD model when a cheaper one would be enough and save a lot of money.

Benchmarking is hard

Testers are humans, therefore not all benchmarks are exempt of errors. Be careful when reading the benchmarks from manufacturers or third parties, and use multiple sources before trusting any numbers. Whenever possible, run your own in-house benchmarking using the specific workload of your system, along with the specific SSD model that you want to use. Finally, make sure you look at the performance metrics that matter most for the system at hand.

2.3 Workloads and metrics

Performance benchmarks all share the same varying parameters and provide results using the same metrics. In this section, I wish to give some insights as to how to interpret those parameters and metrics.

 

The parameters used are generally the following:

  • The type of workload: can be a specific benchmark based on data collected from users, or just only sequential or random accesses of the same type (ex: only random writes)
  • The percentages of reads and writes performed concurrently (ex: 30% reads and 70% writes)
  • The queue length: this is the number of concurrent execution threads running commands on a drive
  • The size of the data chunks being accessed (4 KB, 8 KB, etc.)

 

Benchmark results are presented using different metrics. The most common are:

  • Throughput: The speed of transfer, generally in KB/s or MB/s, respectively kilobytes per second, and megabytes per second. This is the metric chosen for sequential benchmarks.
  • IOPS: the number of Input/Output Operations Per Second, each operations being of the same data chunk size (generally 4 KB/s). This is the metrics chosen for the random benchmarks.

    [17]

  • Latency: the response time of a device after a command is emitted, generally in μs or ms, respectively microseconds or milliseconds.

 

While the throughput is easy to understand and relate to, the IOPS is more difficult to grasp. For example, if a disk shows a performance for random writes at 1000 IOPS for 4 KB chunks, this means that the throughput is of 1000 x 4096 = 4 MB/s. Consequently, a high IOPS will translate into a high throughput only if the size of the chunks is the largest possible. A high IOPS at a low average chuck size will translate into a low throughput.

To illustrate this point, let’s imagine that we have a logging system performing tiny updates over thousands of different files per minute, giving a performance of 10k IOPS. Because the updates are spread over so many different files, the throughput could be close to something like 20 MB/s, whereas writing sequentially to only one file with the same system could lead to an increased throughput of 200 MB/s, which is a tenfold improvement. I am making up those numbers for the sake of this example, although they are close to production systems I have encountered.

Another concept to grasp is that a high throughput does not necessarily means a fast system. Indeed, if the latency is high, no matter how good is the throughput, the overall system will be slow. Let’s take the example of a hypothetical single-threaded process that requires connections to 25 databases, each connection having a latency of 20 ms. Because the connection latencies are cumulative, obtaining the 25 connections will require 25 x 20 ms = 500 ms. Therefore, even if the machines running the database queries have fast network cards, let’s say 5 GBits/s of bandwidth, the script will still be slow due to the latency.

The takeaway from this section is that it is important to keep an eye on all the metrics, as they will show different aspects of the system and will allow to identify the bottlenecks when they come up. When looking at the benchmarks of SSDs and deciding which model to pick, keeping in mind which metric is the most critical to the system in which those SSDs will used is generally a good rule of thumb. Then of course, nothing will replace proper in-house benchmarking as explained in Section 2.2.

An interesting follow-up on the topic is the article “IOPS are a scam” by Jeremiah Peschka [46].

What’s next

Part 3 is available here. You can also go to the Table of Content for this series of articles, and if you’re in a rush, you can also directly go to Part 6, which is summarizing the content from all the other parts.

To receive a notification email every time a new article is posted on Code Capsule, you can subscribe to the newsletter by filling up the form at the top right corner of the blog.
As usual, comments are open at the bottom of this post, and I am always happy to welcome questions, corrections and contributions!

Translations

This article was translated to Simplified Chinese by Xiong Duo.

References

[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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章