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沒有該數據時,形成很長的延遲,就體現不出新硬件帶來的好處了。sql
背景
本小節詳細介紹了NVM技術的特性以及對DBMS涉及的影響。而後介紹了管理NVM的系統軟件。
一、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的耐久性是1015而DRAM是1016。另外,NVM比閃存技術的耐久性更大。
能量消耗:NVM不須要像DRAM同樣週期性刷寫以維護內存中數據,因此消耗的能量更少。PC-RAM比DRAM消耗能量顯著的少,其餘比較接近。
此外,還有字節尋址、持久性。Interl和Micron已經發起了3D XPoint技術,同時Interl開發了新的指令以支持持久內存的使用。
二、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如何修改。
一、基於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旁以存儲臨時數據結構或者使用傳統磁盤存放冷數據。
二、傳統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的讀寫架構,而後解釋作了哪些修改。
一、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到內存,能夠經過修改存儲引擎,避免拷貝的開銷。下面介紹如何改動。
二、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,減小了一次數據拷貝。
三、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的庫很是必要。數據庫