1. 程式人生 > >一種新型記憶體(SCM)的簡單應用思考

一種新型記憶體(SCM)的簡單應用思考

1.寫在前面

在上一篇部落格中,我們介紹了SCM的產生及其所具有一些特點,並初步展望了它在實際中可能存在的應用場景和巨大潛力。
SCM(Storage-class Memory),它具有大容量、非易失、可位元組定址、存取速度快(幾乎與DRAM相當)的突出優勢,這使得SCM取代磁碟disk及固態硬碟SSD成為了可能。甚至在不遠的將來,當SCM的存取效能超越DRAM,它還可以徹底改變現有的儲存器體系結構。
然而,在目前這一階段,我們更多地還是考慮DRAM/SCM混合記憶體架構。將DRAM徹底替換掉將是一個漸變的漫長的過程,因為現有的作業系統的很多設計機制是將記憶體特性考慮進去的,不能一口氣吃個胖子。於此類似地,許多應用是面向塊的(block-oriented),及將磁碟IO作為主要考量內容融入軟體設計中,所以要用SCM替換DISK也是一個不小的挑戰,這就需要軟體設計者充分利用SCM的存取特點及優勢來重新設計byte-oriented的軟體。

2.記憶體計算與大資料

現如今,記憶體計算是計算機領域一個非常熱門的研究方向。不僅學術界如此,工業界更是如此。
一篇2015年的TKDE頂級期刊論文survey高屋建瓴地介紹了時下熱門的大資料記憶體計算(和管理技術)
比如在分散式計算方面,基於MapReduce框架實現的開源Hadoop平臺就是面向磁碟的,每算完一輪資料就要傳中間結果給HDFS(Hadoop Distributed File System),需要大量的磁碟IO,這就造成了Hadoop在進行分散式大資料處理時的效能瓶頸。而Spark則通過將全部資料放入記憶體中計算,中間結果也儲存在記憶體中極大地提高了系統性能。尤其是在進行迭代式資料處理時,Spark比Hadoop要快幾乎一百倍。
在Database儲存與恢復方面,傳統的資料庫系統操作都是磁碟中進行的,而現在許多研究者開始試圖將Database放入記憶體中進行計算和處理,並加入某些特殊的機制來保證資料可靠性和一致性。比如典型的KV-Store記憶體架構實現有Memcache,MassTree,Redis等等。
簡單歸結起來,將計算過程從傳統的Disk或者SSD中引入到DRAM中,正是利用了DRAM的高速存取特性來加速計算過程,從而提高系統性能。然而DRAM因為掉電易失,不支援資料的持久儲存,因此需要格外注意資料容錯和恢復方面的設計,這是一個非常具有探索價值的研究領域。
有一篇

上海交通大學計算機系並行與分散式計算實驗室中的2016FAST會議論文就是利用傳統的PBR(Primary-backup Replication)技術與EC(Erasure Coding)相結合來進行資料的容錯處理,提高了記憶體的利用率。

3.NVM在記憶體計算方面的嘗試

許多研究者注意到了NVM可能會對現有的計算機體系產生深遠的革命性的影響,並試圖做一些基於NVM的設計研發工作,我最近所瞭解的大多是應用層級的改良操作。比如將KV-Store(一種雜湊表資料儲存資料庫)實現在NVM或者DRAM/NVM混合記憶體中,將典型的in-memory database 結合NVM保證資料持久儲存等。接下來重點挑幾篇論文介紹一下研究者們的工作進展。

Exploring Storage Class Memory with Key Value Stores是一篇2013年的論文,是據我所知(也是據該專案研究者所知)第一個將KV-Store引入DRAM/SCM—Disk等級結構的研究。他們提出了一個叫做Echo的KV-Store系統,利用了SCM的非易失與可位元組定址的特性。那麼,如何才能使DRAM與SCM珠聯璧合,發揮各自最大的優勢呢?該研究的核心思想是計算操作與持久儲存操作的分離,如下圖所示:
這裡寫圖片描述
get操作和set操作都由Worker thread來處理,分散的KV資料就存在DRAM中的Local store結構中,當一個(或一組特定的)操作完成時,便可以通過Commit來提交當前操作造成的變化給Master thread所管理的Master store。注意,Master store儲存持久的資料,它位於SCM,並且負責多版本的資料管理;而每個不同的Local store之間資料是相互獨立的,它們必須通過Master store中儲存的持久資料來保持總的同步認知。作者對於引入SCM後的種種設計,如持久記憶體使用API,版本與儲存管理,失敗恢復模型,一致性模型,都或詳或略地做了比較清晰的介紹。
總體來講,這篇文章對我還是相當有啟發的。比如,在一致性問題的探討上,Echo依賴的是snapshot,如果替換成timestamp就可以節省相當大的開銷;在版本管理和回退方面,作者並沒有深入探討,我認為可以借鑑git使用的類指標標號管理機制,而且允許對不同版本的資料進行讀寫操作,分別更新至不同的下一版本(不同分支)。若是能引入branch merge操作,對於KV-Store資料版本化管理就可以更加強大和完善,而且切換速度非常快,沒有造成多餘的開銷。而且SCM具有大容量的優點,因此存檔多個數據版本並不會造成太高的記憶體消耗。或者,換一種思路,使用in-place update(原地更新)的方式是一種更加迅速的KV-store更新操作,可以擴充套件該系統的功能,使之可插拔(既能管理多版本,又能支援原地更新即覆蓋上一版本的資料內容)。在故障恢復方面需要再細緻考慮cache line操作的資料是否真正被持久儲存,以及重啟機器後利用對映機制快速定位到系統崩潰前的資料存放位置區,以恢復被打斷的任務處理過程。其他思考點其實還在於如何在保證可靠性的前提性再儘可能提高整個系統的執行效率,這才是最後比拼效能時必須面對的實際問題。

Let’s Talk About Storage & Recovery Methods for Non-Volatile Memory Database Systems這篇論文深刻而細緻地討論了將資料庫系統移植到NVM上所面臨的儲存與恢復問題,並對比了三種方式下(in-place update with logging, copy-on-write without logging, log-structured updates)NVM資料庫系統的效能表現。