NVM作為主存上對資料庫管理系統的影響

yzs87發表於2019-11-01

NVM 作為主存上對資料庫管理系統的影響

implications of non-volatile memory as primary storage for database management systems

摘要

傳統的資料庫管理系統使用磁碟儲存關係型資料。硬碟的特點:廉價、永續性、大容量。然而,從磁碟進行讀取資料代價非常高。為了消除這個延遲,需要DRAM 作為中間媒介。 DRAM 的特點:比磁碟速度快,但容量小且不具備永續性。 NVM 是一個新興的儲存技術,具有容量大、位元組定址、堪比 DRAM 的儲存速度、非易失興。

本文,我們綜述了NVM 作為主存對關係型資料庫管理系統的影響。即,研究瞭如何修改傳統的關係型資料庫管理系統以充分利用 NVM 的特性。修改了 PostgreSQL 的儲存引擎,使之適配 NVM ,並詳細描述瞭如何修改以及修改的挑戰。最後通過一個全面的模擬平臺對其進行測試評估。結果顯示,資料儲存在磁碟:修改後的 PG 查詢時間比原生 PG 減少 40% ;資料儲存在 NVM ,可以減少 14.4% 。平均分別減少 20.5% 4.5%

引言

一般資料庫管理系統都是記憶體加磁碟的架構,資料集最終會持久化到磁碟。磁碟具有廉價、非易失的特性,適合儲存大規模資料。然而,當從磁碟讀取資料時,時間比較長。為了減少資料訪問的延遲,在CPU 和磁碟直接新增了 DRAM 作為中間儲存媒介。 DRAM 的訪問速度比磁碟快幾個數量級。另外,隨著 DRAM 晶片的密度增加以及記憶體價格的降低,具有大記憶體的系統變得越來越常見。

基於這些原因,傳統的基於記憶體的關聯式資料庫變得越來越流行。關係型資料庫的重要部分,例如索引結構、恢復機制、提交處理過程等都是針對主存作為儲存介質而定製的。但是關係型資料庫在處理關鍵資料或者非冗餘資料時仍然需要持久化儲存介質,例如大量磁碟。

DRAM 是影響資料庫服務效率的重要因素。資料庫在執行查詢時, 59% 的電量耗費在主存上。此外,還有與漏電和電壓相關的內建物質限制 DRAM 的進一步擴充套件。因此, DRAM 作為主要記憶體介質,不可能跟上當前以及未來資料集的增長。

NVM 是一種新型的硬體儲存介質,同時具備磁碟和 DRAM 的一些特性。突出的 NVM 技術產品有: PC-RAM STT-RAM R-RAM 。因為 NVM 具有裝置層次上的永續性,所以不需要向 DRAM 一樣的重新整理週期以維持資料狀態。因此 NVM DRAM 相比,每 bit 耗費的能量更少。另外, NVM 比硬碟有更小的延遲,讀延遲甚至和 DRAM 相當;位元組定址;比 DRAM 密度更大。

DBMS 設計時需要充分考慮 NVM 的特性以釋放其硬體紅利。最簡單的設計方法是將 NVM 替代磁碟,利用其低延遲以獲取效能提升。然而,使 DBMS 適配 NVM 的特性,遠遠不止其低延遲的特點。

本文,研究瞭如何在設計DBMS 時部署 NVM 。首先,討論瞭如何將 NVM 包含到當前系統的記憶體結構中;然後通過修改 PostgreSQL 的儲存引擎最大化 NVM 的紅利。我們旨在繞過緩慢的磁碟介面的同時保證 DBMS 的健壯性。

我們通過使用模擬平臺和TPC-H 基準測試用例來評估 PG 的兩種修改後的儲存引擎。同時,測試了未修改的 PG SSD NVM 上的場景。結果顯示,修改後的儲存引擎能夠減少核心執行時間(檔案 IO 發生的位置):平均從 10% 2.6% 。修改後的 PG 效能在硬碟上能夠提升 20.5% NVM 上可以提升 4.5% 。另外,證明了修改後的 PG 效能瓶頸:由於直接訪問 NVM 以獲取資料,所以當查詢需要該資料時,改資料不靠近 CPU 。當使用者層次的 cache 沒有該資料時,造成很長的延遲,就體現不出新硬體帶來的好處了。

 

背景

