關(guān)于我們
書單推薦
新書推薦
|
持久內(nèi)存編程 本書介紹了持久內(nèi)存編程技術(shù)應(yīng)用前景,涵蓋持久內(nèi)存的操作系統(tǒng)和硬件要求,以及如何使用模擬和真實(shí)的持久內(nèi)存硬件創(chuàng)建開發(fā)環(huán)境。本書對持久內(nèi)存的基本概念進(jìn)行了解釋,介紹了面向 C、C++、JavaScript 和其他語言的持久內(nèi)存編程 API,探討了采用持久內(nèi)存的 RDMA,回顧了安全特性,并展示了許多示例。讀者可以在自己的系統(tǒng)上運(yùn)行本書提供的源代碼和示例。 適讀人群 :本書主要面向具有一定經(jīng)驗(yàn)的應(yīng)用程序開發(fā)人員,也適用于更廣泛的讀者,如系統(tǒng)管理員和架構(gòu)師、學(xué)生、講師,以及學(xué)術(shù)研究人員等。系統(tǒng)設(shè)計(jì)人員、內(nèi)核開發(fā)人員,以及任何對這項(xiàng) 全球首本持久內(nèi)存編程和應(yīng)用的系統(tǒng)方法指南,本書強(qiáng)調(diào)以工程實(shí)踐為導(dǎo)向,通過大量的示例,全方位介紹持久內(nèi)存架構(gòu)、硬件及操作系統(tǒng)支持的整體技術(shù)細(xì)節(jié),幫助開發(fā)人員了解持久內(nèi)存編程的核心概念以及持久內(nèi)存編程的開發(fā)庫。 持久內(nèi)存技術(shù)是內(nèi)存領(lǐng)域革命性的技術(shù)。從根本上顛覆傳統(tǒng)的內(nèi)存-存儲架構(gòu),對整個(gè)產(chǎn)業(yè)界和學(xué)術(shù)界產(chǎn)生了深遠(yuǎn)的影響。 無論是初學(xué)者,還是經(jīng)驗(yàn)豐富的程序員,都可以使用本書作為持久內(nèi)存編程的綜合指南,了解持久內(nèi)存對軟硬件的要求,以及持久內(nèi)存在提升性能、縮短應(yīng)用程序啟動時(shí)間方面的巨大潛力。 【讀者對象】 本書主要面向具有一定經(jīng)驗(yàn)的應(yīng)用程序開發(fā)人員,也適用于更廣泛的讀者,如系統(tǒng)管理員和架構(gòu)師、學(xué)生、講師,以及學(xué)術(shù)研究人員等。此外,系統(tǒng)設(shè)計(jì)人員、內(nèi)核開發(fā)人員,以及任何對這項(xiàng)新興技術(shù)感興趣的人都可以在本書中找到實(shí)用的內(nèi)容。 【關(guān)于本書】 持久內(nèi)存通常被稱為非易失性內(nèi)存(NVM)或存儲級內(nèi)存(SCM)。在本書中,特意將持久內(nèi)存作為一個(gè)包羅萬象的術(shù)語,指代當(dāng)前及未來所有與此相關(guān)的內(nèi)存技術(shù)。本書介紹持久內(nèi)存技術(shù),并對一些關(guān)鍵問題做出解答。 對于軟件開發(fā)人員,這些問題包括:什么是持久內(nèi)存?如何使用持久內(nèi)存?可以使用哪些API和庫?持久內(nèi)存能為應(yīng)用程序提供哪些優(yōu)勢?需要學(xué)習(xí)哪些新的編程方法?如何設(shè)計(jì)應(yīng)用程序以使用持久內(nèi)存?在哪里查找相關(guān)信息、文檔和幫助? 對于系統(tǒng)和云架構(gòu)師,這些問題包括:什么是持久內(nèi)存?持久內(nèi)存的工作原理是什么?持久內(nèi)存與DRAM或SSD/NVMe存儲設(shè)備相比有何不同?硬件和操作系統(tǒng)方面有哪些要求?哪些應(yīng)用程序需要或者可以從持久內(nèi)存中獲益?現(xiàn)有應(yīng)用程序在不經(jīng)修改的情況下可以使用持久內(nèi)存嗎? 對于軟件應(yīng)用程序而言,持久內(nèi)存不是一種即插即用的技術(shù)。盡管從外表看持久內(nèi)存與傳統(tǒng)DRAM內(nèi)存類似,但應(yīng)用程序必須進(jìn)行修改才能充分發(fā)揮持久內(nèi)存的持久特性。應(yīng)用程序在未經(jīng)修改的情況下也可以在安裝了持久內(nèi)存的系統(tǒng)上運(yùn)行,但是這樣無法發(fā)揮持久內(nèi)存的全部潛能。 慶幸的是,服務(wù)器和操作系統(tǒng)廠商在早期設(shè)計(jì)階段進(jìn)行了合作,并推出了許多相關(guān)產(chǎn)品。Linux和Microsoft Windows已經(jīng)可以原生支持持久內(nèi)存技術(shù)。許多常見的虛擬化技術(shù)也支持持久內(nèi)存。 然而,對于ISV和整個(gè)開發(fā)人員社區(qū)而言,針對持久內(nèi)存技術(shù)的開發(fā)之旅才剛剛起步。一些軟件已經(jīng)完成修改并進(jìn)入市場。但企業(yè)和云計(jì)算行業(yè)需要一段時(shí)間才能加以采用并推出相應(yīng)的硬件產(chǎn)品。ISV和軟件開發(fā)人員也需要時(shí)間了解現(xiàn)有應(yīng)用程序需要做出哪些更改,并實(shí)現(xiàn)它們。 本書假設(shè)你不了解持久內(nèi)存硬件設(shè)備或軟件開發(fā),并經(jīng)過了精心的編排設(shè)計(jì),你可以按照自己希望的順序隨意瀏覽本書內(nèi)容。盡管本書后面的內(nèi)容以之前章節(jié)中介紹的概念和知識為基礎(chǔ),但是也無須按順序閱讀所有章節(jié),同時(shí)為了方便起見,在內(nèi)容中添加了對于相關(guān)章節(jié)的引用,以便你學(xué)習(xí)或回憶相關(guān)知識。 【本書結(jié)構(gòu)】 本書共有19章,每章側(cè)重于介紹不同的主題。全書由三個(gè)主要部分組成。第1~4章介紹了持久內(nèi)存架構(gòu)、硬件和操作系統(tǒng)支持。第5~16章旨在幫助開發(fā)人員了解PMDK庫以及如何在應(yīng)用程序中使用這些庫。最后,第17~19章介紹了部分高級主題,比如RAS以及使用RDMA復(fù)制數(shù)據(jù)等。 第1章介紹持久內(nèi)存,并通過一個(gè)簡單的例子嘗試,這個(gè)例子使用libpmemkv來存儲持久鍵-值對。 第2章介紹持久內(nèi)存架構(gòu),并重點(diǎn)介紹開發(fā)人員應(yīng)知曉的硬件要求。 第3章介紹操作系統(tǒng)相關(guān)變更、新特性,以及操作系統(tǒng)如何發(fā)現(xiàn)持久內(nèi)存。 第4章以前3章的內(nèi)容為基礎(chǔ),介紹持久內(nèi)存編程的基本概念。 第5章介紹PMDK,即一套幫助軟件從業(yè)人員進(jìn)行開發(fā)的庫。 第6章介紹并展示如何使用PMDK的libpmem,即提供持久內(nèi)存支持的底層庫。 第7章使用PMDK的C原生對象存儲庫libpmemobj提供相關(guān)信息和示例。 第8章演示PMDK的C++ libpmemobj-cpp對象存儲,它是在libpmemobj之上用C++頭文件構(gòu)建而成的。 第9章通過示例詳細(xì)介紹第1章中提到的libpmemkv。 第10章主要面向希望充分利用持久內(nèi)存但不需要對數(shù)據(jù)進(jìn)行持久化存儲的讀者。libmemkind是構(gòu)建在jemalloc之上的用戶可擴(kuò)展堆管理器,支持控制內(nèi)存特性以及在不同類型的內(nèi)存之間對堆進(jìn)行分區(qū)。libvmemcache是一種可嵌入式輕量級內(nèi)存緩存解決方案,它可以通過高效、可擴(kuò)展的內(nèi)存映射充分利用大容量存儲,例如支持DAX(直接訪問)的持久內(nèi)存。 第11章詳細(xì)介紹如何設(shè)計(jì)適用于持久內(nèi)存的數(shù)據(jù)結(jié)構(gòu)。 第12章介紹持久內(nèi)存相關(guān)的工具,并舉例說明軟件開發(fā)人員如何調(diào)試支持持久內(nèi)存的應(yīng)用程序。 第13章探討如何修改實(shí)際應(yīng)用程序以使用持久內(nèi)存特性。 第14章介紹如何實(shí)現(xiàn)應(yīng)用程序中的并發(fā)性以便用于持久內(nèi)存。 第15章介紹性能的概念,并展示如何使用英特爾VTune工具套件在代碼更改前后對系統(tǒng)和應(yīng)用程序進(jìn)行分析。 第16章詳細(xì)介紹PMDK設(shè)計(jì)、架構(gòu)、算法和內(nèi)存分配器實(shí)現(xiàn)。 第17章介紹如何通過硬件和操作系統(tǒng)層實(shí)現(xiàn)可靠性、可用性與可服務(wù)性(RAS)。 第18章探討應(yīng)用程序如何使用本地和遠(yuǎn)程持久內(nèi)存在多個(gè)系統(tǒng)之間橫向擴(kuò)展。 第19章介紹非一致性內(nèi)存訪問(NUMA)、軟件卷管理器的使用、mmap()的MAP_SYNC標(biāo)記等高級主題。 附錄部分單獨(dú)提供了安裝PMDK的步驟以及管理持久內(nèi)存所需的程序,其中還介紹了Java更新和RDMA協(xié)議的未來。由于這些內(nèi)容還有不確定性,因此沒有將其列在本書的正文部分。 【目標(biāo)讀者】 本書主要面向具有一定經(jīng)驗(yàn)的應(yīng)用程序開發(fā)人員,同時(shí)我們也希望本書中的內(nèi)容適用于更廣泛的讀者,如系統(tǒng)管理員和架構(gòu)師、學(xué)生、講師,以及學(xué)術(shù)研究人員等。系統(tǒng)設(shè)計(jì)人員、內(nèi)核開發(fā)人員,以及任何對這項(xiàng)新興技術(shù)感興趣的人都可以在本書中找到實(shí)用的內(nèi)容。 每位讀者都將能夠了解持久內(nèi)存是什么、它的工作原理,以及操作系統(tǒng)和應(yīng)用程序如何利用持久內(nèi)存。持久內(nèi)存的配置和管理因廠商而異,因此我們在附錄中列出了部分參考資料,避免主要章節(jié)中的內(nèi)容過于復(fù)雜。 應(yīng)用程序開發(fā)人員可通過示例學(xué)習(xí)如何將持久內(nèi)存集成到現(xiàn)有應(yīng)用程序或新應(yīng)用程序中。我們將在整本書中使用PMDK中提供的各種庫,并提供大量的示例予以說明。本書也提供了使用各種編程語言(C、C++、JavaScript等)編寫的示例代碼。開發(fā)人員在自己的項(xiàng)目中可以自由地使用這些庫。本書還提供了大量的資源鏈接,確保讀者能夠獲得更多的幫助和信息。 系統(tǒng)管理員以及云、高性能計(jì)算和企業(yè)環(huán)境架構(gòu)師都可以參考本書中的大部分內(nèi)容,了解持久內(nèi)存的特性和優(yōu)勢,以便為應(yīng)用程序和開發(fā)人員提供支持。如果能夠在每臺物理服務(wù)器上部署更多虛擬機(jī),或者為應(yīng)用程序提供這種全新的內(nèi)存/存儲層,就可以讓更多數(shù)據(jù)更靠近CPU,或顯著縮短重啟時(shí)間,同時(shí)保持?jǐn)?shù)據(jù)的溫緩存(warm cache)。 學(xué)生、講師和學(xué)術(shù)研究人員也可以從本書的許多章節(jié)中受益。計(jì)算機(jī)科學(xué)專業(yè)的學(xué)生可以了解硬件、操作系統(tǒng)的特性以及編程技巧。講師可以在課堂上自由講授本書中的內(nèi)容,或?qū)⑵溆米飨嚓P(guān)研究項(xiàng)目的基礎(chǔ),比如新的持久內(nèi)存文件系統(tǒng)、算法或緩存實(shí)現(xiàn)等。 我們還介紹了各種用于分析服務(wù)器和應(yīng)用程序的工具,以便大家更好地了解CPU、內(nèi)存和磁盤IO訪問模式。通過此類知識,我們展示了如何修改應(yīng)用程序,以便通過PMDK獲得持久性優(yōu)勢。 【未來參考價(jià)值】 本書的內(nèi)容在未來多年都具備重要價(jià)值。除非規(guī)范中另有說明,ACPI、UEFI、SNIA非易失性編程模型等行業(yè)規(guī)范都會在新版本發(fā)布時(shí)保持向后兼容性。同時(shí)本書中介紹的編程方法也能夠適用于新的設(shè)備外形。本書不局限于某一家特定的持久內(nèi)存廠商或某一種實(shí)現(xiàn)方法。在需要描述特定于廠商的特性或?qū)崿F(xiàn)方法的地方,我們會特意指出,因?yàn)樵诓煌瑥S商或不同代產(chǎn)品之間可能會有差異。建議大家閱讀廠商關(guān)于持久內(nèi)存產(chǎn)品的文檔以了解更多信息。 使用PMDK的開發(fā)人員將獲得一個(gè)穩(wěn)定的API。PMDK將在每次主要版本更新時(shí)提供新的特性和性能改進(jìn),并隨著新的持久內(nèi)存產(chǎn)品、CPU指令、平臺設(shè)計(jì)、行業(yè)規(guī)范和操作系統(tǒng)特性支持的推出而不斷演變。 【源代碼示例】 本書中的概念和源代碼示例遵循廠商中立的SNIA非易失性內(nèi)存編程模型。SNIA是一個(gè)非營利性全球組織,致力于制定標(biāo)準(zhǔn)并提供相關(guān)的培訓(xùn),來推動存儲和信息技術(shù)的發(fā)展。該編程模型由SNIA NVM技術(shù)工作組(Technical Working Group,TWG)負(fù)責(zé)設(shè)計(jì)、開發(fā)與維護(hù),該工作組匯聚了多家領(lǐng)先的操作系統(tǒng)、硬件和服務(wù)器廠商。你可以從https://www.snia.org/forums/sssi/nvmp加入該工作組或查找相關(guān)信息。 本書提供的代碼示例均通過英特爾傲騰持久內(nèi)存進(jìn)行了測試和驗(yàn)證。由于PMDK具備廠商中立的特性,所以同樣適用于NVDIMM-N設(shè)備。PMDK支持未來推出的所有持久內(nèi)存產(chǎn)品。 在本書出版之際,書中所使用的代碼示例均為最新版本。所有代碼示例均通過了驗(yàn)證和測試,以確保在編譯和執(zhí)行時(shí)不會出現(xiàn)任何錯(cuò)誤。為簡單起見,本書中所使用的部分示例會使用assert()語句來指出意外出現(xiàn)的錯(cuò)誤。任何生產(chǎn)代碼都可以使用相應(yīng)的錯(cuò)誤處理操作來替換這些語句,包括易于理解的錯(cuò)誤信息和相應(yīng)的錯(cuò)誤恢復(fù)操作。此外,部分代碼示例使用不同的掛載點(diǎn)表示持久內(nèi)存感知型文件系統(tǒng),如“/daxfs”“/pmemfs”和“/mnt/pmemfs”。這說明我們可以為應(yīng)用程序掛載并命名持久內(nèi)存文件系統(tǒng),類似于基于數(shù)據(jù)塊的常規(guī)文件系統(tǒng)。源代碼位于本書附帶的代碼庫中—https://github.com/Apress/programming-persistent-memory。 由于這項(xiàng)技術(shù)仍在快速發(fā)展,本書所提到的軟件和API參考可能會隨時(shí)間發(fā)生變化。盡管我們努力確保其向后兼容,但有時(shí)軟件必須不斷演進(jìn),而令之前的版本失效。因此,部分代碼示例可能無法在更新的硬件或操作系統(tǒng)上編譯,需要進(jìn)行相應(yīng)的修改。 【作者簡介】 Steve Scargall是英特爾公司的一名持久內(nèi)存軟件/云架構(gòu)師。作為一名技術(shù)宣傳官,Steve Scargall負(fù)責(zé)提供技術(shù)的啟動與開發(fā)支持工作,以便將持久內(nèi)存技術(shù)集成到軟件棧、應(yīng)用程序和硬件架構(gòu)中,包括在專有和開源開發(fā)工作方面與獨(dú)立軟件開發(fā)商(ISV)進(jìn)行合作,以及與原始設(shè)備制造商(OEM)和云服務(wù)提供商(CSP)等合作。 Steve曾在英國雷丁大學(xué)潛心學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)、人工智能和機(jī)器人等知識,獲得了計(jì)算機(jī)科學(xué)和控制論專業(yè)學(xué)士學(xué)位。他曾負(fù)責(zé)為Solaris Kernel、ZFS和UFS文件系統(tǒng)提供x86架構(gòu)與SPARC性能分析支持,擁有超過19年的豐富經(jīng)驗(yàn)。在Sun Microsystems和Oracle工作期間,他負(fù)責(zé)企業(yè)和云環(huán)境中的DTrace調(diào)試工作。
【譯者簡介】 吳國安(Dennis)2005年于上海交通大學(xué)碩士研究生畢業(yè)。目前是英特爾持久內(nèi)存工程部經(jīng)理,在IA架構(gòu)、性能優(yōu)化、軟件協(xié)同硬件開發(fā)方面有多年工作經(jīng)驗(yàn)。目前主要支持客戶應(yīng)用英特爾數(shù)據(jù)中心級持久化內(nèi)存進(jìn)行軟件開發(fā)和應(yīng)用適配,提供IA架構(gòu)上的客戶方案技術(shù)咨詢和支持。在2012年加入英特爾之前,任職意法半導(dǎo)體,負(fù)責(zé)數(shù)字電視軟件開發(fā)和集成的工作。 魏劍(Terry Wei)是英特爾傲騰技術(shù)方案專家,在英特爾供職16年,曾擔(dān)任硬件開發(fā)、客戶技術(shù)支持等多種職位,目前主要致力于傲騰存儲技術(shù)在中國用戶環(huán)境的技術(shù)適配和應(yīng)用推廣方面的工作。 楊錦文(Jinwen Yang)負(fù)責(zé)英特爾中國區(qū)云計(jì)算和互聯(lián)網(wǎng)行業(yè)的戰(zhàn)略規(guī)劃和數(shù)據(jù)中心產(chǎn)品線的市場導(dǎo)入,并整合內(nèi)部和外部技術(shù)資源,不斷優(yōu)化數(shù)據(jù)中心的全棧式解決方案,專注于服務(wù)客戶的多樣化需求。 吳少慧(Shaohui Wu)目前是英特爾持久內(nèi)存工程師,擁有清華大學(xué)工程物理系的工程學(xué)士學(xué)位以及北京有色金屬研究總院金屬材料及熱處理專業(yè)的工程碩士學(xué)位。2018年入職英特爾之前,從事半導(dǎo)體芯片的產(chǎn)品開發(fā)與制造方面的工作,目前主要致力于傲騰持久內(nèi)存生態(tài)環(huán)境的建立,并推廣持久內(nèi)存在中國區(qū)的應(yīng)用。 許春曄(Chunye Xu)是英特爾公司的持久內(nèi)存應(yīng)用工程師,致力于客戶持久內(nèi)存技術(shù)支持和工作負(fù)載調(diào)試工作,曾在英特爾通信和設(shè)備部門負(fù)責(zé)系統(tǒng)調(diào)試和自動化測試工作。他畢業(yè)于河北大學(xué),擁有計(jì)算機(jī)應(yīng)用碩士學(xué)位。 林翔(Xiang Lin)是英特爾公司的平臺應(yīng)用工程師,目前主要致力于持久內(nèi)存的應(yīng)用和研究工作,包括工作負(fù)載的應(yīng)用和性能優(yōu)化,同時(shí)還負(fù)責(zé)客戶支持方面的工作。此外,他對圖形圖像處理領(lǐng)域有著濃厚的興趣。 王龍(Long Wang)是英特爾公司的軟件工程師,當(dāng)前主要致力于持久內(nèi)存相關(guān)的數(shù)據(jù)庫開發(fā)與性能優(yōu)化,同時(shí)還參與PMDK項(xiàng)目,例如遠(yuǎn)程持久內(nèi)存訪問的集成開發(fā)工作。 李曉冉(Xiaoran Li)2018年畢業(yè)于日本北海道大學(xué)信息與科學(xué)學(xué)院,目前就職于英特爾數(shù)據(jù)中心部門,從事傲騰持久內(nèi)存研發(fā)工作,對系統(tǒng)存儲、云計(jì)算、并行計(jì)算有濃厚興趣。 斯佩峰(Peifeng Si)是英特爾數(shù)據(jù)中心部門資深軟件工程師。長期從事x86服務(wù)器的固件開發(fā)和軟件性能調(diào)優(yōu),目前專注于持久內(nèi)存對數(shù)據(jù)庫及存儲類應(yīng)用的優(yōu)化。 陶少玉(Shaoyu Tao)在英特爾任職軟件工程師超過5年,在加入英特爾的前幾年,他主要從事Linux內(nèi)核、系統(tǒng)調(diào)試相關(guān)工作,目前專注于基于持久內(nèi)存的數(shù)據(jù)庫優(yōu)化相關(guān)工作。 高明(Ming Gao)是英特爾公司中國區(qū)行業(yè)解決方案部互聯(lián)網(wǎng)行業(yè)技術(shù)總監(jiān),他主要負(fù)責(zé)英特爾與中國互聯(lián)網(wǎng)公司的技術(shù)戰(zhàn)略合作,助力中國互聯(lián)網(wǎng)公司利用英特爾的產(chǎn)品和技術(shù)構(gòu)建云計(jì)算解決方案,對包括人工智能在內(nèi)的各類工作負(fù)載進(jìn)行性能優(yōu)化。高明獲得了北京郵電大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)碩士學(xué)位。 崔峰 2015年5月起就職于京天石易通信息技術(shù)有限公司,至今從業(yè)超過15年,2004年畢業(yè)于英國諾桑比亞大學(xué),獲商業(yè)管理學(xué)士學(xué)位。 第1章 持久內(nèi)存編程簡介 1 1.1 高級示例程序 2 1.1.1 有何區(qū)別 4 1.1.2 性能差異 5 1.1.3 程序復(fù)雜性 5 1.1.4 libpmemkv如何運(yùn)行 5 1.2 后文提要 6 1.3 總結(jié) 7 第2章 持久內(nèi)存架構(gòu) 8 2.1 持久內(nèi)存的特性 8 2.2 持久內(nèi)存的平臺支持 9 2.3 緩存層級 10 2.4 電源故障保護(hù)域 11 2.5 刷新、排序和屏障操作的需求 13 2.6 數(shù)據(jù)可見性 16 2.7 用于持久內(nèi)存的英特爾機(jī)器指令 16 2.8 檢測平臺功能 17 2.9 應(yīng)用程序啟動與恢復(fù) 18 2.10 后文提要 20 2.11 總結(jié) 20 第3章 持久內(nèi)存的操作系統(tǒng)支持 21 3.1 內(nèi)存和存儲的操作系統(tǒng)支持 21 3.2 持久內(nèi)存用作塊存儲 22 3.3 持久內(nèi)存感知型文件系統(tǒng) 23 3.4 內(nèi)存映射文件 24 3.5 持久內(nèi)存直接訪問 30 3.6 總結(jié) 37 第4章 持久內(nèi)存編程的基本概念 38 4.1 有何區(qū)別 38 4.2 原子更新 39 4.3 事務(wù) 39 4.3.1 原子性 39 4.3.2 一致性 40 4.3.3 隔離性 40 4.3.4 持久性 40 4.4 刷新不具有事務(wù)性 41 4.5 啟動時(shí)職責(zé) 41 4.6 針對硬件配置進(jìn)行調(diào)優(yōu) 41 4.7 總結(jié) 42 第5章 持久內(nèi)存開發(fā)套件簡介 43 5.1 背景 43 5.2 選擇正確的語義 44 5.3 易失性庫 44 5.3.1 libmemkind 44 5.3.2 libvmemcache 45 5.3.3 libvmem 46 5.4 持久性庫 46 5.4.1 libpmem 46 5.4.2 libpmemobj 46 5.4.3 libpmemobj-cpp 47 5.4.4 libpmemkv 47 5.4.5 libpmemlog 47 5.4.6 libpmemblk 48 5.5 工具和命令程序 48 5.5.1 pmempool 48 5.5.2 pmemcheck 48 5.5.3 pmreorder 49 5.6 總結(jié) 49 第6章 libpmem:底層持久內(nèi)存支持 50 6.1 使用庫 51 6.2 映射文件 51 6.3 復(fù)制到持久內(nèi)存 52 6.4 分解刷新步驟 53 6.5 總結(jié) 54 第7章 libpmemobj:原生事務(wù)性對象存儲 55 7.1 什么是libpmemobj 55 7.2 為什么不使用malloc() 55 7.3 組合操作 56 7.4 內(nèi)存池 56 7.4.1 創(chuàng)建內(nèi)存池 56 7.4.2 池對象指針和根對象 59 7.4.3 打開內(nèi)存池并從內(nèi)存池中讀取數(shù)據(jù) 60 7.5 內(nèi)存池集 61 7.5.1 串聯(lián)池集 61 7.5.2 副本池集 62 7.6 管理內(nèi)存池和池集 62 7.7 類型化對象標(biāo)識符 63 7.8 分配內(nèi)存 63 7.9 持久保存數(shù)據(jù) 63 7.9.1 原子操作 64 7.9.2 保留/發(fā)布API 66 7.9.3 事務(wù)API 68 7.9.4 可選標(biāo)記 71 7.9.5 持久保存數(shù)據(jù)總結(jié) 71 7.10 libpmemobj的API可提供保障 71 7.11 管理庫操作 72 7.12 調(diào)試與錯(cuò)誤處理 72 7.13 總結(jié) 74 第8章 libpmemobj-cpp:自適應(yīng)語言C++和持久內(nèi)存 75 8.1 簡介 75 8.2 元編程 75 8.2.1 持久指針 76 8.2.2 事務(wù) 76 8.2.3 創(chuàng)建快照 77 8.2.4 分配 79 8.3 C++標(biāo)準(zhǔn)限制 80 8.3.1 對象的生命周期 80 8.3.2 平凡類型 81 8.3.3 對象布局 82 8.3.4 指針 83 8.3.5 限制總結(jié) 85 8.4 簡化持久性 85 8.5 生態(tài)系統(tǒng) 91 8.5.1 持久容器 91 8.5.2 持久容器示例 91 8.6 總結(jié) 94 第9章 pmemkv:持久內(nèi)存鍵值存儲 95 9.1 pmemkv架構(gòu) 97 9.2 電話簿示例 99 9.3 讓持久內(nèi)存更靠近云 102 9.4 總結(jié) 103 第10章 持久內(nèi)存編程的易失性用途 104 10.1 簡介 104 10.2 背景 105 10.2.1 內(nèi)存分配 105 10.2.2 工作原理 105 10.2.3 支持的內(nèi)存“類型” 105 10.3 memkind API 107 10.3.1 類型管理API 107 10.3.2 堆管理API 111 10.3.3 類型配置管理 112 10.3.4 更多memkind代碼示例 113 10.4 面向PMEM類型的C++分配器 113 10.4.1 pmem::allocator方法 114 10.4.2 嵌套容器 114 10.5 C++示例 114 10.5.1 使用pmem::allocator 115 10.5.2 創(chuàng)建字符串向量 115 10.6 使用持久內(nèi)存擴(kuò)展易失性內(nèi)存 116 10.7 libvmemcache:面向大容量持久內(nèi)存的高效易失性鍵值緩存 120 10.7.1 libvmemcache概述 120 10.7.2 libvmemcache設(shè)計(jì) 122 10.7.3 使用libvmemcache 124 10.8 總結(jié) 126 第11章 設(shè)計(jì)適用于持久內(nèi)存的數(shù)據(jù)結(jié)構(gòu) 127 11.1 連續(xù)數(shù)據(jù)結(jié)構(gòu)和碎片化 127 11.1.1 內(nèi)部和外部碎片化 127 11.1.2 原子性和一致性 128 11.1.3 選擇性持久化 131 11.1.4 示例數(shù)據(jù)結(jié)構(gòu) 131 11.2 總結(jié) 140 第12章 調(diào)試持久內(nèi)存應(yīng)用程序 141 12.1 用于Valgrind的pmemcheck 142 12.1.1 棧溢出示例 142 12.1.2 內(nèi)存泄漏示例 143 12.2 Intel Inspector?—?Persistence Inspector 144 12.2.1 棧溢出示例 144 12.2.2 內(nèi)存泄漏示例 145 12.3 常見的持久內(nèi)存編程問題 146 12.3.1 非持久存儲 146 12.3.2 數(shù)據(jù)存儲未添加到事務(wù) 157 12.3.3 將一個(gè)內(nèi)存對象添加至兩個(gè)不同的事務(wù) 160 12.3.4 內(nèi)存覆寫 165 12.3.5 非必要刷新 166 12.3.6 亂序?qū)懭? 170 12.4 總結(jié) 179 第13章 實(shí)際應(yīng)用程序中實(shí)現(xiàn)持久性 180 13.1 數(shù)據(jù)庫示例 180 13.2 不同的持久內(nèi)存實(shí)現(xiàn)方式 181 13.3 開發(fā)持久內(nèi)存感知型MariaDB*存儲引擎 181 13.3.1 了解存儲層 182 13.3.2 創(chuàng)建存儲引擎類 183 13.4 總結(jié) 191 第14章 并發(fā)和持久內(nèi)存 192 14.1 事務(wù)與多線程 192 14.2 持久內(nèi)存上的互斥體 196 14.3 原子操作與持久內(nèi)存 198 14.4 持久內(nèi)存的并發(fā)數(shù)據(jù)結(jié)構(gòu) 198 14.4.1 并發(fā)有序映射 199 14.4.2 并發(fā)散列映射 202 14.5 總結(jié) 202 第15章 分析與性能 204 15.1 簡介 204 15.2 性能分析概念 204 15.2.1 計(jì)算受限與內(nèi)存受限 204 15.2.2 內(nèi)存延時(shí)與內(nèi)存容量 205 15.2.3 讀取與寫入性能 205 15.2.4 內(nèi)存訪問模式 205 15.2.5 I/O存儲受限的工作負(fù)載 205 15.3 確定工作負(fù)載是否適合持久內(nèi)存 206 15.3.1 易失性用例 206 15.3.2 需要持久性的用例 208 15.4 使用持久內(nèi)存的工作負(fù)載性能分析 209 15.4.1 確定工作負(fù)載特性 210 15.4.2 內(nèi)存帶寬與延時(shí) 210 15.4.3 持久內(nèi)存讀寫比率 211 15.4.4 工作集大小與內(nèi)存占用空間大小 211 15.4.5 非一致內(nèi)存架構(gòu)行為 211 15.4.6 優(yōu)化面向持久內(nèi)存的軟件 212 15.5 總結(jié) 215 第16章 PMDK內(nèi)部組件:重要算法和數(shù)據(jù)結(jié)構(gòu) 216 16.1 持久內(nèi)存池:高層架構(gòu)概覽 216 16.2 內(nèi)存映射的不確定性:持久內(nèi)存對象標(biāo)識符 218 16.3 持久化線程本地存儲:使用通道 220 16.4 確保電源故障原子性:重做日志和撤銷日志 220 16.4.1 事務(wù)重做日志 221 16.4.2 事務(wù)撤銷日志 221 16.4.3 libpmemobj統(tǒng)一日志 222 16.5 持久分配:事務(wù)持久分配器的接口 223 16.6 持久內(nèi)存堆管理:持久內(nèi)存分配器設(shè)計(jì) 223 16.7 ACID事務(wù):高效的底層持久事務(wù) 226 16.8 延遲重新初始化變量:將易失性狀態(tài)存儲在持久內(nèi)存上 227 16.9 總結(jié) 228 第17章 可靠性、可用性與可維護(hù)性 229 17.1 處理不可糾正錯(cuò)誤 229 17.1.1 已使用的不可糾正錯(cuò)誤處理 230 17.1.2 未使用的不可糾正錯(cuò)誤處理 231 17.1.3 清除不可糾正錯(cuò)誤 234 17.2 設(shè)備狀態(tài) 234 17.2.1 ACPI定義的設(shè)備狀態(tài)函數(shù)(_NCH,_NBS) 236 17.2.2 特定供應(yīng)商的設(shè)備狀態(tài)(_DSM) 236 17.2.3 ACPI NFIT狀態(tài)事件通知 236 17.3 不安全/異常關(guān)機(jī) 237 17.4 總結(jié) 238 第18章 遠(yuǎn)程持久內(nèi)存 239 18.1 RDMA網(wǎng)絡(luò)協(xié)議 240 18.2 初始遠(yuǎn)程持久內(nèi)存架構(gòu)的目標(biāo) 242 18.3 確保遠(yuǎn)程持久性 242 18.3.1 通用遠(yuǎn)程復(fù)制方法 243 18.3.2 設(shè)備遠(yuǎn)程復(fù)制方法 244 18.4 一般軟件架構(gòu) 246 18.5 librpmem架構(gòu)及其在復(fù)制中的使用 246 18.5.1 使用內(nèi)存池集配置遠(yuǎn)程復(fù)制 249 18.5.2 性能注意事項(xiàng) 249 18.5.3 遠(yuǎn)程復(fù)制錯(cuò)誤處理 250 18.5.4 向復(fù)制世界“問好” 251 18.6 總結(jié) 254 第19章 高級主題 256 19.1 非一致性內(nèi)存訪問 256 19.1.1 NUMACTL Linux程序 257 19.1.2 NDCTL Linux程序 258 19.1.3 英特爾內(nèi)存延遲檢查器程序 259 19.1.4 NUMASTAT程序 260 19.1.5 英特爾VTune Profiler —Platform Profiler 261 19.1.6 IPMCTL程序 261 19.1.7 BIOS調(diào)優(yōu)選項(xiàng) 261 19.1.8 自動NUMA平衡 261 19.2 使用具有持久內(nèi)存的卷管理器 263 19.3 mmap()的MAP_SYNC標(biāo)記 264 19.4 總結(jié) 265 附錄A 如何在Linux上安裝NDCTL和DAXCTL 266 附錄B 如何安裝持久內(nèi)存開發(fā)套件 271 附錄C 如何在Linux和Windows上安裝IPMCTL 277 附錄D 面向持久內(nèi)存的Java 282 附錄E 遠(yuǎn)程持久內(nèi)存復(fù)制的未來 289 術(shù)語表 292
你還可能感興趣
我要評論
|