Intel Optane PMEM 概览
文章目錄
- 前言
- 基本架構
- 編程模型
- PMDK
- 接口架構
- 接口概覽
- pmdk 安裝
- 開發文檔匯總
- PMEM性能
- 官方性能
- 實測性能
前言
隨著以PCM 為存儲單元的3D XPoint 非易失存儲介質 不斷精進的工藝,以及 上層硬件協議棧的飛速發展,為非易失內存這樣硬件的出現提供了技術工藝基礎。
關于3D XPoint 介質 和 NAND 介質 之間的底層差異,可以參考從NMOS 和 PCM 底層存儲單元 來看NAND和3D XPoint的本質區別
全新英特爾? 傲騰TM 持久型內存重新定義了傳統的架構,以合 理的價格提供大型持久型內存層級。英特爾? 傲騰TM 級持久型 內存(結合第二代智能英特爾? 至強? 可擴展處理器)在內存 密集型工作負載、虛擬機密度和快速存儲容量方面具有突破 性的性能水平,通過比以往更快的分析、云服務和下一代通 信服務,可加速 IT 轉型以支持數據時代的需求。
基本架構
PMEM 所處 intel構建的 存儲架構體系的位置 以及 它的性能量級 如下:
總的來說 PMEM處于DDR 內存性能之下,能夠提供持久化能力 且 性能和 DDR 在一個量級,遠低于NAND SSD。
基本特點如下:
-
容量更大 ,更經濟實惠
能夠提供128G,256G,512G 的容量,且和DDR4總線兼容。它能夠插在內存條的插槽之上。 -
字節可尋址
可以直接加載訪問,其實是以256B 為基本讀寫單元大小。 -
高性能存儲
底層3d xpoint 保證了性能和非易失性 -
支持兩種操作模式
內存模式和 APP Direct模式。
內存模式下:
即PMEM和內存作用一樣,由MMU直接管理空間訪問,同樣存在易失性問題。
不過內存模式下性能 肯定是沒有 傳統的DDR性能好。APP Direct模式如下:
PMEM 可以代替DDR,作為內存并提供持久化能力。只是這個時候,PMEM的空間管理需要由軟件層來做。
整個PMEM的完整模塊系統如下:
主體部分以 持久內存的控制器功能為主,內部集成了針對3D XPoint存儲介質的各個組件管理,基本的數據加密,EC校驗 以及 保證PCM 存儲單元的正常散熱和功耗優化 的組件等。這幅圖中CPU以64B訪問是有一些問題,當前的PMEM版本其實是以256B來訪問的。
持久內存的使用模式對比如下:
| 優勢 | 劣勢 | |
|---|---|---|
| 持久內存 內存模式 | 容量大,相比于DDR 更便宜 DRAM可作為持久內存的緩存。 更大的實例容量,更多實例樹木擴展 無序應用改動,容易使用 | 支持最新的CLX平臺 |
| 持久內存 APP Direct模式 | 容量大,價格便宜 DRAM和持久內存空間都可用 更大的實例容量,更多實例數目擴展 ,更穩定的性能表現 持久化特性,更好的持久化性能,更快的 恢復時間 | 只支持最新的CLX平臺 需要應用管理數據的分層,應用需要改 動 不經過kernel,所以kernel COW 不支 持 |
編程模型
這個針對PMEM的編程模型叫做SNIA(storage network industry association) 細節可以參考 SNIA,介紹了用戶如何來通過標準接口訪問PMEM低層。
- Persistent Memory 部分中:有兩種訪問NVDIMMs (底層PMEM存儲)的方式,第一種是pmdk,以pmem_mmap方式訪問,第二種是通過pmem aware-fs來訪問, 這個pmem aware-fs是pmem設備支持的一種適配文件系統,可以提供標準用戶訪問的API(read,write,pread,pwrite…)。
- Block中 操作系統抽象出 NVDIMM driver可以在其上格式化標準文件系統(xfs/ext4),對外提供文件系統API;同時也能夠對外提供標準設備API 來直接訪問 driver。
- 第三種就是 NVME driver提供了UI ,可以通過UI直接訪問NVMDIMM。
PMDK
PMDK 則是官方為 PMEM的管理員和應用開發者抽象出來的用戶態接口,能夠極大得簡化用戶操作pmem的成本。
接口架構
persistent memory development kit 接口 提供了大量的編程接口,足以應對用戶的各種復雜操作的需求。
對外接口 以及 不同的庫之間關系如下:
接口概覽
-
libpmem 提供最底層的庫給應用,保證數據能夠持久化。只是不保證原子性和一致性(沒有事務),如果用戶直接用這一個庫,則需要自己保證這一些特性。
-
librpmem類似libpmem 提供的持久化能力 以及一些問題,只是這個庫支持通過RDMA訪問遠端的PMEM 設備。
-
libpmemlog 提供能夠持久化的log 庫
-
libpmemobj 用戶主要是使用的庫,提供了持久化、事務、內存管理、鎖、基本數據結構(鏈表。。),保證了原子性和一致性。
-
libpmemblk 提供持久化的塊存儲,保證了塊數據的原子更新和下電不丟失。
-
libmemkind 用作pmem的內存模式,可以通過malloc/free申請釋放空間,就像使用DDR一樣。
pmdk 安裝
下面主要介紹的是linux 系統的安裝,關于windows 的安裝,可以參考https://github.com/pmem/pmdk
-
依賴安裝:
yum install autoconf pkg-config ndctl-devel daxctl-devel pandoc -y -
最新版本的pmdk 會依賴更高版本的ndctl,而這個較高版本的ndctl無法通過yum直接安裝,只能通過源碼編譯安裝。
這個過程中遇到的問題挺多的,當然看個人系統,如果系統庫安裝的比較全,可能也一次通過,簡單記錄一下。git clone https://github.com/pmem/ndctl.git cd ndctl git checkout v71 # 當前的最新版本./autogen.shActivated pre-commit hook.GIT_VERSION = 71sh: aclocal: command not foundautoreconf: aclocal failed with exit status: 127 # 執行失敗 ----------------------------------------------------# 解決 sudo yum install automake libtool -y autoreconf -ivf# 執行成功 $ ./autogen.sh ---------------------------------------------------------------- Initialized build system. For a common configuration please run: ---------------------------------------------------------------- ./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64# 執行./configure ./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64 ... checking for a sed that does not truncate output... (cached) /usr/bin/sed checking for asciidoctor... missing configure: error: asciidoctor needed to build documentation # 執行失敗 ----------------------------------------------------# 解決 sudo yum install asciidoctor -y# 重新執行 ./configure ./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64 ... checking for KMOD... no configure: error: Package requirements (libkmod) were not met:No package 'libkmod' foundConsider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix # 執行失敗 ----------------------------------------------------#解決 sudo yum install kmod kmod-devel -y# 再次重新執行 ./configure ./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64 ... configure: error: Package requirements (uuid) were not met:No package 'uuid' found #執行失敗 ----------------------------------------------------#解決 sudo yum install libuuid-devel json-c-devel -y# 執行./configure 成功,生成 Makefile ./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64 # 安裝ndctl make && sudo make install -
編譯:
# 獲取代碼 git clone https://github.com/pmem/pmdk cd pmdk git checkout stable-1.10 # 這一步也可以跳過,直接編譯master分支# 編譯 ,建議以root用戶來執行 make EXTRA_CFLAGS="-Wno-error" make install prefix=/usr/local # 如果沒有root用戶,可以指定自己的安裝prefix,默認是/usr/local
開發文檔匯總
- PMDK官網:https://pmem.io/pmdk
- PMDK 開發指南 書籍:https://pmem.io/book/
- PMDK 開發者論壇: https://groups.google.com/forum/?utm_source=digest&utm_medium=email#!forum/pmem/topics
- 持久內存指南: https://software.intel.com/en-us/persistent-memory/get-started
- 持久內存編程示例https://software.intel.com/en-us/persistent-memory/training
- 分析你的系統是否適合使用PMEM 的工具: [https://software.intel.com/en- us/articles/vtune-amplifier-platform-profiler](https://software.intel.com/en- us/articles/vtune-amplifier-platform-profiler)
- PMDK 實踐應用:
- VMware vSphere : https://vspherecentral.vmware.com/t/hardware-acceleration/persistent-memory-pmem/
- Microsoft Hyper-V: https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/manage/persistent-memory-cmdlets
- pmem-redis: https://github.com/pmem/pmem-redis
PMEM性能
官方性能
參考鏈接: https://www.intel.com/content/www/us/en/products/docs/memory-storage/optane-persistent-memory/optane-persistent-memory-200-series-brief.html
其中 以128G容量為例:
- 寫入單元為256B時,能夠提供292PB 的總寫入壽命,6.8GB/s的讀帶寬,1.85GB/s的寫帶寬,依次讀寫延時基本都在百ns量級
- 寫入單元為64B時,壽命以及讀寫帶寬都有下降。只能寫入91PB的總數據量,讀寫帶寬分別只有1.7Gb/s和0.45GB/s。因為PMEM的字節尋址的基本單元也是256B,也就是如果只寫入64B,需要占用256B的存儲空間,如果底層要寫入的單元有數據,則需要先讀取256B的數據單元,將64B的數據添加進去,再把256B的單元整體寫入到PMEM中。這個過程會極大得降低讀寫性能,所以,針對PMEM的編程建議256B對齊,這樣對pmem的性能更加友好。
實測性能
PMEM性能和內存處于一個量級,且PMEM是插在DIMM插槽,也就是內存條的插槽上。所以CPU訪問PMEM的性能 只有綁定 NUMA 才能完整體現。
-
硬件環境:
CPU:Intel? Xeon? CPU E5-2680 v4 @ 2.40GHz 56core
內存: 256G
硬盤:pmem 128G*4 aep
操作系統:CentOS Linux release 7.4.1708 (Core)
文件系統:XFS(rw,noatime,attr2,dax,inode64,noquota)
測試軟件:FIO -
fio腳本
[global] ioengine=libpmem #pmem引擎 direct=1 norandommap=1 randrepeat=0 runtime=60 time_based size=1G directory=./fio group_reporting [read256B-rand] bs=256B rw=randread numjobs=32 iodepth=4 cpus_allowed=0-15,16-31 #綁定numa
如果大家要對比PMEM和SSD的性能,可以同樣的腳本去測試一下SSD,ioengine可以替換成libaio。
這個測試 達不到 官網給出的 單個128G 在256B的讀場景下 的6.8G的帶寬,我們使用的是128G*4的 pmem,總帶寬實際測試也只有7.5G/s,這個目前還沒有和官方核對。
其他的數據在libpmem引擎下基本一樣,還有如果使用普通的libaio引擎,也就是走文件系統的調用,讀寫性能會有20%以上的損失,這里的損失基本是由內核文件系統帶來的,libpmem引擎能夠支持fio直接通過用戶態調用pmdk來訪問PMEM,性能相比于libaio肯定會好一些。
總結
以上是生活随笔為你收集整理的Intel Optane PMEM 概览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rocksdb 的优秀代码(二)-- 工
- 下一篇: pmdk -- libpmemlog 介