本小節詳細介紹了NVM 技術的特性以及對 DBMS 涉及的影響。然後介紹了管理 NVM 的系統軟體。

1 NVM 特性

資料訪問延遲 NVM 的讀延遲比磁碟小很多。由於 NVM 仍處於開發階段,來源不同延遲不同。 STT-RAM 的延遲 1-20ns 。儘管如此,他的延遲也已經非常接近 DRAM 了。

PC_RAM R-RAM 的寫延遲比 DRAM 高。但是寫延遲不是很重要,因為可以通過 buffer 來緩解。

密度 NVM 的密度比 DRAM 高,可以作為主存的替代品,尤其是在嵌入式系統中。例如,相對於 DRAM PC-RAM 提供 2 4 倍的容量,便於擴充套件。

耐久性 :即每個記憶體單元寫的最大次數。最具競爭性的是PC-RAM STT-RAM ,提供接近 DRAM 的耐久性。更精確的說, NVM 的耐久性是 10 15 DRAM 10 16 。另外,NVM 比快閃記憶體技術的耐久性更大。

能量消耗 NVM 不需要像 DRAM 一樣週期性刷寫以維護記憶體中資料,所以消耗的能量更少。 PC-RAM DRAM 消耗能量顯著的少,其他比較接近。

此外,還有位元組定址、永續性。Interl Micron 已經發起了 3D XPoint 技術,同時 Interl 開發了新的指令以支援持久記憶體的使用。

2 NVM 的系統軟體

使用NVM 作為主存時,不僅需要更改應用軟體還要修改系統軟體,才能充分發揮出 NVM 的優勢。傳統的檔案系統通過 block 層訪問儲存介質。如果僅僅只是將磁碟替換成 NVM ,而不作任何修改,那麼 NVM 儲存也需要通過 block 層才能讀寫資料。因此 NVM 位元組定址的特性不能充分發揮出其優勢。

因此,檔案系統支援持久記憶體上已經有了一些進展。PMFS 是一個由 Interl 開發並開源的 POSIX 檔案系統。它提供 2 個關鍵特性以方便使用 NVM

首先,PMFS 不為 NVM 維護獨立的地址空間。換句話說, NVM 和記憶體統一定址。這意味著不需要將資料從 NVM 拷貝到 DRAM 以便應用訪問。程式可以以位元組的粒度直接訪問 NVM 中的資料。

其次,傳統資料庫以兩種方式訪問blocks :檔案 IO ;記憶體 mapped IO PMFS 以類似傳統 FS 的方式實現檔案 IO 。然而,記憶體 mapped IO 的實現方式不同。傳統檔案系統中記憶體 mapped IO 先將 pages 拷貝到 DRAM PMFS 則不用這個步驟,它直接將 pages 直接對映到程式的地址空間。圖 1 為傳統檔案系統與 PMFS 對比。

 

設計的選擇

本小節,討論了系統包含NVM 時存在的記憶體分層設計方案以及為充分利用 NVM ,對面向磁碟的 DBMS 如何修改。

1 、基於 NVM DBMS 記憶體分層設計

 

有各種方法將NVM 放在當前 DBMS 的記憶體層次結構中。圖 2 展示了幾種使用 NVM 的三種常見。其中 a 圖為傳統的方式,當前使用的中間狀態包括日誌、資料快取、部分查詢狀態,存放在 DRAM 中,主要資料存放於磁碟。

基於NVM 的特性,可以將其替換 DRAM 和磁碟。如 b 圖所示。然而,這樣的改動需要重新設計當前的作業系統和應用軟體。另外,作為 DRAM 的替代品, NVM 技術在耐久性方面並不成熟。因此,我們主張平臺中仍然包含 DRAM 記憶體,磁碟全部或部分被替換成 NVM 。如圖 c NVM-Disk )所示。

這種方案中,仍在當前系統中保留DRAM 層,從而利用 DRAM 快速讀寫臨時資料結構和應用程式碼。另外,允許應用通過 PMFS 檔案系統訪問資料庫系統的資料,利用 NVM 位元組定址的特性避免當前傳統檔案系統的 API 開銷。這樣的部署方式不需要大量的 DRAM ,因為臨時資料量比較小。我們認為這種部署場景是為了整合 NVM 的合理使用方式:將 NVM 放置 DRAM 旁以儲存臨時資料結構或者使用傳統磁碟存放冷資料。

