Intel Optane PMEM 概览
文章目錄
- 前言
- 基本架構(gòu)
- 編程模型
- PMDK
- 接口架構(gòu)
- 接口概覽
- pmdk 安裝
- 開發(fā)文檔匯總
- PMEM性能
- 官方性能
- 實測性能
前言
隨著以PCM 為存儲單元的3D XPoint 非易失存儲介質(zhì) 不斷精進的工藝,以及 上層硬件協(xié)議棧的飛速發(fā)展,為非易失內(nèi)存這樣硬件的出現(xiàn)提供了技術(shù)工藝基礎(chǔ)。
關(guān)于3D XPoint 介質(zhì) 和 NAND 介質(zhì) 之間的底層差異,可以參考從NMOS 和 PCM 底層存儲單元 來看NAND和3D XPoint的本質(zhì)區(qū)別
全新英特爾? 傲騰TM 持久型內(nèi)存重新定義了傳統(tǒng)的架構(gòu),以合 理的價格提供大型持久型內(nèi)存層級。英特爾? 傲騰TM 級持久型 內(nèi)存(結(jié)合第二代智能英特爾? 至強? 可擴展處理器)在內(nèi)存 密集型工作負載、虛擬機密度和快速存儲容量方面具有突破 性的性能水平,通過比以往更快的分析、云服務(wù)和下一代通 信服務(wù),可加速 IT 轉(zhuǎn)型以支持數(shù)據(jù)時代的需求。
基本架構(gòu)
PMEM 所處 intel構(gòu)建的 存儲架構(gòu)體系的位置 以及 它的性能量級 如下:
總的來說 PMEM處于DDR 內(nèi)存性能之下,能夠提供持久化能力 且 性能和 DDR 在一個量級,遠低于NAND SSD。
基本特點如下:
-
容量更大 ,更經(jīng)濟實惠
能夠提供128G,256G,512G 的容量,且和DDR4總線兼容。它能夠插在內(nèi)存條的插槽之上。 -
字節(jié)可尋址
可以直接加載訪問,其實是以256B 為基本讀寫單元大小。 -
高性能存儲
底層3d xpoint 保證了性能和非易失性 -
支持兩種操作模式
內(nèi)存模式和 APP Direct模式。
內(nèi)存模式下:
即PMEM和內(nèi)存作用一樣,由MMU直接管理空間訪問,同樣存在易失性問題。
不過內(nèi)存模式下性能 肯定是沒有 傳統(tǒng)的DDR性能好。APP Direct模式如下:
PMEM 可以代替DDR,作為內(nèi)存并提供持久化能力。只是這個時候,PMEM的空間管理需要由軟件層來做。
整個PMEM的完整模塊系統(tǒng)如下:
主體部分以 持久內(nèi)存的控制器功能為主,內(nèi)部集成了針對3D XPoint存儲介質(zhì)的各個組件管理,基本的數(shù)據(jù)加密,EC校驗 以及 保證PCM 存儲單元的正常散熱和功耗優(yōu)化 的組件等。這幅圖中CPU以64B訪問是有一些問題,當前的PMEM版本其實是以256B來訪問的。
持久內(nèi)存的使用模式對比如下:
| 優(yōu)勢 | 劣勢 | |
|---|---|---|
| 持久內(nèi)存 內(nèi)存模式 | 容量大,相比于DDR 更便宜 DRAM可作為持久內(nèi)存的緩存。 更大的實例容量,更多實例樹木擴展 無序應(yīng)用改動,容易使用 | 支持最新的CLX平臺 |
| 持久內(nèi)存 APP Direct模式 | 容量大,價格便宜 DRAM和持久內(nèi)存空間都可用 更大的實例容量,更多實例數(shù)目擴展 ,更穩(wěn)定的性能表現(xiàn) 持久化特性,更好的持久化性能,更快的 恢復(fù)時間 | 只支持最新的CLX平臺 需要應(yīng)用管理數(shù)據(jù)的分層,應(yīng)用需要改 動 不經(jīng)過kernel,所以kernel COW 不支 持 |
編程模型
這個針對PMEM的編程模型叫做SNIA(storage network industry association) 細節(jié)可以參考 SNIA,介紹了用戶如何來通過標準接口訪問PMEM低層。
- Persistent Memory 部分中:有兩種訪問NVDIMMs (底層PMEM存儲)的方式,第一種是pmdk,以pmem_mmap方式訪問,第二種是通過pmem aware-fs來訪問, 這個pmem aware-fs是pmem設(shè)備支持的一種適配文件系統(tǒng),可以提供標準用戶訪問的API(read,write,pread,pwrite…)。
- Block中 操作系統(tǒng)抽象出 NVDIMM driver可以在其上格式化標準文件系統(tǒng)(xfs/ext4),對外提供文件系統(tǒng)API;同時也能夠?qū)ν馓峁藴试O(shè)備API 來直接訪問 driver。
- 第三種就是 NVME driver提供了UI ,可以通過UI直接訪問NVMDIMM。
PMDK
PMDK 則是官方為 PMEM的管理員和應(yīng)用開發(fā)者抽象出來的用戶態(tài)接口,能夠極大得簡化用戶操作pmem的成本。
接口架構(gòu)
persistent memory development kit 接口 提供了大量的編程接口,足以應(yīng)對用戶的各種復(fù)雜操作的需求。
對外接口 以及 不同的庫之間關(guān)系如下:
接口概覽
-
libpmem 提供最底層的庫給應(yīng)用,保證數(shù)據(jù)能夠持久化。只是不保證原子性和一致性(沒有事務(wù)),如果用戶直接用這一個庫,則需要自己保證這一些特性。
-
librpmem類似libpmem 提供的持久化能力 以及一些問題,只是這個庫支持通過RDMA訪問遠端的PMEM 設(shè)備。
-
libpmemlog 提供能夠持久化的log 庫
-
libpmemobj 用戶主要是使用的庫,提供了持久化、事務(wù)、內(nèi)存管理、鎖、基本數(shù)據(jù)結(jié)構(gòu)(鏈表。。),保證了原子性和一致性。
-
libpmemblk 提供持久化的塊存儲,保證了塊數(shù)據(jù)的原子更新和下電不丟失。
-
libmemkind 用作pmem的內(nèi)存模式,可以通過malloc/free申請釋放空間,就像使用DDR一樣。
pmdk 安裝
下面主要介紹的是linux 系統(tǒng)的安裝,關(guān)于windows 的安裝,可以參考https://github.com/pmem/pmdk
-
依賴安裝:
yum install autoconf pkg-config ndctl-devel daxctl-devel pandoc -y -
最新版本的pmdk 會依賴更高版本的ndctl,而這個較高版本的ndctl無法通過yum直接安裝,只能通過源碼編譯安裝。
這個過程中遇到的問題挺多的,當然看個人系統(tǒng),如果系統(tǒng)庫安裝的比較全,可能也一次通過,簡單記錄一下。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 # 執(zhí)行失敗 ----------------------------------------------------# 解決 sudo yum install automake libtool -y autoreconf -ivf# 執(zhí)行成功 $ ./autogen.sh ---------------------------------------------------------------- Initialized build system. For a common configuration please run: ---------------------------------------------------------------- ./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64# 執(zhí)行./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 # 執(zhí)行失敗 ----------------------------------------------------# 解決 sudo yum install asciidoctor -y# 重新執(zhí)行 ./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 # 執(zhí)行失敗 ----------------------------------------------------#解決 sudo yum install kmod kmod-devel -y# 再次重新執(zhí)行 ./configure ./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64 ... configure: error: Package requirements (uuid) were not met:No package 'uuid' found #執(zhí)行失敗 ----------------------------------------------------#解決 sudo yum install libuuid-devel json-c-devel -y# 執(zhí)行./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用戶來執(zhí)行 make EXTRA_CFLAGS="-Wno-error" make install prefix=/usr/local # 如果沒有root用戶,可以指定自己的安裝prefix,默認是/usr/local
開發(fā)文檔匯總
- PMDK官網(wǎng):https://pmem.io/pmdk
- PMDK 開發(fā)指南 書籍:https://pmem.io/book/
- PMDK 開發(fā)者論壇: https://groups.google.com/forum/?utm_source=digest&utm_medium=email#!forum/pmem/topics
- 持久內(nèi)存指南: https://software.intel.com/en-us/persistent-memory/get-started
- 持久內(nèi)存編程示例https://software.intel.com/en-us/persistent-memory/training
- 分析你的系統(tǒng)是否適合使用PMEM 的工具: [https://software.intel.com/en- us/articles/vtune-amplifier-platform-profiler](https://software.intel.com/en- us/articles/vtune-amplifier-platform-profiler)
- PMDK 實踐應(yīng)用:
- 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的總數(shù)據(jù)量,讀寫帶寬分別只有1.7Gb/s和0.45GB/s。因為PMEM的字節(jié)尋址的基本單元也是256B,也就是如果只寫入64B,需要占用256B的存儲空間,如果底層要寫入的單元有數(shù)據(jù),則需要先讀取256B的數(shù)據(jù)單元,將64B的數(shù)據(jù)添加進去,再把256B的單元整體寫入到PMEM中。這個過程會極大得降低讀寫性能,所以,針對PMEM的編程建議256B對齊,這樣對pmem的性能更加友好。
實測性能
PMEM性能和內(nèi)存處于一個量級,且PMEM是插在DIMM插槽,也就是內(nèi)存條的插槽上。所以CPU訪問PMEM的性能 只有綁定 NUMA 才能完整體現(xiàn)。
-
硬件環(huán)境:
CPU:Intel? Xeon? CPU E5-2680 v4 @ 2.40GHz 56core
內(nèi)存: 256G
硬盤:pmem 128G*4 aep
操作系統(tǒng):CentOS Linux release 7.4.1708 (Core)
文件系統(tǒng):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。
這個測試 達不到 官網(wǎng)給出的 單個128G 在256B的讀場景下 的6.8G的帶寬,我們使用的是128G*4的 pmem,總帶寬實際測試也只有7.5G/s,這個目前還沒有和官方核對。
其他的數(shù)據(jù)在libpmem引擎下基本一樣,還有如果使用普通的libaio引擎,也就是走文件系統(tǒng)的調(diào)用,讀寫性能會有20%以上的損失,這里的損失基本是由內(nèi)核文件系統(tǒng)帶來的,libpmem引擎能夠支持fio直接通過用戶態(tài)調(diào)用pmdk來訪問PMEM,性能相比于libaio肯定會好一些。
總結(jié)
以上是生活随笔為你收集整理的Intel Optane PMEM 概览的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rocksdb 的优秀代码(二)-- 工
- 下一篇: pmdk -- libpmemlog 介