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