您好,登錄后才能下訂單哦!
NVM作為主存上對數(shù)據(jù)庫管理系統(tǒng)的影響
implications of non-volatile memory as primary storage for database management systems
摘要
傳統(tǒng)的數(shù)據(jù)庫管理系統(tǒng)使用磁盤存儲關系型數(shù)據(jù)。硬盤的特點:廉價、持久性、大容量。然而,從磁盤進行讀取數(shù)據(jù)代價非常高。為了消除這個延遲,需要DRAM作為中間媒介。DRAM的特點:比磁盤速度快,但容量小且不具備持久性。NVM是一個新興的存儲技術,具有容量大、字節(jié)尋址、堪比DRAM的存儲速度、非易失興。
本文,我們綜述了NVM作為主存對關系型數(shù)據(jù)庫管理系統(tǒng)的影響。即,研究了如何修改傳統(tǒng)的關系型數(shù)據(jù)庫管理系統(tǒng)以充分利用NVM的特性。修改了PostgreSQL的存儲引擎,使之適配NVM,并詳細描述了如何修改以及修改的挑戰(zhàn)。最后通過一個全面的仿真平臺對其進行測試評估。結果顯示,數(shù)據(jù)存儲在磁盤:修改后的PG查詢時間比原生PG減少40%;數(shù)據(jù)存儲在NVM,可以減少14.4%。平均分別減少20.5%和4.5%。
引言
一般數(shù)據(jù)庫管理系統(tǒng)都是內存加磁盤的架構,數(shù)據(jù)集最終會持久化到磁盤。磁盤具有廉價、非易失的特性,適合存儲大規(guī)模數(shù)據(jù)。然而,當從磁盤讀取數(shù)據(jù)時,時間比較長。為了減少數(shù)據(jù)訪問的延遲,在CPU和磁盤直接添加了DRAM作為中間存儲媒介。DRAM的訪問速度比磁盤快幾個數(shù)量級。另外,隨著DRAM芯片的密度增加以及內存價格的降低,具有大內存的系統(tǒng)變得越來越常見。
基于這些原因,傳統(tǒng)的基于內存的關系數(shù)據(jù)庫變得越來越流行。關系型數(shù)據(jù)庫的重要部分,例如索引結構、恢復機制、提交處理過程等都是針對主存作為存儲介質而定制的。但是關系型數(shù)據(jù)庫在處理關鍵數(shù)據(jù)或者非冗余數(shù)據(jù)時仍然需要持久化存儲介質,例如大量磁盤。
DRAM是影響數(shù)據(jù)庫服務效率的重要因素。數(shù)據(jù)庫在執(zhí)行查詢時,59%的電量耗費在主存上。此外,還有與漏電和電壓相關的內置物質限制DRAM的進一步擴展。因此,DRAM作為主要內存介質,不可能跟上當前以及未來數(shù)據(jù)集的增長。
NVM是一種新型的硬件存儲介質,同時具備磁盤和DRAM的一些特性。突出的NVM技術產品有:PC-RAM、STT-RAM和R-RAM。因為NVM具有設備層次上的持久性,所以不需要向DRAM一樣的刷新周期以維持數(shù)據(jù)狀態(tài)。因此NVM和DRAM相比,每bit耗費的能量更少。另外,NVM比硬盤有更小的延遲,讀延遲甚至和DRAM相當;字節(jié)尋址;比DRAM密度更大。
DBMS設計時需要充分考慮NVM的特性以釋放其硬件紅利。最簡單的設計方法是將NVM替代磁盤,利用其低延遲以獲取性能提升。然而,使DBMS適配NVM的特性,遠遠不止其低延遲的特點。
本文,研究了如何在設計DBMS時部署NVM。首先,討論了如何將NVM包含到當前系統(tǒng)的內存結構中;然后通過修改PostgreSQL的存儲引擎最大化NVM的紅利。我們旨在繞過緩慢的磁盤接口的同時保證DBMS的健壯性。
我們通過使用仿真平臺和TPC-H基準測試用例來評估PG的兩種修改后的存儲引擎。同時,測試了未修改的PG在SSD和NVM上的場景。結果顯示,修改后的存儲引擎能夠減少內核執(zhí)行時間(文件IO發(fā)生的位置):平均從10%到2.6%。修改后的PG性能在硬盤上能夠提升20.5%,NVM上可以提升4.5%。另外,證明了修改后的PG性能瓶頸:由于直接訪問NVM以獲取數(shù)據(jù),所以當查詢需要該數(shù)據(jù)時,改數(shù)據(jù)不靠近CPU。當用戶層次的cache沒有該數(shù)據(jù)時,造成很長的延遲,就體現(xiàn)不出新硬件帶來的好處了。
背景
本小節(jié)詳細介紹了NVM技術的特性以及對DBMS涉及的影響。然后介紹了管理NVM的系統(tǒng)軟件。
1、NVM特性
數(shù)據(jù)訪問延遲:NVM的讀延遲比磁盤小很多。由于NVM仍處于開發(fā)階段,來源不同延遲不同。STT-RAM的延遲1-20ns。盡管如此,他的延遲也已經(jīng)非常接近DRAM了。
PC_RAM 和R-RAM的寫延遲比DRAM高。但是寫延遲不是很重要,因為可以通過buffer來緩解。
密度:NVM的密度比DRAM高,可以作為主存的替代品,尤其是在嵌入式系統(tǒng)中。例如,相對于DRAM,PC-RAM提供2到4倍的容量,便于擴展。
耐久性:即每個內存單元寫的最大次數(shù)。最具競爭性的是PC-RAM和STT-RAM,提供接近DRAM的耐久性。更精確的說,NVM的耐久性是1015而DRAM是1016。另外,NVM比閃存技術的耐久性更大。
能量消耗:NVM不需要像DRAM一樣周期性刷寫以維護內存中數(shù)據(jù),所以消耗的能量更少。PC-RAM比DRAM消耗能量顯著的少,其他比較接近。
此外,還有字節(jié)尋址、持久性。Interl和Micron已經(jīng)發(fā)起了3D XPoint技術,同時Interl開發(fā)了新的指令以支持持久內存的使用。
2、NVM的系統(tǒng)軟件
使用NVM作為主存時,不僅需要更改應用軟件還要修改系統(tǒng)軟件,才能充分發(fā)揮出NVM的優(yōu)勢。傳統(tǒng)的文件系統(tǒng)通過block層訪問存儲介質。如果僅僅只是將磁盤替換成NVM,而不作任何修改,那么NVM存儲也需要通過block層才能讀寫數(shù)據(jù)。因此NVM字節(jié)尋址的特性不能充分發(fā)揮出其優(yōu)勢。
因此,文件系統(tǒng)支持持久內存上已經(jīng)有了一些進展。PMFS是一個由Interl開發(fā)并開源的POSIX文件系統(tǒng)。它提供2個關鍵特性以方便使用NVM。
首先,PMFS不為NVM維護獨立的地址空間。換句話說,NVM和內存統(tǒng)一尋址。這意味著不需要將數(shù)據(jù)從NVM拷貝到DRAM以便應用訪問。進程可以以字節(jié)的粒度直接訪問NVM中的數(shù)據(jù)。
其次,傳統(tǒng)數(shù)據(jù)庫以兩種方式訪問blocks:文件IO;內存mapped IO。PMFS以類似傳統(tǒng)FS的方式實現(xiàn)文件IO。然而,內存mapped IO的實現(xiàn)方式不同。傳統(tǒng)文件系統(tǒng)中內存mapped IO先將pages拷貝到DRAM。PMFS則不用這個步驟,它直接將pages直接映射到進程的地址空間。圖1為傳統(tǒng)文件系統(tǒng)與PMFS對比。
設計的選擇
本小節(jié),討論了系統(tǒng)包含NVM時存在的內存分層設計方案以及為充分利用NVM,對面向磁盤的DBMS如何修改。
1、基于NVM的DBMS內存分層設計
有各種方法將NVM放在當前DBMS的內存層次結構中。圖2展示了幾種使用NVM的三種常見。其中a圖為傳統(tǒng)的方式,當前使用的中間狀態(tài)包括日志、數(shù)據(jù)緩存、部分查詢狀態(tài),存放在DRAM中,主要數(shù)據(jù)存放于磁盤。
基于NVM的特性,可以將其替換DRAM和磁盤。如b圖所示。然而,這樣的改動需要重新設計當前的操作系統(tǒng)和應用軟件。另外,作為DRAM的替代品,NVM技術在耐久性方面并不成熟。因此,我們主張平臺中仍然包含DRAM內存,磁盤全部或部分被替換成NVM。如圖c(NVM-Disk)所示。
這種方案中,仍在當前系統(tǒng)中保留DRAM層,從而利用DRAM快速讀寫臨時數(shù)據(jù)結構和應用代碼。另外,允許應用通過PMFS文件系統(tǒng)訪問數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù),利用NVM字節(jié)尋址的特性避免當前傳統(tǒng)文件系統(tǒng)的API開銷。這樣的部署方式不需要大量的DRAM,因為臨時數(shù)據(jù)量比較小。我們認為這種部署場景是為了集成NVM的合理使用方式:將NVM放置DRAM旁以存儲臨時數(shù)據(jù)結構或者使用傳統(tǒng)磁盤存放冷數(shù)據(jù)。
2、傳統(tǒng)DBMS的改動點
將傳統(tǒng)面向磁盤的數(shù)據(jù)庫系統(tǒng)直接部署在NVM上時,不能充分發(fā)揮出NVM新硬件帶來的紅利。當使用NVM作為主要存儲介質時,DBMS的重要部件需要更改或移除。
避免塊級別的訪問:傳統(tǒng)的DBMS使用磁盤作為主要存儲介質。由于磁盤順序訪問速度較快,所以以數(shù)據(jù)塊的形式讀取來平衡磁盤訪問延遲。
不幸的是,以塊的形式訪問數(shù)據(jù)會造成額外的數(shù)據(jù)移動成本。例如,如果一個事務更新了一個記錄的一個字節(jié),仍然需要將整個塊刷寫到磁盤。換句話說,塊級訪問提供了較好的數(shù)據(jù)預讀。由于NVM是字節(jié)尋址,可以字節(jié)的形式訪問數(shù)據(jù)。然而,這樣將數(shù)據(jù)粒度降低到字節(jié)級別,沒有了數(shù)據(jù)預熱性。一個較好的方法需要平衡這兩方面的優(yōu)點。
移除DBMS的內部buffer cache:DBMS通常維護一個內部的buffer cache。當訪問一個記錄時,首先計算出他的磁盤地址。如果數(shù)據(jù)對應的block不在buffer cache,就需要從磁盤讀取到buffer cache。
基于NVM的數(shù)據(jù)庫就不需要這樣的方法了。如果NVM的地址空間可以被其他進程可見,那么久不需要再做block拷貝的動作。直接訪問NVM中的記錄會更高效。然而,這就需要一個支持NVM的操作系統(tǒng),例如PMFS,可以直接將NVM地址空間暴露給進程。
移除redo日志:為了保證數(shù)據(jù)庫的ACID屬性,DBMS需要兩種日志:undo和redo。Undo log用來回滾未提交的事務,redo用來回放已提交但未寫到磁盤的數(shù)據(jù)?;贜VM的DBMS中,如果不部署內部的buffer cache,所有寫直接寫到NVM時,就不需要redo log了,但是undo log仍舊需要。
案例:POSTGRESQL
Postgresql是一個開源關系型數(shù)據(jù)庫,支持完成的ACID,并能夠運行在所有主流的操作系統(tǒng)上,包括Linux環(huán)境。本小節(jié)我們研究了postgresql的存儲引擎和做一些修改使之適配NVM。先介紹了PG的讀寫架構,然后解釋做了哪些修改。
1、PG的讀寫架構
圖3a展示了原始PG的讀寫文件操作的架構。左邊一列的圖顯示了PG軟件層執(zhí)行的操作,右邊一列展示了對應的數(shù)據(jù)移動。注意,使用的操作系統(tǒng)是PMFS。圖3a中使用NVM替代磁盤以存儲數(shù)據(jù)。
PG讀寫數(shù)據(jù)的性能嚴重依賴于文件IO。由于PMFS的文件IO的API和傳統(tǒng)文件系統(tǒng)的一樣,所以使用特定的文件系統(tǒng)對于PG來說不用做任何修改。
PG server調用Buffer Layer的服務,用于維護內部的buffer cache。Buffer cache中維護這PG即將被訪問的頁。如果buffer cache沒有空閑slot以供磁盤讀取一個頁進來,就會執(zhí)行替換策略,即選擇一個數(shù)據(jù)頁從buffer cache的管理鏈表中驅逐供之使用,如果該數(shù)據(jù)頁是臟頁,則需先將其刷寫到磁盤。
PG一旦接收到一個從磁盤讀取數(shù)據(jù)頁的請求,Buffer Layer就會在buffer cache中找一個空閑slot并得到他的指針。圖3a中pg Buffer和PgBufPtr分別是空閑的buffer slot和對應的指針。Buffer Layer將這個指針傳輸給File Layer。最終PG的File Layer喚醒文件讀和寫,讀和寫依賴于文件系統(tǒng)來完成。
對于讀操作,PMFS將數(shù)據(jù)塊從NMV拷貝到內核的buffer,然后內核將之拷貝到PgBufPtr指向的空閑buffer cache slot。寫操作的話也是兩次拷貝,只不過方向相反。
因此,當未命中buffer cache時,原生PG的存儲引擎會引發(fā)兩次拷貝動作。當數(shù)據(jù)集非常大時,這將是一個很大的開銷。由于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上的文件。
因此,不需要將請求的數(shù)據(jù)頁拷貝到內核buffer中。如圖3b所示,可以調用memcpy()將請求的數(shù)據(jù)頁直接拷貝到PG的buffer中。當請求完成,不再需要訪問該文件時,可以將文件關閉。之后,就可以調用munmap()函數(shù)取消映射。
寫操作:和讀操作類似。首先需要將即將更改的文件打開,然后mmap映射。使用memcpy()直接將臟數(shù)據(jù)從PG buffer中拷貝到NVM。
SE1,不必將數(shù)據(jù)拷貝到內核buffer,減少了一次數(shù)據(jù)拷貝。
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”標簽所示。
因此讀操作時不再需要數(shù)據(jù)拷貝。在大數(shù)據(jù)查詢中,這種方法對性能有很大提升。
寫操作:PMFS可以使應用直接訪問NVM上的文件。由于PG是個多進程系統(tǒng),直接更改NVM上文件非常危險,可能使數(shù)據(jù)庫處于不一致的狀態(tài)。為了避免這個問題,SE2在修改數(shù)據(jù)頁并標記為臟頁前還需2步:如果頁在NVM中,那么將數(shù)據(jù)頁拷貝到內部buffer cache,即Pg-Buffer;然后解除PgBufPtr重定向指針,重新指向buffer cache的空閑slot。如圖3c的“Write”流程。通過這種方法,SE2就能保證每個進程只更改其本地的數(shù)據(jù)頁副本。
相關工作
之前的工作主要分為兩類:用NVM將整個數(shù)據(jù)庫存儲介質替換掉;部署NVM存儲日志?!禢vram-aware logging in transaction systems》和《High performance database logging using storage class memory》減少磁盤IO對事物吞吐量的影響,以及將日志直接寫入NVM而不是刷到磁盤以減少相應時間。多核多socket的硬件上使用NVM寫分布式日志,當系統(tǒng)負載增加時減少集中式日志記錄的競爭:《Scalable logging through emerging nonvolatile memory》。DRAM和NVM兩層存儲,研究不同的恢復方法。
結論
研究了在設計DBMS時,部署NVM對其影響。談論了將NVM加入DBMS內存層次中的幾種情形。將NVM完全或者替代部分磁盤是一種典型的應用場景。這種方法下,原理系統(tǒng)不用修改,并允許直接訪問NVM上的數(shù)據(jù)集。介紹了PG存儲引擎的兩種變種:SE1和SE2。
實驗結果表明,對于原生PG,將數(shù)據(jù)庫部署在NVM比磁盤上性能最高提升40%,平均提升16%。SE1和SE2相對于磁盤下能減少執(zhí)行時間近20.5%。然而,當前數(shù)據(jù)庫系統(tǒng)的設計最大障礙在于將性能提升最大化。比較我們基準和SE2,能夠最大提升讀性能14.4%,平均4.5%。
限制因素在于數(shù)據(jù)離CPU比較遠,這是直接訪問NVM上數(shù)據(jù)的負面影響。這會使NVM帶來的優(yōu)勢減弱。因此開發(fā)適配NVM的庫非常必要。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。