---
# System prepended metadata

title: 甚麼是 Software-Enabled Flash?
tags: [flash storage]

---

---
tags: flash storage
---

# 甚麼是 Software-Enabled Flash?

## 前序

近年來，SSD 逐漸取代 HDD 成為儲存裝置的主流。然而，即使隨 [NVMe](https://zh.wikipedia.org/zh-tw/NVM_Express) 協定的推出，SSD 裝置可以一定程度的發揮其平行存取的能力，在 host 端對 SSD 的操作仍受限於傳統的 HDD 介面。由於 host 端並不直接考量 NAND 的讀寫特性，包含對 NAND 的平行讀寫方式、垃圾回收(garbage collection)等等 SSD 對 NAND 的管理，都是由 controller 內部的韌體一手包辦。這樣做的好處是 host 端不必完全掌握 SSD 的硬體特性，基於舊有的 HDD 介面就可以享有 SSD 帶來的速度優勢。但相反的，如此一來應用端與 SSD 的工作並不非同步，會產生隨機性的延遲，進而無法百分之百的發揮 SSD 的潛力。比如某次 host write command 可能觸發韌體的垃圾回收，造成出現高度延遲。尤其在超大規模資料中心上的使用上，這樣的問題是希望被改善的。

有沒有方法可以彈性調整對 SSD 管理的程度，以讓開發者根據需求選擇多少部分是由 host 進行，而多少部分則交由 controller 內部管理呢? 這就是前身為東芝記憶體(Toshiba memory) 的鎧俠(Kioxia) 嘗試導入 [Software-Enabled Flash](https://tw.kioxia.com/zh-tw/business/ssd/solution/software-enabled-flash.html) 的目的了。鎧俠與 Linux 基金會合作創立了這個新的開放原始碼專案，專案的目標是重新定義 host 和 SSD 之間的關係，以支持 SSD 更佳的應用在超大規模資料中心的 SSD 裝置。

## SSD 的管理

由於 NAND flash 的讀寫特性與傳統的 HDD 不同，使用上需要更複雜的管理來確保資料正確地被儲存。舉例來說，NAND flash 的特性有:
* 每次的寫入單位必須是一個完整的 "page"，後者可能是數千 bytes 大小
* 要寫入新資料時，需要先做擦除(erase)刪除舊有的資料
* 擦除的單位是一個 "block"，後者可能是由數百甚至數千個 page 組成 
* 隨著寫入/擦除的次數(P/E cycle)增加，對應 block 的壽命也會漸漸消耗
* 需要 ECC 的機制以糾錯和復原資料

:::info
更多的特性可以參考去年寫的 [SSD for beginners](https://hackmd.io/@RinHizakura/Hy89c4sFF) :D
:::

以現有狀況而言，這些議題大部分都是由 SSD 內部的 controller 來解決。SSD 幾乎全部由 controller 管理的好處是 host 可以不必掌握 NAND 管理所需的專業知識，可以將 SDD 當成 HDD 用一致的介面來存取。 

但對於資料中心一類伺服器等級的機器來說，為了可以做到更低延遲的響應(response)，讓 host 更細緻的考慮到 SSD 的物理性質以管理之可能是必要的。目前的 SSD 介面就像一輛固定每個整點進站的公車，如果在人流稀少時已經足夠載送旅客，但假設公車在特定時段的載客量多，想要更有效的消化人流，就勢必要更細緻的安排彈性的班次，讓公車能夠在尖峰時刻更頻繁的駛出。為了可以善用 flash 的原生速度和彈性，於是 Software-Enabled Flash 就被提出以希望介入其中了。

## SEF(Software-Enabled Flash)

Software-Enabled Flash (SEF) 是一項開放原始碼的專案，旨在允許應用程序對 SSD 的性能進行不同程度的控制。在 SEF 中，其會定義一系列的 API，以允許 host 可以使用 SEF API 進行通信，當然這明顯需要一個專門的 SSD(Kioxia 定義其為 SEF unit)配合。有了 SEF 後，如果某個應用想要將所有管理權交給 SSD，那麼它可以告訴 SEF unit 執行 SSD controller 內建標準功能的即可。而如果另一個應用想要主動控制 SSD 中的某部分，那麼它可以告訴 SEF unit 哪些功能仍留給 controller，而哪些又由該應用自行管理。

值得一提的是，像這樣將 NAND 管理移動到 host 端的方式並非是在 SEF 首次提出。在 2015 年，[Open-Channel SSDs](https://github.com/OpenChannelSSD)(也稱為 LightNVM)就被推出以透過將 FTL 等 NAND 管理的實作移動到 host 端的方式，以解決前面提到 SSD 的任務包山包海所造成的效能問題。SEF 則相當於是提供一致的介面以允許在傳統 SSD 與 Open-Channel SSDs 間做彈性的取捨。

硬體上，可以支持 SEF API 的 SSD 可以區分為圖上的各個模組:
![](https://i.imgur.com/ndlUnJw.png)

在 SEF 中，DRAM 是屬於可選擇的部分，SSD 可以用 DRAM 來維護 NAND 的 page tables，或是將其做為寫入 NAND 前的 buffer 等等，藉此提升 SSD 的運作效率與壽命。不過 DRAM 的存在並非必要，取而代之，SSD 可以捨棄或減少 SSD 內部 DRAM 的使用，轉為借用 host 的主記憶體替代之。

Generation-Specific program logic 提供對 flash 進行操作的實作層。就過去 Open-Channel SSD 直接以低層級方式管理 SSD，面臨的一大挑戰是 flash 操作的不同不僅因供應商而異，同廠商的每一代產品也會有差異。而 SEF 的目標是利用適當的抽象使 host 可以以一致的 API 控制 SSD，而 SEF unit 的 Generation-Specific program logic 則可以根據 flash 供應商與晶片的世代為 API 提供底層對應的行為。

SEF unit 負責處理 page programming、延長壽命的演算法(例如磨損均衡/wear leveling)、ECC 以及壞塊管理(bad block management) 等工作，對應到圖中的 Micro-Controller logic。每個 SEF unit 可以支持使用 copy offload 來提高 SSD 的壽命與效率: 藉由將 host 的記憶體作為 flash block 的 cache 使用，如此一來，在真正寫回 flash 前，這個 block 就可以被任意地(randomly)修改。這減少了因為 flash 的 program 和 erase 的單位差距造成的寫入放大(write amplification) 和垃圾回收(garbage collection)問題。除此之外，SEF unit 也可以支持 scheduling 的功能，允許以不同的優先級處理 host 對 controller 發出的 command。

在軟體層面上，整個架構則如下圖所示: 在 user 應用端，可以選擇通過 SEF API 直接與 device driver 溝通，也可以選擇繼續使用傳統的檔案系統介面，這提供 user 端在操作 SSD 上的彈性。
![](https://i.imgur.com/2mUsIVS.png)


## 小結

本文簡單的介紹了 SEF 的源起以及內容，在[官方的頁面](https://tw.kioxia.com/zh-tw/business/ssd/solution/software-enabled-flash.html)上有更多關於此技術的細節，有興趣的人可以自行閱讀參考。然而 SEF 雖然對於 host 和 SSD 的關係提出新的見解，目前來看還屬於很早期的階段，專案的 [GitHub](https://github.com/SoftwareEnabledFlash/SEF-API) 也沒有真正的 API 實作。但還是很期待 SEF 作為開源專案能夠前進到甚麼地方，就讓我們繼續關注這項技術未來的發展吧~

## Reference
* [SSD for beginners](https://hackmd.io/@RinHizakura/Hy89c4sFF)
* [Promises, potential pitfalls of software-enabled flash](https://www.techtarget.com/searchstorage/news/252526815/Promises-potential-pitfalls-of-software-enabled-flash)
* [Software-Enabled Flash™ | 開放原始碼技術](https://tw.kioxia.com/zh-tw/business/ssd/solution/software-enabled-flash.html)
* [Introducing Software-Enabled Flash™ (SEF) Technology](https://tw.kioxia.com/content/dam/kioxia/shared/business/ssd/solution/software-enabled-flash/asset/productbrief/KIOXIA_Introducing_SEF_Technology_White_Paper.pdf)
* [What’s Software-Enabled Flash?](https://thessdguy.com/whats-software-enabled-flash/)
* [儲存月報第20期：SSD架構大翻轉—Open-Channel SSD](https://www.ithome.com.tw/news/122307)