2 、傳統 DBMS 的改動點

將傳統面向磁碟的資料庫系統直接部署在NVM 上時,不能充分發揮出 NVM 新硬體帶來的紅利。當使用 NVM 作為主要儲存介質時, DBMS 的重要部件需要更改或移除。

避免塊級別的訪問 :傳統的DBMS 使用磁碟作為主要儲存介質。由於磁碟順序訪問速度較快,所以以資料塊的形式讀取來平衡磁碟訪問延遲。

不幸的是,以塊的形式訪問資料會造成額外的資料移動成本。例如,如果一個事務更新了一個記錄的一個位元組,仍然需要將整個塊刷寫到磁碟。換句話說,塊級訪問提供了較好的資料預讀。由於NVM 是位元組定址,可以位元組的形式訪問資料。然而,這樣將資料粒度降低到位元組級別,沒有了資料預熱性。一個較好的方法需要平衡這兩方面的優點。

移除DBMS 的內部 buffer cache DBMS 通常維護一個內部的 buffer cache 。當訪問一個記錄時,首先計算出他的磁碟地址。如果資料對應的 block 不在 buffer cache ,就需要從磁碟讀取到 buffer cache

基於NVM 的資料庫就不需要這樣的方法了。如果 NVM 的地址空間可以被其他程式可見,那麼久不需要再做 block 拷貝的動作。直接訪問 NVM 中的記錄會更高效。然而,這就需要一個支援 NVM 的作業系統,例如 PMFS ,可以直接將 NVM 地址空間暴露給程式。

移除redo 日誌 :為了保證資料庫的ACID 屬性, DBMS 需要兩種日誌: undo redo Undo log 用來回滾未提交的事務, redo 用來回放已提交但未寫到磁碟的資料。基於 NVM DBMS 中,如果不部署內部的 buffer cache ,所有寫直接寫到 NVM 時,就不需要 redo log 了,但是 undo log 仍舊需要。

案例:POSTGRESQL

Postgresql 是一個開源關係型資料庫,支援完成的 ACID ,並能夠執行在所有主流的作業系統上,包括 Linux 環境。本小節我們研究了 postgresql 的儲存引擎和做一些修改使之適配 NVM 。先介紹了 PG 的讀寫架構,然後解釋做了哪些修改。

1 PG 的讀寫架構

 

3a 展示了原始 PG 的讀寫檔案操作的架構。左邊一列的圖顯示了 PG 軟體層執行的操作,右邊一列展示了對應的資料移動。注意,使用的作業系統是 PMFS 。圖 3a 中使用 NVM 替代磁碟以儲存資料。

PG 讀寫資料的效能嚴重依賴於檔案 IO 。由於 PMFS 的檔案 IO API 和傳統檔案系統的一樣,所以使用特定的檔案系統對於 PG 來說不用做任何修改。

PG server 呼叫 Buffer Layer 的服務,用於維護內部的 buffer cache Buffer cache 中維護這 PG 即將被訪問的頁。如果 buffer cache 沒有空閒 slot 以供磁碟讀取一個頁進來,就會執行替換策略,即選擇一個資料頁從 buffer cache 的管理連結串列中驅逐供之使用,如果該資料頁是髒頁,則需先將其刷寫到磁碟。

PG 一旦接收到一個從磁碟讀取資料頁的請求, Buffer Layer 就會在 buffer cache 中找一個空閒 slot 並得到他的指標。圖 3a pg Buffer PgBufPtr 分別是空閒的 buffer slot 和對應的指標。 Buffer Layer 將這個指標傳輸給 File Layer 。最終 PG File Layer 喚醒檔案讀和寫,讀和寫依賴於檔案系統來完成。

對於讀操作,PMFS 將資料塊從 NMV 拷貝到核心的 buffer ,然後核心將之拷貝到 PgBufPtr 指向的空閒 buffer cache slot 。寫操作的話也是兩次拷貝,只不過方向相反。

因此,當未命中buffer cache 時,原生 PG 的儲存引擎會引發兩次拷貝動作。當資料集非常大時,這將是一個很大的開銷。由於 PMFS 能夠將 NVM 地址直接 map 到記憶體,可以通過修改儲存引擎,避免拷貝的開銷。下面介紹如何改動。

2 SE1 :使用記憶體 map IO 方式

