下一代存儲技術的先行: NVDIMM 你了解嗎?


 

惠春陽, Intel 軟件工程師, 主要從事SPDK開發和存儲軟件性能優化的工作。

 

文章轉載自DPDK與SPDK開源社區

 

隨着存儲技術的發展, 對存儲性能的不懈追求, 高性能存儲開始探索向內存通道的遷移。 在這樣的情況下, NVDIMM 技術便應運而生了。

NVDIMM (Non-Volatile Dual In-line Memory Module) 是一種可以隨機訪問的, 非易失性內存。非易失性內存指的是即使在不通電的情況下, 數據也不會消失。因此可以在計算機掉電 (unexpected power loss), 系統崩潰和正常關機的情況下, 依然保持數據。 NVDIMM 同時表明它使用的是 DIMM 封裝, 與標准DIMM 插槽兼容, 並且通過標准的 DDR總線進行通信。考慮到它的非易失性, 並且兼容傳統DRAM接口, 又被稱作Persistent Memory。

種類

目前, 根據 JEDEC 標准化組織的定義, 有三種NVDIMM 的實現。分別是:

NVDIMM-N

指在一個模塊上同時放入傳統 DRAM 和 flash 閃存。 計算機可以直接訪問傳統 DRAM。 支持按字節尋址, 也支持塊尋址。通過使用一個小的后備電源,為在掉電時, 數據從DRAM 拷貝到閃存中提供足夠的電能。當電力恢復時, 再重新加載到DRAM 中。

圖1 NVDIMM-N示意圖

 

NVDIMM-N 的主要工作方式其實和傳統 DRAM是一樣的。因此它的延遲也在10的1次方納秒級。 而且它的容量, 受限於體積, 相比傳統的 DRAM 也不會有什么提升。

同時它的工作方式決定了它的 flash 部分是不可尋址的。而且同時使用兩種介質的作法使成本急劇增加。 但是, NVDIMM-N 為業界提供了持久性內存的新概念。目前市面上已經有很多基於NVIMM-N的產品。

NVDIMM-F

指使用了 DRAM 的DDR3或者 DDR4 總線的flash閃存。我們知道由 NAND flash 作為介質的 SSD, 一般使用SATA, SAS 或者PCIe 總線。使用 DDR 總線可以提高最大帶寬, 一定程度上減少協議帶來的延遲和開銷。 不過只支持塊尋址。

NVDIMM-F 的主要工作方式本質上和SSD是一樣的。因此它的延遲在 10的1次方微秒級。它的容量也可以輕松達到 TB 以上。

NVDIMM-P

這是一個目前還沒有發布的標准 (Under Development)。預計將與DDR5 標准一同發布。按照計划,DDR5將比DDR4提供雙倍的帶寬,並提高信道效率。這些改進,以及服務器和客戶端平台的用戶友好界面,將在各種應用程序中支持高性能和改進的電源管理。

NVDIMM-P 實際上是真正 DRAM 和 flash 的混合。它既支持塊尋址, 也支持類似傳統 DRAM 的按字節尋址。 它既可以在容量上達到類似 NAND flash 的TB以上, 又能把延遲保持在10的2次方納秒級。

通過將數據介質直接連接至內存總線, CPU 可以直接訪問數據, 無需任何驅動程序或 PCIe 開銷。而且由於內存訪問是通過64 字節的 cache line, CPU 只需要訪問它需要的數據, 而不是像普通塊設備那樣每次要按塊訪問。

Intel 公司在2018年5月發布了基於3D XPoint™ 技術的Intel® Optane™ DC Persistent Memory。可以認為是NVDIMM-P 的一種實現。

圖2 Intel® Optane™ DC Persistent Memory

 

硬件支持

應用程序可以直接訪問NVDIMM-P, 就像對於傳統 DRAM那樣。這也消除了在傳統塊設備和內存之間頁交換的需要。但是, 向持久性內存里寫數據是和向普通DRAM里寫數據共享計算機資源的。包括處理器緩沖區, L1/L2緩存等。

需要注意的是, 要使數據持久, 一定要保證數據寫入了持久性內存設備, 或者寫入了帶有掉電保護的buffer。軟件如果要充分利用持久性內存的特性, 指令集架構上至少需要以下支持:

寫的原子性

表示對於持久性內存里任意大小的寫都要保證是原子性的, 以防系統崩潰或者突然掉電。IA-32 和 IA-64 處理器保證了對緩存數據最大64位的數據訪問 (對齊或者非對齊) 的寫原子性。 因此, 軟件可以安全地在持久性內存上更新數據。這樣也帶來了性能上的提升, 因為消除了copy-on-write 或者 write-ahead-logging 這種保證寫原子性的開銷。

高效的緩存刷新(flushing)

出於性能的考慮, 持久性內存的數據也要先放入處理器的緩存(cache)才能被訪問。經過優化的緩存刷新指令減少了由於刷新 (CLFLUSH) 造成的性能影響。

a. CLFLUSHOPT 提供了更加高效的緩存刷新指令

b. CLWB (Cache Line Write Back) 指令把cache line上改變的數據寫回內存 (類似CLFLUSHOPT), 但是無需讓這條 cache line 轉變成無效狀態(invalid, MESI protocol), 而是轉換成未改變的獨占狀態(Exclusive)。CLWB 指令實際上是在試圖減少由於某條cache line刷新所造成的下次訪問必然的cache miss。

提交至持久性內存(Committing to Persistence)

在現代計算機架構下, 緩存刷新的完成表明修改的數據已經被回寫至內存子系統的寫緩沖區。 但是此時數據並不具有持久性。為了確保數據寫入持久性內存, 軟件需要刷新易失性的寫緩沖區或者在內存子系統的其他緩存。 新的用於持久性寫的提交指令 PCOMMIT 可以把內存子系統寫隊列中的數據提交至持久性內存。

非暫時store操作的優化(Non-temporal Store Optimization)

當軟件需要拷貝大量數據從普通內存到持久性內存中時(或在持久性內存之間拷貝), 可以使用弱順序, 非暫時的store操作 (比如使用MOVNTI 指令)。 因為Non-temporal store指令可以隱式地使要回寫的那條cache line 失效, 軟件就不需要明確地flush cache line了(see Section 10.4.6.2. of Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1)。

總結

本期我們介紹了NVDIMM 的幾種實現方式, 以及為了發揮NVDIMM-P 的性能所做的硬件上的優化和支持。后面我們會繼續介紹軟件方面的支持, 包括編程模型, 編程庫, SPDK方面的支持等。敬請期待

 

 

隨着存儲技術的發展,對存儲性能的不懈追求,高性能存儲開始探索向內存通道的遷移。在這樣的情況下, NVDIMM 技術便應運而生了。

NVDIMM (Non-Volatile Dual In-Line Memory Module) 是一種可以隨機訪問的,非易失性內存, 又被稱作PMem (Persistent Memory)。在之前的 NVDIMM上篇中,我們介紹了NVDIMM幾種硬件上的實現方式,以及為了支持和優化性能所做的硬件上的改變。今天,我們來討論一下為了充分發揮NVDIMM的性能,軟件方面做了哪些支持。有些人可能會有疑問, 為什么用起來這么麻煩?既然是持久性內存,不是應該關機什么樣, 開機什么樣, 就可以了嗎? 其實目前來看, 這種想法還不會變為現實。 因為除了DRAM是易失性的,比如 cache,寄存器這種也是易失性的。僅僅把內存做成持久性的也不能達成這樣的目的。另一個問題是, memory leak。如果發生了內存泄漏, 重啟一下就好了。 那如果是持久性內存的泄漏呢?這也是一個很棘手的問題。Pmem有些方面類似於內存,也有些方面類似於存儲。但是,通常上我們不會認為Pmem能夠替代內存或存儲。其實,可以把它看作是一種補充,填補了內存和存儲之間巨大的差異。

 

SPDK 在 17.10 中開始引入對於Pmem的支持。Pmem在SPDK的bdev層暴露為一個塊設備, 使用快設備接口和上層進行通信。如圖(1)所示。

從圖中我們可以看到libpmemblk 把塊操作轉換成了字節操作。它是怎么做到的呢? 在介紹libpmemblk 和 它背后的PMDK之前, 我們了解一下基礎知識。

mmap和DAX

