陳 娟 胡慶達(dá) 陳游旻 陸游游 舒繼武 楊曉輝
1(東南大學(xué)信息科學(xué)與工程學(xué)院 南京 210093) 2 (清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系 北京 100084) (chenmj09@163.com)
近年來(lái),新型非易失性存儲(chǔ)器(non volatile memory, NVM)吸引了學(xué)術(shù)界和工業(yè)界的廣泛關(guān)注.典型的非易失存儲(chǔ)器包括PCM[1-2],STTRAM[3-4],ReRAM[5]和3D XPoint[6],其不僅具有接近傳統(tǒng)內(nèi)存材料隨機(jī)訪問(wèn)存儲(chǔ)器(dynamic random access memory,DRAM)的隨機(jī)訪問(wèn)性能,而且在內(nèi)存層次提供了數(shù)據(jù)持久性的保證.因此,基于NVM的持久性?xún)?nèi)存打破了傳統(tǒng)易失性?xún)?nèi)存和持久性外存之間的界限,為設(shè)計(jì)更加高效的存儲(chǔ)系統(tǒng)提供了新的機(jī)遇.
雖然持久性?xún)?nèi)存保證了數(shù)據(jù)的持久性,然而,CPU緩存依然是易失性的,并且會(huì)打亂數(shù)據(jù)寫(xiě)回到持久性?xún)?nèi)存的順序,這導(dǎo)致持久性?xún)?nèi)存上的數(shù)據(jù)在系統(tǒng)突然崩潰時(shí)可能處于不一致的中間狀態(tài).為解決此問(wèn)題和充分發(fā)揮出持久性?xún)?nèi)存良好的性能優(yōu)勢(shì),研究者們提出了持久性事務(wù)內(nèi)存系統(tǒng).這些系統(tǒng)通過(guò)日志機(jī)制保證事務(wù)的原子性和一致性.其中,Mnemosyne[7]和NVML[8]分別是基于redo log和undo log日志機(jī)制的代表性事務(wù)內(nèi)存系統(tǒng).在更新原數(shù)據(jù)前,系統(tǒng)分別先將新/舊數(shù)據(jù)持久化到日志中,從而在系統(tǒng)崩潰時(shí)根據(jù)日志中存在的數(shù)據(jù)副本將其恢復(fù)到一致性的狀態(tài).這些事務(wù)系統(tǒng)不僅為應(yīng)用程序訪問(wèn)持久性?xún)?nèi)存提供數(shù)據(jù)一致性的保證,而且可以通過(guò)用戶(hù)態(tài)接口直接訪問(wèn)持久性?xún)?nèi)存上的數(shù)據(jù),降低持久化操作的軟件延遲.
雖然持久性?xún)?nèi)存具有集成度高、靜態(tài)能耗低和數(shù)據(jù)持久性等優(yōu)勢(shì),但其也存在一定的局限性.首先,持久性?xún)?nèi)存往往具有讀寫(xiě)不對(duì)稱(chēng)性,寫(xiě)延遲遠(yuǎn)高于讀延遲.例如PCM的讀延遲與DRAM相似,而寫(xiě)延遲幾乎是DRAM的10倍[3].此外,持久性?xún)?nèi)存還具有耐久性的問(wèn)題.例如PCM只能承受住106~108次寫(xiě)操作[9-10],STT-RAM雖然在理論上具有較高的耐久性,但在實(shí)際測(cè)試中發(fā)現(xiàn),其最多也只能承受1012次寫(xiě)操作,無(wú)法達(dá)到理論中的期望值[9,11].因此,如何減少對(duì)持久性?xún)?nèi)存的寫(xiě)操作,從而減輕寫(xiě)操作帶來(lái)的延遲和磨損是持久性事務(wù)內(nèi)存系統(tǒng)中亟待解決的重要問(wèn)題.
然而,本文發(fā)現(xiàn)現(xiàn)有持久性事務(wù)內(nèi)存系統(tǒng)的日志機(jī)制帶來(lái)了過(guò)多的寫(xiě)操作,主要有2個(gè)方面原因:
1) 現(xiàn)有系統(tǒng)沒(méi)有區(qū)分事務(wù)中不同類(lèi)型的寫(xiě)操作,即無(wú)論是對(duì)內(nèi)存中已有數(shù)據(jù)的更新操作還是向事務(wù)中新分配區(qū)域添加數(shù)據(jù)的寫(xiě)操作(本文稱(chēng)之為分配操作),現(xiàn)有系統(tǒng)都利用相同的日志機(jī)制保證數(shù)據(jù)的一致性.然而日志操作不僅加快持久性?xún)?nèi)存設(shè)備的磨損速度,而且還需要使用CLFLUSH等指令對(duì)緩存中的數(shù)據(jù)進(jìn)行強(qiáng)制刷新,增加事務(wù)的延遲[12],造成系統(tǒng)性能的下降.
本文發(fā)現(xiàn)redo log和undo log這2種日志機(jī)制都只是用于保證被更新的舊數(shù)據(jù)在系統(tǒng)崩潰時(shí)存在一個(gè)可恢復(fù)的數(shù)據(jù)副本.對(duì)于第1次寫(xiě)入的新數(shù)據(jù),不需要依賴(lài)日志機(jī)制來(lái)保證數(shù)據(jù)的一致性,因此這部分日志開(kāi)銷(xiāo)可以被消除.
2) 現(xiàn)有系統(tǒng)使用相同的數(shù)據(jù)類(lèi)型(通常是64 b整型)將更新操作的地址和數(shù)據(jù)等字段完整地持久化到日志中,即使這些字段存儲(chǔ)的數(shù)據(jù)通??梢杂酶〉膬?nèi)存空間存儲(chǔ).這會(huì)產(chǎn)生大量的日志寫(xiě)操作,嚴(yán)重加快持久性?xún)?nèi)存設(shè)備的磨損速度.
本文發(fā)現(xiàn)日志操作中大部分?jǐn)?shù)據(jù)可以通過(guò)壓縮算法減少寫(xiě)入的日志數(shù)據(jù)總量.這種優(yōu)化策略不僅可以保留原有數(shù)據(jù)的副本,而且能夠減小對(duì)持久性?xún)?nèi)存的寫(xiě)磨損.此外,因?yàn)槌讼到y(tǒng)崩潰后的恢復(fù)過(guò)程,系統(tǒng)不會(huì)再次訪問(wèn)已經(jīng)寫(xiě)入的日志數(shù)據(jù),所以壓縮操作對(duì)事務(wù)性能的影響可處在一個(gè)可控的范圍之內(nèi).
針對(duì)上述2個(gè)方面的問(wèn)題,本文分別提出分配操作感知的日志優(yōu)化策略(allocation-aware log optimization, AALO)和基于壓縮算法的日志優(yōu)化策略(compression-based log optimization, CBLO).AALO動(dòng)態(tài)識(shí)別出事務(wù)中不同類(lèi)型的寫(xiě)操作,并分別使用不同的日志機(jī)制保證所有寫(xiě)操作的一致性,避免分配操作產(chǎn)生的日志開(kāi)銷(xiāo);CBLO在將新數(shù)據(jù)寫(xiě)入日志時(shí),利用zigzag壓縮算法[13]對(duì)日志數(shù)據(jù)進(jìn)行壓縮,進(jìn)一步減少日志操作的寫(xiě)開(kāi)銷(xiāo).
本文結(jié)合上述2種優(yōu)化策略,設(shè)計(jì)并實(shí)現(xiàn)基于微日志的持久性事務(wù)內(nèi)存(a tiny-log based persistent transactional memory, TLPTM)系統(tǒng).測(cè)試結(jié)果表明:相比于Mnemosyne,TLPTM系統(tǒng)具有更高的耐久度,其將日志的數(shù)據(jù)總量降低70%~81%,從而更好地提升持久性?xún)?nèi)存系統(tǒng)的耐久性.
為保證系統(tǒng)發(fā)生故障后能夠恢復(fù)到一致性的狀態(tài),現(xiàn)有的持久性事務(wù)內(nèi)存系統(tǒng)通常采用基于redo log或者undo log的日志機(jī)制.例如Mnemosyne[7]和BPPM[14-15]是基于redo log的持久性事務(wù)內(nèi)存系統(tǒng),而NV-heap[16],NVML[8]和DCT[17]是基于undo log的持久性事務(wù)內(nèi)存系統(tǒng).Wan等人在文獻(xiàn)[18]中對(duì)undo log和redo log兩種日志機(jī)制在持久性事務(wù)內(nèi)存系統(tǒng)中的使用作了深入研究.這2種日志機(jī)制的主要區(qū)別在于:在將新數(shù)據(jù)寫(xiě)入持久性?xún)?nèi)存中的數(shù)據(jù)區(qū)之前,redo log先將新數(shù)據(jù)持久化到日志中,而undo log先將內(nèi)存中的原數(shù)據(jù)持久化到日志中.當(dāng)系統(tǒng)突然崩潰時(shí),對(duì)于那些已經(jīng)成功提交但未寫(xiě)入到數(shù)據(jù)區(qū)的事務(wù),基于redo log的事務(wù)系統(tǒng)使用日志區(qū)中的數(shù)據(jù)重做已經(jīng)提交的事務(wù),而基于undo log的事務(wù)系統(tǒng)使用日志區(qū)中的數(shù)據(jù)執(zhí)行回滾操作.無(wú)論是redo log還是undo log,兩者都是為了在系統(tǒng)突然崩潰時(shí),事務(wù)系統(tǒng)可以找到一個(gè)正確的數(shù)據(jù)版本,將數(shù)據(jù)恢復(fù)到一致性的狀態(tài).本節(jié)具體介紹近年來(lái)具有代表性的持久性事務(wù)內(nèi)存系統(tǒng).
NVML[8]是Intel公司開(kāi)發(fā)的基于undo log的持久性事務(wù)內(nèi)存系統(tǒng).對(duì)于事務(wù)中每一個(gè)寫(xiě)操作,NVML將對(duì)應(yīng)的舊數(shù)據(jù)持久化到日志中,然后再去修改原數(shù)據(jù).然而,持久性?xún)?nèi)存會(huì)將編程上的錯(cuò)誤(例如內(nèi)存泄露或者訪問(wèn)野指針等)永久性地保存下來(lái),即使在系統(tǒng)重啟后依然可能導(dǎo)致系統(tǒng)崩潰.Coburn等人設(shè)計(jì)了NV-heaps[16],提出了一套靈活健壯的編程模型,以幫助程序員減少編程過(guò)程中可能引入的錯(cuò)誤.
在基于undo log的事務(wù)系統(tǒng)中,每一次寫(xiě)操作需要先將舊數(shù)據(jù)持久化到日志中,然后才能修改原數(shù)據(jù)區(qū),這將導(dǎo)致頻繁的CLFLUSH操作,帶來(lái)過(guò)高的持久化延遲.Kolli等人設(shè)計(jì)了DCT[17],該設(shè)計(jì)通過(guò)硬件的方式減少持久化操作之間的順序依賴(lài)關(guān)系,從而充分發(fā)揮存儲(chǔ)系統(tǒng)的并發(fā)處理能力,減少持久化延遲對(duì)系統(tǒng)性能的影響.但是,DCT系統(tǒng)不可避免地引入了額外的硬件開(kāi)銷(xiāo).
基于redo log的事務(wù)系統(tǒng)在事務(wù)提交時(shí)才將數(shù)據(jù)持久化到日志中,從而有效地減少了事務(wù)的持久化操作,并且不需要額外的硬件開(kāi)銷(xiāo).Mnemosyne[7]是基于TinySTM[19]系統(tǒng)開(kāi)發(fā)的基于redo log的持久性事務(wù)內(nèi)存系統(tǒng),其主要事務(wù)流程如圖1所示.Mnemosyne在事務(wù)執(zhí)行過(guò)程中將所有更新數(shù)據(jù)緩存在易失性的寫(xiě)集合中.當(dāng)事務(wù)提交時(shí),系統(tǒng)首先將寫(xiě)集合中所有數(shù)據(jù)持久化到日志中,然后再將這些數(shù)據(jù)持久化到原數(shù)據(jù)區(qū).
Fig.1 The transaction mechanism process of Mnemosyne圖1 Mnemosyne的事務(wù)機(jī)制
Lu等人提出了BPPM[14-15],BPPM在完成日志操作后不需要將數(shù)據(jù)立即持久化到原數(shù)據(jù)區(qū),只有當(dāng)日志空間不足時(shí)才將數(shù)據(jù)持久化到原地址,從而有效地降低了事務(wù)的延遲.此外,BPPM還設(shè)計(jì)了模糊持久化技術(shù),該技術(shù)能夠區(qū)分出日志區(qū)中尚未提交的數(shù)據(jù),從而避免了在CPU緩存中維護(hù)多個(gè)數(shù)據(jù)副本的額外開(kāi)銷(xiāo).
Sun等人提出DP2[20],DP2技術(shù)區(qū)分出日志寫(xiě)入和數(shù)據(jù)寫(xiě)入,在日志寫(xiě)入時(shí)通過(guò)持久性屏障和減少日志的保存時(shí)間來(lái)降低寫(xiě)操作的延遲,DP2在一定程度上降低了事務(wù)的開(kāi)銷(xiāo),并且提高了持久性?xún)?nèi)存設(shè)備的使用壽命.
雖然上述工作在一定程度上提高了事務(wù)的性能,但是它們所使用的日志機(jī)制不可避免地引入了引言中所提到的2個(gè)問(wèn)題而帶來(lái)了額外的寫(xiě)開(kāi)銷(xiāo).
本文提出一種基于微日志的持久性事務(wù)內(nèi)存系統(tǒng).圖2描述TLPTM的架構(gòu)圖.本文使用支持DAX[8]功能的文件系統(tǒng)PMFS[21],通過(guò)內(nèi)存映射文件的方式將持久性?xún)?nèi)存以用戶(hù)態(tài)的形式暴露給TLPTM,從而降低傳統(tǒng)持久化路徑的軟件棧開(kāi)銷(xiāo).上層應(yīng)用通過(guò)TLPTM的事務(wù)接口訪問(wèn)和更新持久性?xún)?nèi)存上的數(shù)據(jù).
Fig.2 Architecture of TLPTM圖2 TLPTM架構(gòu)圖
由于TLPTM是通過(guò)內(nèi)存映射文件的方式從非易失主存中獲取一塊內(nèi)存區(qū)間,然后在用戶(hù)態(tài)保護(hù)程序在這塊內(nèi)存空間上的數(shù)據(jù)一致性,因此TLPTM只保證程序級(jí)別的一致性.而內(nèi)存映射文件所涉及到的文件的一致性由文件系統(tǒng)保證,例如PMFS,HiNFS[22]、支持DAX功能的EXT4文件系統(tǒng)等.
TLPTM主要包含3個(gè)模塊:
1) 日志模塊.第1節(jié)提到,因?yàn)閡ndo log導(dǎo)致了頻繁的持久化操作,所以日志模塊采用了基于redo log的日志機(jī)制,在事務(wù)執(zhí)行過(guò)程中先將新數(shù)據(jù)維持在易失性的寫(xiě)集合中,只有在事務(wù)提交時(shí)會(huì)觸發(fā)持久化操作.此外,TLPTM利用CLFLUSH等軟件指令保證持久化操作的順序性.
2) 并發(fā)控制模塊.在事務(wù)執(zhí)行過(guò)程中,任何2個(gè)事務(wù)可能同時(shí)更新同一個(gè)數(shù)據(jù),TLPTM利用并發(fā)控制模塊解決事務(wù)間的沖突.通過(guò)日志模塊和并發(fā)控制模塊,TLPTM保證了事務(wù)的ACID特性.
3) 內(nèi)存管理模塊.TLPTM通過(guò)文件系統(tǒng)的mmap接口,將持久性?xún)?nèi)存區(qū)域映射到進(jìn)程某個(gè)固定的虛擬地址,然后利用內(nèi)存管理模塊管理映射出的內(nèi)存區(qū)域,保證內(nèi)存分配/釋放操作的持久性和一致性.
為了解決引言中提到的2個(gè)問(wèn)題,TLPTM在日志模塊中設(shè)計(jì)了分配操作感知的日志優(yōu)化策略AALO和基于壓縮算法的日志優(yōu)化策略CBLO.AALO在事務(wù)運(yùn)行過(guò)程中區(qū)分出內(nèi)存更新操作和分配操作.對(duì)于分配操作,繞開(kāi)了日志操作,直接將新數(shù)據(jù)寫(xiě)到新分配到的地址上,減少了分配操作的日志開(kāi)銷(xiāo).CBLO在將日志數(shù)據(jù)寫(xiě)入到持久性?xún)?nèi)存前,先利用壓縮算法對(duì)日志數(shù)據(jù)進(jìn)行壓縮,減少寫(xiě)入日志的數(shù)據(jù)大小,從而減少對(duì)持久性?xún)?nèi)存設(shè)備的寫(xiě)磨損.
本節(jié)首先介紹2個(gè)關(guān)鍵日志優(yōu)化策略AALO和CBLO,然后介紹基于上述優(yōu)化策略的TLPTM系統(tǒng)的事務(wù)機(jī)制.
事務(wù)的寫(xiě)操作主要包含2個(gè)類(lèi)型:對(duì)持久性?xún)?nèi)存中已有數(shù)據(jù)的更新操作;向事務(wù)中新分配區(qū)域添加數(shù)據(jù)的分配操作.在現(xiàn)有的持久性事務(wù)內(nèi)存系統(tǒng)中,無(wú)論是更新操作還是分配操作產(chǎn)生的新數(shù)據(jù),都采用的是相同的日志機(jī)制,即將新/舊數(shù)據(jù)先寫(xiě)入到日志中,再寫(xiě)入到原數(shù)據(jù)區(qū).
對(duì)于更新操作,系統(tǒng)需要利用日志機(jī)制保證其崩潰時(shí)存在可恢復(fù)的數(shù)據(jù)副本.然而對(duì)于分配操作,系統(tǒng)只需要將新數(shù)據(jù)直接寫(xiě)入到新分配的數(shù)據(jù)地址,并不需要提前寫(xiě)日志的操作,因?yàn)檫@部分?jǐn)?shù)據(jù)之前在系統(tǒng)中并不存在,即使系統(tǒng)在事務(wù)提交前突然崩潰,也不會(huì)影響其一致性狀態(tài).
因此,TLPTM設(shè)計(jì)了分配操作感知的日志優(yōu)化策略AALO.在事務(wù)執(zhí)行過(guò)程中,AALO區(qū)分出分配操作和更新操作.當(dāng)應(yīng)用在事務(wù)中新分配某塊持久性?xún)?nèi)存區(qū)域時(shí),TLPTM記錄下新分配的數(shù)據(jù)區(qū)域地址.當(dāng)事務(wù)中有寫(xiě)操作發(fā)生時(shí),TLPTM根據(jù)事務(wù)中新分配的數(shù)據(jù)區(qū)域地址,判斷出每個(gè)寫(xiě)操作是否落在新分配的數(shù)據(jù)區(qū)域中,如果是,則說(shuō)明當(dāng)前操作是分配操作,否則就判定其為更新操作.
然后,TLPTM根據(jù)寫(xiě)操作類(lèi)型的不同,使用不同的日志機(jī)制來(lái)保證事務(wù)的一致性;當(dāng)事務(wù)中的寫(xiě)操作是對(duì)內(nèi)存中已有數(shù)據(jù)作修改時(shí),TLPTM使用redo log保證數(shù)據(jù)的一致性.而當(dāng)事務(wù)中的寫(xiě)操作是向該事務(wù)新分配的區(qū)域添加數(shù)據(jù)時(shí),TLPTM直接在事務(wù)提交時(shí)將數(shù)據(jù)持久化到新分配的數(shù)據(jù)區(qū).因此,TLPTM消除了分配操作帶來(lái)的日志開(kāi)銷(xiāo).
本文觀察到日志數(shù)據(jù)往往具有如下特點(diǎn):對(duì)于每個(gè)寫(xiě)操作,日志中記錄的信息主要包含3個(gè)字段,即該操作更新的內(nèi)存地址addr、新數(shù)據(jù)value以及掩碼mask,它們都是8 B的整型數(shù)據(jù).現(xiàn)有系統(tǒng)將這8 B的數(shù)據(jù)完整地持久化到日志中,即使這些字段存儲(chǔ)的數(shù)據(jù)通常可以用更小的數(shù)據(jù)類(lèi)型表示.因此,TLPTM設(shè)計(jì)了基于壓縮算法的日志優(yōu)化策略CBLO,該策略將日志數(shù)據(jù)進(jìn)行壓縮以減少寫(xiě)入的日志數(shù)據(jù)總量,在保證原有數(shù)據(jù)副本的同時(shí)減少對(duì)持久性?xún)?nèi)存的寫(xiě)操作.CBLO采用zigzag壓縮算法[13],使用該壓縮算法的原因主要有2個(gè):①日志中記錄的數(shù)據(jù)類(lèi)型都是64 b的整型數(shù)據(jù),而zigzag算法十分適合整型數(shù)據(jù)的壓縮;②因?yàn)槿罩緮?shù)據(jù)中addr和mask等字段在大多數(shù)情況下數(shù)值大小比較固定且數(shù)值較小,而zigzag算法對(duì)于小整數(shù)的壓縮效果尤其明顯.
zigzag算法的基本思想是:將有符號(hào)的數(shù)字映射為無(wú)符號(hào)的數(shù)字,其以一種在正整數(shù)與負(fù)整數(shù)之間來(lái)回交錯(cuò)的方式進(jìn)行,絕對(duì)值小的數(shù)字經(jīng)zigzag壓縮編碼后,無(wú)論正負(fù)都可以只使用較少的字節(jié)數(shù)來(lái)表示.
在具體實(shí)現(xiàn)中,當(dāng)系統(tǒng)執(zhí)行寫(xiě)日志操作時(shí),TLPTM利用zigzag算法對(duì)所有需要持久化到日志中的數(shù)據(jù)進(jìn)行重新編碼,將其表示成比特位信息中具有更多前導(dǎo)0的另一個(gè)整數(shù).當(dāng)存儲(chǔ)該數(shù)據(jù)的內(nèi)存空間有若干個(gè)字節(jié)的比特位信息都為0時(shí),zigzag算法會(huì)盡可能將這些字節(jié)丟棄,用更小的內(nèi)存空間存儲(chǔ)剩余的字節(jié)信息,最后持久化到內(nèi)存中的日志區(qū).由此就達(dá)到了將日志數(shù)據(jù)進(jìn)行壓縮的目的.日志數(shù)據(jù)經(jīng)壓縮后,有效地減少了日志操作的數(shù)據(jù)總量,從而提高了持久性?xún)?nèi)存設(shè)備的耐久性.
值得注意的是,由于本設(shè)計(jì)在日志寫(xiě)入的過(guò)程中引入了壓縮算法,這不可避免地引入了一定的延遲.因?yàn)樵趯?duì)數(shù)據(jù)進(jìn)行壓縮的過(guò)程中,使用的是一個(gè)循環(huán)結(jié)構(gòu),該循環(huán)結(jié)構(gòu)的作用就是將數(shù)據(jù)的比特位信息中存在1的字節(jié)提取出來(lái),當(dāng)數(shù)據(jù)經(jīng)zigzag進(jìn)行編碼后的比特位信息中具有較多的1時(shí),該循環(huán)的運(yùn)行時(shí)間就會(huì)越長(zhǎng),因此相應(yīng)地會(huì)增加程序的運(yùn)行時(shí)間.但由于日志數(shù)據(jù)一般只有在系統(tǒng)突然崩潰后需要做故障恢復(fù)的情況下才會(huì)被訪問(wèn),壓縮后的數(shù)據(jù)通常不需要反復(fù)的解壓縮/壓縮過(guò)程,所以壓縮算法所帶來(lái)的延遲處在一個(gè)可控的范圍之內(nèi).此外,持久性?xún)?nèi)存具有讀寫(xiě)不對(duì)稱(chēng)性,壓縮算法能夠有效降低寫(xiě)入數(shù)據(jù)的總量,這在一定程度上也降低了事務(wù)的平均延遲.這部分的影響會(huì)在第4節(jié)實(shí)驗(yàn)部分給出進(jìn)一步的驗(yàn)證.
3.3.1 事務(wù)接口
TLPTM利用GCC事務(wù)編譯器[23]向傳統(tǒng)C/C++代碼加入了事務(wù)語(yǔ)義,通過(guò)關(guān)鍵字__tm_atomic和一組花括號(hào)定義事務(wù)的范圍,保證這段代碼的ACID特性.事務(wù)范圍內(nèi)的內(nèi)存訪問(wèn)操作會(huì)被GCC事務(wù)編譯器捕獲,TLPTM利用TinySTM替換了事務(wù)中的內(nèi)存訪問(wèn)操作.在事務(wù)執(zhí)行過(guò)程中,TLPTM將所有更新操作記錄在一個(gè)易失性的寫(xiě)集合中.當(dāng)事務(wù)提交時(shí),通過(guò)redo log日志機(jī)制,將寫(xiě)集合中的寫(xiě)操作備份到日志中,并調(diào)用持久化模塊保證日志操作的持久性.最后,TLPTM將新數(shù)據(jù)持久化到原數(shù)據(jù)區(qū).此外,TLPTM利用TinySTM的鎖機(jī)制保證了事務(wù)的并發(fā)控制,從而實(shí)現(xiàn)了并發(fā)控制模塊,這部分的細(xì)節(jié)介紹可參考之前的研究工作[19].
3.3.2 日志模塊
當(dāng)事務(wù)提交時(shí),TLPTM利用軟件指令對(duì)日志操作和原數(shù)據(jù)寫(xiě)回操作進(jìn)行持久化.因?yàn)槿罩緮?shù)據(jù)只有在系統(tǒng)崩潰時(shí)才會(huì)被訪問(wèn),所以TLPTM利用MOVNT指令繞開(kāi)了CPU緩存,將日志數(shù)據(jù)直接持久化到持久性?xún)?nèi)存上,避免了對(duì)CPU緩存的干擾.此外,TLPTM利用MFENCE指令,確保在執(zhí)行原數(shù)據(jù)修改前將所有日志操作進(jìn)行持久化.對(duì)于原數(shù)據(jù)寫(xiě)回操作,TLPTM利用CLFLUSH指令保證所有寫(xiě)操作的持久性.此外,日志模塊設(shè)計(jì)了2種優(yōu)化策略AALO和CBLO,解決了引言中提到的現(xiàn)有系統(tǒng)存在的2個(gè)問(wèn)題.
3.3.3 內(nèi)存管理模塊
內(nèi)存管理模塊是基于易失性?xún)?nèi)存分配器Hoard[24]實(shí)現(xiàn)的.Hoard最初是針對(duì)多線程場(chǎng)景設(shè)計(jì)的,其按照超級(jí)塊的粒度(例如16KB)對(duì)傳統(tǒng)內(nèi)存進(jìn)行切割.為了減少多線程間的沖突,Hoard同時(shí)維護(hù)了全局的超級(jí)塊池和線程局部的超級(jí)塊池,線程只有在局部超級(jí)塊池的空間耗盡時(shí),才會(huì)向全局超級(jí)塊池申請(qǐng)新的超級(jí)塊,從而減少了多線程間的鎖沖突.對(duì)于每個(gè)超級(jí)塊,Hoard將其分成固定大小的內(nèi)存塊,滿(mǎn)足給定區(qū)間大小的分配操作.
然而,Hoard是基于傳統(tǒng)內(nèi)存設(shè)計(jì)的,無(wú)法保證分配操作的持久性和一致性.為了解決這個(gè)問(wèn)題,TLPTM在持久性?xún)?nèi)存的固定區(qū)域預(yù)留了每個(gè)超級(jí)塊的位圖(bitmap).位圖中每個(gè)比特位都表示了對(duì)應(yīng)超級(jí)塊中某個(gè)內(nèi)存塊的分配狀態(tài).此外,TLPTM利用事務(wù)接口,保證分配/釋放操作中位圖修改操作的持久性和一致性.
3.3.4 TLPTM的事務(wù)機(jī)制流程
圖3表示了基于AALO和CBLO的TLPTM系統(tǒng)的事務(wù)機(jī)制流程圖.TLPTM與基于redo log的傳統(tǒng)系統(tǒng)相比,主要有2點(diǎn)區(qū)別:1)TLPTM增加了一個(gè)寫(xiě)操作判斷,即判斷寫(xiě)操作是否是分配操作;2)TLPTM在執(zhí)行日志持久化操作前利用zigzag算法對(duì)其進(jìn)行了壓縮.
Fig.3 The transaction mechanism process of TLPTM圖3 TLPTM的事務(wù)機(jī)制
3.3.5 系統(tǒng)恢復(fù)
當(dāng)系統(tǒng)突然崩潰時(shí),TLPTM需要將系統(tǒng)恢復(fù)到崩潰前的一致性狀態(tài).首先,TLPTM通過(guò)文件系統(tǒng)的mmap接口,將持久性?xún)?nèi)存區(qū)域映射到某個(gè)固定的虛擬地址.其次,根據(jù)超級(jí)塊中的位圖信息重建內(nèi)存管理模塊的數(shù)據(jù)結(jié)構(gòu).最后,根據(jù)日志數(shù)據(jù)中的信息,重做已經(jīng)提交的事務(wù),丟棄未完成的事務(wù),由此完成整個(gè)系統(tǒng)的恢復(fù)過(guò)程.
為了分析評(píng)價(jià)TLPTM的性能和耐久性,本節(jié)的實(shí)驗(yàn)將從3個(gè)方面對(duì)TLPTM進(jìn)行測(cè)試與評(píng)價(jià):
1) 對(duì)比測(cè)試分配操作感知的日志優(yōu)化策略AALO的性能和耐久性;
2) 對(duì)比測(cè)試基于壓縮算法的日志優(yōu)化策略CBLO的耐久性;
3) 對(duì)比測(cè)試Mnemosyne和TLPTM的性能和耐久性.
本文所有實(shí)驗(yàn)均基于同一臺(tái)Linux服務(wù)器,內(nèi)核版本為4.4.16,處理器型號(hào)為Intel?Xeon?CPU E5-2680 v3,共包含4個(gè)物理核心.此外,服務(wù)器還配置了32 GB的內(nèi)存和1 TB的硬盤(pán).實(shí)驗(yàn)配置環(huán)境如表1所示:
Table 1 Experiment Configuration表1 實(shí)驗(yàn)環(huán)境配置
本文使用Mnemosyne[7]中的Hash表作為實(shí)驗(yàn)的測(cè)試程序,并將每個(gè)事務(wù)中產(chǎn)生的日志數(shù)據(jù)的平均字節(jié)數(shù)和事務(wù)平均延遲作為系統(tǒng)在可靠性和性能的評(píng)價(jià)標(biāo)準(zhǔn).實(shí)驗(yàn)中使用3種不同的負(fù)載來(lái)評(píng)估TLPTM的性能和耐久性.其中,Workloada被設(shè)置為在Hash表中全部執(zhí)行分配操作,Workloadb的場(chǎng)景是在Hash表中執(zhí)行分配操作和更新操作的比例均為50%,Workloadc被設(shè)置為在Hash表中全部執(zhí)行更新操作.表2中列出了這3種負(fù)載的特點(diǎn).
Table 2 Workload Features表2 負(fù)載的特點(diǎn)
雖然持久性?xún)?nèi)存相關(guān)技術(shù)發(fā)展十分迅速,但是目前大多數(shù)研究還只是集中在設(shè)備級(jí)別,對(duì)系統(tǒng)級(jí)別的研究仍面臨著缺少真實(shí)的NVM設(shè)備的境況.因此,大多數(shù)研究不具備在真實(shí)NVM存儲(chǔ)環(huán)境下驗(yàn)證上層軟件技術(shù)有效性的條件,而構(gòu)建NVM模擬器或模擬平臺(tái)是解決上述問(wèn)題的有效途徑[11].本文使用與Mnemosyne[7]類(lèi)似的持久性?xún)?nèi)存模擬方法,即將普通內(nèi)存劃分為常規(guī)的易失性?xún)?nèi)存和模擬的非易失內(nèi)存.默認(rèn)情況下,本實(shí)驗(yàn)使用CPU提供的RDTSC指令將模擬延遲設(shè)置為500 ns.因?yàn)镸nemosyne和TLPTM都是基于TinySTM[19]和redo log實(shí)現(xiàn)的持久性事務(wù)內(nèi)存系統(tǒng),本文主要以Mnemosyne作為比較系統(tǒng),從而保證了系統(tǒng)對(duì)比的公平性.
本節(jié)實(shí)驗(yàn)將使用了AALO的系統(tǒng)與Mnemosyne進(jìn)行對(duì)比,驗(yàn)證了分配操作感知的日志優(yōu)化策略對(duì)持久性事務(wù)內(nèi)存系統(tǒng)的可靠性和性能方面的影響.
4.2.1 耐久性測(cè)試
日志寫(xiě)入量的測(cè)試結(jié)果如圖4所示,除負(fù)載c外,AALO將每個(gè)事務(wù)日志操作產(chǎn)生的平均字節(jié)修改數(shù)降低了54%~64%.負(fù)載a理論上更契合于本文提出的分配操作感知的優(yōu)化策略,因?yàn)樨?fù)載a連續(xù)地向Hash表中插入新的鍵值對(duì),這會(huì)導(dǎo)致頻繁地調(diào)用內(nèi)存分配函數(shù),由于是向內(nèi)存中添加新數(shù)據(jù),該操作不需要通過(guò)日志操作來(lái)保證一致性.但是,隨著插入操作所占比例的增加,每個(gè)事務(wù)的日志操作產(chǎn)生的平均字節(jié)修改數(shù)也隨之增加,這是因?yàn)閮?nèi)存分配信息也會(huì)保留在日志中,因而出現(xiàn)圖4中所示的結(jié)果.
Fig.4 Comparison of log size between Mnemosyne and AALO圖4 Mnemosyne和AALO日志寫(xiě)入量的對(duì)比
由于負(fù)載c中每次操作都是更新哈希表中已有的鍵值對(duì),而本文提出的分配操作感知的優(yōu)化策略只對(duì)分配操作有效,因此對(duì)耐久性的提升并不明顯.
4.2.2 性能測(cè)試
在3種工作負(fù)載下,本節(jié)分別測(cè)試了AALO對(duì)持久性?xún)?nèi)存系統(tǒng)的性能影響,其與Mnemosyne的延遲對(duì)比如圖5所示,除負(fù)載c外,AALO將寫(xiě)入延遲降低了15%~24%.由于負(fù)載a受到頻繁的內(nèi)存分配操作帶來(lái)的影響,所以其性能要略差于其他負(fù)載.由于負(fù)載c全部都是更新操作,因此2個(gè)系統(tǒng)的性能基本相似.
Fig.5 Comparison of latency between transaction mechanisms圖5 事務(wù)機(jī)制的延遲對(duì)比
由此可知,分配操作感知的日志優(yōu)化策略不僅減少了每個(gè)事務(wù)的寫(xiě)磨損,而且也降低了日志操作引入的持久化延遲.
本節(jié)實(shí)驗(yàn)將使用CBLO的系統(tǒng)與Mnemosyne進(jìn)行對(duì)比,驗(yàn)證了基于壓縮算法的日志優(yōu)化策略對(duì)持久性事務(wù)內(nèi)存系統(tǒng)可靠性方面的影響.實(shí)驗(yàn)結(jié)果如圖6所示,從圖6中可以看出,使用了CBLO的系統(tǒng)中日志操作的平均字節(jié)修改數(shù)比Mnemosyne減少了61%~70%.磨損大大降低的原因在于,日志操作的所有字段都是64 b的整型數(shù)據(jù).首先,考慮字段addr和mask,當(dāng)?shù)刂穉ddr是9 b數(shù)的整型數(shù)字時(shí),經(jīng)zigzag壓縮編碼后,只需要使用5 B進(jìn)行存儲(chǔ);而mask在多數(shù)情況下為-1,經(jīng)壓縮編碼后,只占用1 B.而value字段是由應(yīng)用程序決定的,當(dāng)傳入的value較小時(shí)也能獲得良好的壓縮率.因此,相比于Mnemosyne,CBLO大大減少了持久性?xún)?nèi)存系統(tǒng)的日志寫(xiě)入量.
Fig.6 Comparison of log size between Mnemosyne and CBLO圖6 Mnemosyne和CBLO日志寫(xiě)入量的對(duì)比
此外,壓縮算法不可避免地增加了日志操作的延遲,但是因?yàn)槿罩緮?shù)據(jù)只有在系統(tǒng)恢復(fù)時(shí)才會(huì)被訪問(wèn)到,所以壓縮算法產(chǎn)生的開(kāi)銷(xiāo)可以接受.本文將在4.4節(jié)中討論基于2種優(yōu)化策略的TLPTM的性能效果.
本節(jié)實(shí)驗(yàn)將基于2種優(yōu)化策略的TLPTM與Mnemosyne進(jìn)行對(duì)比,由此判斷TLPTM在性能和可靠性方面的效果.
4.4.1 耐久性測(cè)試
本實(shí)驗(yàn)比較了基于AALO與CBLO兩種優(yōu)化的TLPTM系統(tǒng)與Mnemosyne的耐久性.兩者產(chǎn)生的日志寫(xiě)入量對(duì)比如圖7所示.從圖7中看出,在不同的工作負(fù)載中,與Mnemosyne相比,TLPTM在耐久性上都有十分明顯的提升,除負(fù)載c外,TLPTM將日志的寫(xiě)入總量降低了79%~81%.因?yàn)樨?fù)載c不包含分配操作,AALO并沒(méi)有對(duì)其寫(xiě)磨損產(chǎn)生優(yōu)化效果,所以其耐久性的提升效果略低于其他2種工作負(fù)載,但其憑借CBLO的優(yōu)化依然達(dá)到了70%的耐久性提升.
Fig.7 Comparison of log size between Mnemosyne and TLPTM圖7 Mnemosyne與TLPTM產(chǎn)生日志數(shù)據(jù)的大小對(duì)比
Fig.8 Comparison of latency between TLPTM and Mnemosyne transaction mechanisms圖8 TLPTM與Mnemosyne事務(wù)機(jī)制的延遲對(duì)比
4.4.2 性能測(cè)試
本節(jié)實(shí)驗(yàn)測(cè)試TLPTM與Mnemosyne的性能對(duì)比,結(jié)果如圖8所示,相比于4.2.2節(jié)中的實(shí)驗(yàn)效果,基于2種優(yōu)化的TLPTM系統(tǒng)的性能有所降低,這說(shuō)明壓縮算法在降低日志操作產(chǎn)生的寫(xiě)磨損的同時(shí),帶來(lái)了一定的性能影響.因?yàn)樵趯?duì)數(shù)據(jù)進(jìn)行壓縮的過(guò)程中,使用的是一個(gè)循環(huán)結(jié)構(gòu),該循環(huán)結(jié)構(gòu)的作用就是將數(shù)據(jù)的比特位信息中存在1的字節(jié)全部提取出來(lái),當(dāng)數(shù)據(jù)經(jīng)zigzag進(jìn)行編碼后的比特位信息中具有較多的1時(shí),該循環(huán)的運(yùn)行時(shí)間就會(huì)越長(zhǎng),因此相應(yīng)地會(huì)增加程序的運(yùn)行時(shí)間,從而對(duì)系統(tǒng)性能造成一定影響.使用TLPTM系統(tǒng)的用戶(hù)可以根據(jù)自己的需求,選擇是否使用基于壓縮算法的日志優(yōu)化策略CBLO,從而獲得在性能或者可靠性方面的提升.
持久性?xún)?nèi)存因?yàn)榉且资?、靜態(tài)功耗低和集成度高等優(yōu)勢(shì),有望代替DRAM成為新的主存材料.研究人員設(shè)計(jì)了輕量級(jí)的持久性事務(wù)內(nèi)存系統(tǒng),用于保證持久性?xún)?nèi)存上更新操作的一致性.然而,持久性?xún)?nèi)存同時(shí)也存在著使用壽命有限和寫(xiě)延遲過(guò)高的局限性.現(xiàn)有的事務(wù)系統(tǒng)因?yàn)槿罩静僮饕腩~外的寫(xiě)操作,帶來(lái)嚴(yán)重的寫(xiě)延遲和寫(xiě)磨損等問(wèn)題.
為了解決這些問(wèn)題,本文提出了分配操作感知的日志優(yōu)化策略AALO和基于壓縮算法的日志優(yōu)化策略CBLO.結(jié)合這2種優(yōu)化策略,本文設(shè)計(jì)并實(shí)現(xiàn)了基于微日志的持久性事務(wù)內(nèi)存系統(tǒng)TLPTM.實(shí)驗(yàn)結(jié)果表明,與現(xiàn)有的事務(wù)系統(tǒng)Mnemosyne相比,本文提出的分配操作感知的優(yōu)化策略將事務(wù)的性能提升了15%~24%,基于上述2種優(yōu)化策略的TLPTM將日志的數(shù)據(jù)總量降低了70%~81%.