隨著存儲技術的發(fā)展,對存儲性能的不懈追求,高性能存儲開始探索向內(nèi)存通道的遷移。在這樣的情況下, NVDIMM 技術便應運而生了。
NVDIMM (Non-Volatile Dual In-Line Memory Module) 是一種可以隨機訪問的,非易失性內(nèi)存, 又被稱作PMem (Persistent Memory)。在之前的微信文章中,我們介紹了NVDIMM幾種硬件上的實現(xiàn)方式,以及為了支持和優(yōu)化性能所做的硬件上的改變。今天,我們來討論一下為了充分發(fā)揮NVDIMM的性能,軟件方面做了哪些支持。有些人可能會有疑問, 為什么用起來這么麻煩?既然是持久性內(nèi)存,不是應該關機什么樣, 開機什么樣, 就可以了嗎? 其實目前來看, 這種想法還不會變?yōu)楝F(xiàn)實。 因為除了DRAM是易失性的,比如 cache,寄存器這種也是易失性的。僅僅把內(nèi)存做成持久性的也不能達成這樣的目的。另一個問題是, memory leak。如果發(fā)生了內(nèi)存泄漏, 重啟一下就好了。 那如果是持久性內(nèi)存的泄漏呢?這也是一個很棘手的問題。Pmem有些方面類似于內(nèi)存,也有些方面類似于存儲。但是,通常上我們不會認為Pmem能夠替代內(nèi)存或存儲。其實,可以把它看作是一種補充,填補了內(nèi)存和存儲之間巨大的差異。
SPDK 在 17.10 中開始引入對于Pmem的支持。Pmem在SPDK的bdev層暴露為一個塊設備, 使用快設備接口和上層進行通信。如圖(1)所示。
圖(1)
從圖中我們可以看到libpmemblk 把塊操作轉(zhuǎn)換成了字節(jié)操作。它是怎么做到的呢? 在介紹libpmemblk 和 它背后的PMDK之前, 我們了解一下基礎知識。
mmap和DAX
首先,我們來看傳統(tǒng)的I/O方式, 即緩存I/O (Buffered I/O). 大多數(shù)操作系統(tǒng)默認的IO操作方式都是緩存IO。該機制使IO數(shù)據(jù)緩存在操作系統(tǒng)的page cache 中, 也就是說, 數(shù)據(jù)會被先拷貝到操作系統(tǒng)的內(nèi)核空間的緩沖區(qū)中,然后才會從內(nèi)核空間的緩沖區(qū)拷貝到指定的用戶地址空間。
圖(2)
在Linux 中, 這種訪問文件的方式就是通過read/write 系統(tǒng)調(diào)用來實現(xiàn),如圖(2)。接下來, 我們比較一下內(nèi)存映射IO mmap().
接下來, 我們比較一下內(nèi)存映射IO mmap().
圖(3)
通過mmap獲得了對應文件的一個指針,然后就像操作內(nèi)存一樣進行賦值或者做memcpy/strcpy. 這種我們稱之為load/store操作(這種操作一般需要msync、fsync來落盤)。
mmap因為建立了文件到用戶空間的映射關系, 可以看作是把文件直接拷貝到用戶空間,減少了一次數(shù)據(jù)拷貝。但是, mmap依然需要依靠page cache。
圖(4)
講完了mmap, 那么DAX是什么呢?DAX即direct access,這個特性是基于mmap的。而DAX的區(qū)別在于完全不需要page cache. 直接對存儲設備訪問。 所以它就是為了NVDIMM而生的。應用對于mmap的文件操作, 是直接同步到NVDIMM上的。DAX目前在XFS, EXT4, Windows的 NTFS 上都已經(jīng)支持。需要注意的是, 使用這個模式, 要對應用程序或者文件系統(tǒng)進行修改。
圖(5)
NVM Programming Model
NVM Programming Model 大致定義了三種使用方式。
圖(6)
最左邊Management 主要是通過driver提供的API對NVDIMM進行管理, 比如查看容量信息, 健康狀態(tài), 固件版本, 固件升級, 模式配置等等。
中間, 作為存儲快設備使用, 使用支持NVDIMM driver 的文件系統(tǒng)和內(nèi)核, 應用程序不用做任何修改,通過標準文件接口訪問NVDIMM。
第三種, 基于文件系統(tǒng)的DAX特性,通過load/store操作,不需要page cache, 同步落盤。沒有系統(tǒng)調(diào)用, 沒有中斷。這也是NVM Programming Model 的核心, 能夠充分釋放NVDIMM的性能優(yōu)勢。但它的缺點在于,應用程序可能需要做一下改變。
PMDK
libpmemblk 實現(xiàn)了一個駐留在pmem中的同樣大小的塊的數(shù)組。里面每個塊對于突然掉電,程序崩潰等情況依然保持原子事務性。libpmemblk是基于libpmem庫的。
libpmem是PMDK中提供的一個更底層的庫, 尤其是對于flush的支持。它能夠追蹤每次對pmem的store操作,并保證數(shù)據(jù)落盤為持久性數(shù)據(jù)。
除此以外, PMDK 還提供了其他編程庫, 比如libpmemobj, libpmemlog, libvmmalloc 等。感興趣的同學可以訪問http://pmem.io/pmdk/ 獲取更多信息。
SPDK實戰(zhàn)
(1) 創(chuàng)建一個虛擬的Pmem bdev
./configure --with-pmdk
make
PMDK 已經(jīng)在一些新的Linux發(fā)行版中被引入。如果configure出錯,請到https://github.com/pmem/pmdk 自行安裝PMDK庫。
接下來, 我們可以通過SPDK RPC命令來建立一個pmem_pool。
rpc.py create_pmem_pool /path/to/pmem_pool
這里假設我們沒有一個真正的NVDIMM做測試, 所以pmem_pool的路徑就隨便選擇一個就好。比如:
rpc.py create_pmem_pool /mnt/pmem 128 4096
我們也可以用pmem_pool_info來獲取創(chuàng)建pmem_pool的信息:
rpc.py pmem_pool_info /path/to/pmem_pool
或者,刪除剛創(chuàng)建的pmem_pool:
rpc.py delete_pmem_pool /path/to/pmem_pool
然后, 我們在我們創(chuàng)建的pmem_pool上, 建立一個bdev塊設備:
rpc.py construct_pmem_bdev /path/to/pmem_pool -n pmem_bdev_name
(2) 更新配置文件
更改/path/to/spdk/test/bdev/bdev.conf.in, 只保留Pmem配置的部分。
[Pmem]
Blk
Example:
[Pmem]
Blk /mnt/pmem-pool pmem-bdev
(3) bdevperf 測試
./bdevperf -c ../bdev.conf.in -q
Example command:
./bdevperf -c ../bdev.conf.in -q 128 -t 100 -w write -o 4096
./bdevperf -c ../bdev.conf.in -q 1 -t 100 -w randwrite -o 4096
結(jié)語
至此, 對于NVDIMM硬件和軟件上的不同, 大家都有了一個大致的認識。Intel 在2018年5月發(fā)布了基于3D XPoint? 技術的Intel? Optane? DC Persistent Memory, 引發(fā)了NVDIMM爆點。如果你對NVDIMM的用法很感興趣,或者對于NVDIMM的應用有好的想法, 歡迎通過私信或者在評論區(qū)評論交流。希望大家繼續(xù)關注NVDIMM和SPDK技術。
-
存儲技術
+關注
關注
5文章
733瀏覽量
45796 -
內(nèi)存
+關注
關注
8文章
3019瀏覽量
74007
原文標題:內(nèi)存之后,下一代存儲技術怎么用?
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論