利用NVM 特性的第一步:將 PG File Layer 替換掉,命名為 MemMapped Layer 。如圖 3b 所示,這一層仍然接收 Buffer Layer 傳來的空閒 buffer slot 的指標。但是,通過使用 PMFS 的記憶體對映輸入輸出介面,不再產生檔案 IO 。將這樣的儲存方式稱之為 SE1

讀操作 :當訪問檔案進行讀時,首先需要呼叫open() 將檔案開啟,然後需要使用 mmap() 將檔案對映到記憶體。由於使用 PMFS mmap() 會返回 NVM 中檔案的對映指標。這就可以是應用直接訪問 NVM 上的檔案。

因此,不需要將請求的資料頁拷貝到核心buffer 中。如圖 3b 所示,可以呼叫 memcpy() 將請求的資料頁直接拷貝到 PG buffer 中。當請求完成,不再需要訪問該檔案時,可以將檔案關閉。之後,就可以呼叫 munmap() 函式取消對映。

寫操作 :和讀操作類似。首先需要將即將更改的檔案開啟,然後mmap 對映。使用 memcpy() 直接將髒資料從 PG buffer 中拷貝到 NVM

SE1 ,不必將資料拷貝到核心 buffer ,減少了一次資料拷貝。

3 SE2 :直接訪問對映檔案

第二種修改方法是,將SE1 MemMapped Layer 替換為圖 3c PtrRedirection Layer 。和 MemMapped Layer 不同,他接收到的是指向 PgBufPtr 的指標( P2PgBufPtr )。

讀操作 :當訪問檔案進行讀操作時,呼叫open() 開啟檔案,然後使用 mmap() 對映到記憶體。原來的 PgBufPtr 指標指向內部 buffer cache 的空閒 slot 。因為 mmap 可以將 NVM 對映到記憶體,即程式可以看到這個地址, PtrRedirection Layer PgBufPtr 指向 NVM 上檔案的地址。讀操作的指標重定向如圖 3c 的“ Read ”標籤所示。

因此讀操作時不再需要資料拷貝。在大資料查詢中,這種方法對效能有很大提升。

寫操作 PMFS 可以使應用直接訪問 NVM 上的檔案。由於 PG 是個多程式系統,直接更改 NVM 上檔案非常危險,可能使資料庫處於不一致的狀態。為了避免這個問題, SE2 在修改資料頁並標記為髒頁前還需 2 步:如果頁在 NVM 中,那麼將資料頁拷貝到內部 buffer cache ,即 Pg-Buffer ;然後解除 PgBufPtr 重定向指標,重新指向 buffer cache 的空閒 slot 。如圖 3c 的“ Write ”流程。通過這種方法, SE2 就能保證每個程式只更改其本地的資料頁副本。

相關工作

之前的工作主要分為兩類:用NVM 將整個資料庫儲存介質替換掉;部署 NVM 儲存日誌。《 Nvram-aware logging in transaction systems 》和《 High performance database logging using storage class memory 》減少磁碟 IO 對事物吞吐量的影響,以及將日誌直接寫入 NVM 而不是刷到磁碟以減少相應時間。多核多 socket 的硬體上使用 NVM 寫分散式日誌,當系統負載增加時減少集中式日誌記錄的競爭:《 Scalable logging through emerging nonvolatile memory 》。 DRAM NVM 兩層儲存,研究不同的恢復方法。

結論

研究了在設計DBMS 時,部署 NVM 對其影響。談論了將 NVM 加入 DBMS 記憶體層次中的幾種情形。將 NVM 完全或者替代部分磁碟是一種典型的應用場景。這種方法下,原理系統不用修改,並允許直接訪問 NVM 上的資料集。介紹了 PG 儲存引擎的兩種變種: SE1 SE2

實驗結果表明,對於原生PG ,將資料庫部署在 NVM 比磁碟上效能最高提升 40% ,平均提升 16% SE1 SE2 相對於磁碟下能減少執行時間近 20.5% 。然而,當前資料庫系統的設計最大障礙在於將效能提升最大化。比較我們基準和 SE2 ,能夠最大提升讀效能 14.4% ,平均 4.5%

限制因素在於資料離CPU 比較遠,這是直接訪問 NVM 上資料的負面影響。這會使 NVM 帶來的優勢減弱。因此開發適配 NVM 的庫非常必要。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2662342/,如需轉載,請註明出處,否則將追究法律責任。

相關文章