NVM作爲主存上對數據庫管理系統的影響

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的耐久性是1015而DRAM是1016。另外,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時存在的內存分層設計方案以及爲充分利用NVM,對面向磁盤的DBMS如何修改。
1、基於NVM的DBMS內存分層設計
NVM作爲主存上對數據庫管理系統的影響
有各種方法將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的讀寫架構
NVM作爲主存上對數據庫管理系統的影響
圖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的庫非常必要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章