首先,我們來看傳統的I/O方式, 即緩存I/O (Buffered I/O). 大多數操作系統默認的IO操作方式都是緩存IO。該機制使IO數據緩存在操作系統的page cache 中, 也就是說, 數據會被先拷貝到操作系統的內核空間的緩沖區中,然后才會從內核空間的緩沖區拷貝到指定的用戶地址空間。

在Linux 中, 這種訪問文件的方式就是通過read/write 系統調用來實現,如圖(2)。接下來, 我們比較一下內存映射IO mmap().

接下來, 我們比較一下內存映射IO mmap().

通過mmap獲得了對應文件的一個指針,然后就像操作內存一樣進行賦值或者做memcpy/strcpy. 這種我們稱之為load/store操作(這種操作一般需要msync、fsync來落盤)。

mmap因為建立了文件到用戶空間的映射關系, 可以看作是把文件直接拷貝到用戶空間,減少了一次數據拷貝。但是, mmap依然需要依靠page cache。

講完了mmap, 那么DAX是什么呢?DAX即direct access,這個特性是基於mmap的。而DAX的區別在於完全不需要page cache. 直接對存儲設備訪問。 所以它就是為了NVDIMM而生的。應用對於mmap的文件操作, 是直接同步到NVDIMM上的。DAX目前在XFS, EXT4, Windows的 NTFS 上都已經支持。需要注意的是, 使用這個模式, 要對應用程序或者文件系統進行修改。

NVM Programming Model

NVM Programming Model 大致定義了三種使用方式。

1.最左邊Management 主要是通過driver提供的API對NVDIMM進行管理, 比如查看容量信息, 健康狀態, 固件版本, 固件升級, 模式配置等等。
2.中間, 作為存儲快設備使用, 使用支持NVDIMM driver 的文件系統和內核, 應用程序不用做任何修改,通過標准文件接口訪問NVDIMM。
3.第三種, 基於文件系統的DAX特性,通過load/store操作,不需要page cache, 同步落盤。沒有系統調用, 沒有中斷。這也是NVM Programming Model 的核心, 能夠充分釋放NVDIMM的性能優勢。但它的缺點在於,應用程序可能需要做一下改變。

PMDK

libpmemblk 實現了一個駐留在pmem中的同樣大小的塊的數組。里面每個塊對於突然掉電,程序崩潰等情況依然保持原子事務性。libpmemblk是基於libpmem庫的。

libpmem是PMDK中提供的一個更底層的庫, 尤其是對於flush的支持。它能夠追蹤每次對pmem的store操作,並保證數據落盤為持久性數據。

除此以外, PMDK 還提供了其他編程庫, 比如libpmemobj, libpmemlog, libvmmalloc 等。感興趣的同學可以訪問http://pmem.io/pmdk/ 獲取更多信息。

SPDK實戰

bdevperf測模擬NVDIMM性能

(1) 創建一個虛擬的Pmem bdev

 

 

PMDK 已經在一些新的Linux發行版中被引入。如果configure出錯,請到https://github.com/pmem/pmdk 自行安裝PMDK庫。

接下來, 我們可以通過SPDK RPC命令來建立一個pmem_pool。

 

 

這里假設我們沒有一個真正的NVDIMM做測試, 所以pmem_pool的路徑就隨便選擇一個就好。比如:

 

 

我們也可以用pmem_pool_info來獲取創建pmem_pool的信息:

 

 

或者,刪除剛創建的pmem_pool:

 

 

然后, 我們在我們創建的pmem_pool上, 建立一個bdev塊設備:

 

 

(2) 更新配置文件
更改/path/to/spdk/test/bdev/bdev.conf.in, 只保留Pmem配置的部分。

 

 

Example:

 

 

(3) bdevperf 測試

 

 

Example command:

 

 

結語

至此, 對於NVDIMM硬件和軟件上的不同, 大家都有了一個大致的認識。Intel 在2018年5月發布了基於3D XPoint™ 技術的Intel® Optane™ DC Persistent Memory, 引發了NVDIMM爆點。如果你對NVDIMM的用法很感興趣,或者對於NVDIMM的應用有好的想法, 歡迎通過私信或者在評論區評論交流。希望大家繼續關注NVDIMM和SPDK技術。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM