随著(zhe)存儲技術的(de)發展, 對(duì)存儲性能的(de)不懈追求, 高(gāo)性能存儲開始探索向内存通(tōng)道的(de)遷移。 在這(zhè)樣的(de)情況下(xià), NVDIMM 技術便應運而生了(le)。
NVDIMM (Non-Volatile Dual In-line Memory Module) 是一種可(kě)以随機訪問的(de), 非易失性内存。非易失性内存指的(de)是即使在不通(tōng)電的(de)情況下(xià), 數據也(yě)不會消失。因此可(kě)以在計算(suàn)機掉電 (unexpected power loss), 系統崩潰和(hé)正常關機的(de)情況下(xià), 依然保持數據。 NVDIMM 同時(shí)表明(míng)它使用(yòng)的(de)是 DIMM 封裝, 與标準DIMM 插槽兼容, 并且通(tōng)過标準的(de) DDR總線進行通(tōng)信。考慮到它的(de)非易失性, 并且兼容傳統DRAM接口, 又被稱作Persistent Memory。
01
種類
目前, 根據 JEDEC 标準化(huà)組織的(de)定義, 有三種NVDIMM 的(de)實現。分(fēn)别是:
NVDIMM-N
指在一個(gè)模塊上同時(shí)放入傳統 DRAM 和(hé) flash 閃存。 計算(suàn)機可(kě)以直接訪問傳統 DRAM。 支持按字節尋址, 也(yě)支持塊尋址。通(tōng)過使用(yòng)一個(gè)小的(de)後備電源,爲在掉電時(shí), 數據從DRAM 拷貝到閃存中提供足夠的(de)電能。當電力恢複時(shí), 再重新加載到DRAM 中。
圖1 NVDIMM-N示意圖
NVDIMM-N 的(de)主要工作方式其實和(hé)傳統 DRAM是一樣的(de)。因此它的(de)延遲也(yě)在10的(de)1次方納秒級。 而且它的(de)容量, 受限于體積, 相比傳統的(de) DRAM 也(yě)不會有什(shén)麽提升。
同時(shí)它的(de)工作方式決定了(le)它的(de) flash 部分(fēn)是不可(kě)尋址的(de)。而且同時(shí)使用(yòng)兩種介質的(de)作法使成本急劇增加。 但是, NVDIMM-N 爲業界提供了(le)持久性内存的(de)新概念。目前市面上已經有很多(duō)基于NVIMM-N的(de)産品。
NVDIMM-F
指使用(yòng)了(le) DRAM 的(de)DDR3或者 DDR4 總線的(de)flash閃存。我們知道由 NAND flash 作爲介質的(de) SSD, 一般使用(yòng)SATA, SAS 或者PCIe 總線。使用(yòng) DDR 總線可(kě)以提高(gāo)最大(dà)帶寬, 一定程度上減少協議(yì)帶來(lái)的(de)延遲和(hé)開銷。 不過隻支持塊尋址。
NVDIMM-F 的(de)主要工作方式本質上和(hé)SSD是一樣的(de)。因此它的(de)延遲在 10的(de)1次方微秒級。它的(de)容量也(yě)可(kě)以輕松達到 TB 以上。
NVDIMM-P
這(zhè)是一個(gè)目前還(hái)沒有發布的(de)标準 (Under Development)。預計将與DDR5 标準一同發布。按照(zhào)計劃,DDR5将比DDR4提供雙倍的(de)帶寬,并提高(gāo)信道效率。這(zhè)些改進,以及服務器和(hé)客戶端平台的(de)用(yòng)戶友好界面,将在各種應用(yòng)程序中支持高(gāo)性能和(hé)改進的(de)電源管理(lǐ)。
NVDIMM-P 實際上是真正 DRAM 和(hé) flash 的(de)混合。它既支持塊尋址, 也(yě)支持類似傳統 DRAM 的(de)按字節尋址。 它既可(kě)以在容量上達到類似 NAND flash 的(de)TB以上, 又能把延遲保持在10的(de)2次方納秒級。
通(tōng)過将數據介質直接連接至内存總線, CPU 可(kě)以直接訪問數據, 無需任何驅動程序或 PCIe 開銷。而且由于内存訪問是通(tōng)過64 字節的(de) cache line, CPU 隻需要訪問它需要的(de)數據, 而不是像普通(tōng)塊設備那樣每次要按塊訪問。
Intel 公司在2018年5月(yuè)發布了(le)基于3D XPoint™ 技術的(de)Intel® Optane™ DC Persistent Memory。可(kě)以認爲是NVDIMM-P 的(de)一種實現。
圖2 Intel® Optane™ DC Persistent Memory
02
硬件支持
應用(yòng)程序可(kě)以直接訪問NVDIMM-P, 就像對(duì)于傳統 DRAM那樣。這(zhè)也(yě)消除了(le)在傳統塊設備和(hé)内存之間頁交換的(de)需要。但是, 向持久性内存裏寫數據是和(hé)向普通(tōng)DRAM裏寫數據共享計算(suàn)機資源的(de)。包括處理(lǐ)器緩沖區(qū), L1/L2緩存等。
需要注意的(de)是, 要使數據持久, 一定要保證數據寫入了(le)持久性内存設備, 或者寫入了(le)帶有掉電保護的(de)buffer。軟件如果要充分(fēn)利用(yòng)持久性内存的(de)特性, 指令集架構上至少需要以下(xià)支持:
寫的(de)原子性
表示對(duì)于持久性内存裏任意大(dà)小的(de)寫都要保證是原子性的(de), 以防系統崩潰或者突然掉電。IA-32 和(hé) IA-64 處理(lǐ)器保證了(le)對(duì)緩存數據最大(dà)64位的(de)數據訪問 (對(duì)齊或者非對(duì)齊) 的(de)寫原子性。 因此, 軟件可(kě)以安全地在持久性内存上更新數據。這(zhè)樣也(yě)帶來(lái)了(le)性能上的(de)提升, 因爲消除了(le)copy-on-write 或者 write-ahead-logging 這(zhè)種保證寫原子性的(de)開銷。
高(gāo)效的(de)緩存刷新(flushing)
出于性能的(de)考慮, 持久性内存的(de)數據也(yě)要先放入處理(lǐ)器的(de)緩存(cache)才能被訪問。經過優化(huà)的(de)緩存刷新指令減少了(le)由于刷新 (CLFLUSH) 造成的(de)性能影(yǐng)響。
a. CLFLUSHOPT 提供了(le)更加高(gāo)效的(de)緩存刷新指令
b. CLWB (Cache Line Write Back) 指令把cache line上改變的(de)數據寫回内存 (類似CLFLUSHOPT), 但是無需讓這(zhè)條 cache line 轉變成無效狀态(invalid, MESI protocol), 而是轉換成未改變的(de)獨占狀态(Exclusive)。CLWB 指令實際上是在試圖減少由于某條cache line刷新所造成的(de)下(xià)次訪問必然的(de)cache miss。
提交至持久性内存
(Committing to Persistence)
在現代計算(suàn)機架構下(xià), 緩存刷新的(de)完成表明(míng)修改的(de)數據已經被回寫至内存子系統的(de)寫緩沖區(qū)。 但是此時(shí)數據并不具有持久性。爲了(le)确保數據寫入持久性内存, 軟件需要刷新易失性的(de)寫緩沖區(qū)或者在内存子系統的(de)其他(tā)緩存。 新的(de)用(yòng)于持久性寫的(de)提交指令 PCOMMIT 可(kě)以把内存子系統寫隊列中的(de)數據提交至持久性内存。
非暫時(shí)store操作的(de)優化(huà)
(Non-temporal Store Optimization)
當軟件需要拷貝大(dà)量數據從普通(tōng)内存到持久性内存中時(shí)(或在持久性内存之間拷貝), 可(kě)以使用(yòng)弱順序, 非暫時(shí)的(de)store操作 (比如使用(yòng)MOVNTI 指令)。 因爲Non-temporal store指令可(kě)以隐式地使要回寫的(de)那條cache line 失效, 軟件就不需要明(míng)确地flush cache line了(le)(see Section 10.4.6.2. of Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1)。
目前鎂光(guāng)和(hé)Skhynix推出的(de)兩款16G NVDIMM内存分(fēn)别型号是MTA18ASF2G72XF1Z-2G6V 16G 1RX4 NN4-2666V-RZZZ和(hé)海力士推出的(de)NVDIMM-N HMN82GR7AFR4N-UH 16G 1RXR NN4-2400T-RZZZ内存,在行業内已經廣泛使用(yòng)
03
總結
本期我們介紹了(le)NVDIMM 的(de)幾種實現方式, 以及爲了(le)發揮NVDIMM-P 的(de)性能所做(zuò)的(de)硬件上的(de)優化(huà)和(hé)支持。後面我們會繼續介紹軟件方面的(de)支持, 包括編程模型, 編程庫, SPDK方面的(de)支持等。敬請期待。