首页>参考读物>计算机科学与技术>软件与程序设计

持久内存编程
作者 : [美]史蒂夫·斯卡格尔(Steve Scargall) 著
译者 : 吴国安 魏剑 杨锦文 等译
丛书名 : 华章程序员书库
出版日期 : 2021-03-25
ISBN : 978-7-111-67674-4
定价 : 119.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 317
开本 : 16
原书名 : Programming Persistent Memory: A Comprehensive Guide for Developers
原出版社: Apress
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书讲述了持久内存编程这项技术,以及它为什么受行业欢迎。其中涵盖了操作系统和硬件需求,以及如何使用模拟或真实的持久内存硬件创建开发环境。本书解释了基本概念,并介绍了C、C++、JavaScript和其他语言的持久内存编程API,讨论了持久内存上的RMDA,阐述了其安全特性。本书还包括可以在读者自己的系统上运行的源代码和示例。

图书特色

持久内存编程
Programming Persistent Memory
A Comprehensive Guide for Developers
[美]  史蒂夫·斯卡格尔(Steve Scargall) 著
吴国安 魏剑 杨锦文  等译

图书前言

关于本书
持久内存通常被称为非易失性内存(NVM)或存储级内存(SCM)。在本书中,特意将持久内存作为一个包罗万象的术语,指代当前及未来所有与此相关的内存技术。本书介绍持久内存技术,并对一些关键问题做出解答。
对于软件开发人员,这些问题包括:什么是持久内存?如何使用持久内存?可以使用哪些API和库?持久内存能为应用程序提供哪些优势?需要学习哪些新的编程方法?如何设计应用程序以使用持久内存?在哪里查找相关信息、文档和帮助?
对于系统和云架构师,这些问题包括:什么是持久内存?持久内存的工作原理是什么?持久内存与DRAM或SSD/NVMe存储设备相比有何不同?硬件和操作系统方面有哪些要求?哪些应用程序需要或者可以从持久内存中获益?现有应用程序在不经修改的情况下可以使用持久内存吗?
对于软件应用程序而言,持久内存不是一种即插即用的技术。尽管从外表看持久内存与传统DRAM内存类似,但应用程序必须进行修改才能充分发挥持久内存的持久特性。应用程序在未经修改的情况下也可以在安装了持久内存的系统上运行,但是这样无法发挥持久内存的全部潜能。
庆幸的是,服务器和操作系统厂商在早期设计阶段进行了合作,并推出了许多相关产品。Linux和Microsoft Windows已经可以原生支持持久内存技术。许多常见的虚拟化技术也支持持久内存。
然而,对于ISV和整个开发人员社区而言,针对持久内存技术的开发之旅才刚刚起步。一些软件已经完成修改并进入市场。但企业和云计算行业需要一段时间才能加以采用并推出相应的硬件产品。ISV和软件开发人员也需要时间了解现有应用程序需要做出哪些更改,并实现它们。
为了简化必要的开发工作,英特尔开发并开源了持久内存开发套件(PMDK),你可以访问https://pmem.io/pmdk/获取该套件。我们将在第5章详细介绍PMDK,并在随后的章节中对大多数可用的库进行介绍。本书每章都会提供一份深入指南,方便开发人员了解所要使用的库。PMDK是一套基于存储网络工业协会(SNIA)NVM编程模型的开源库和工具,由50多家行业合作伙伴联合设计并实现。你可以访问https://www.snia.org/tech_activities/standards/curr_standards/npm获取最新的NVM编程模型文档。该模型描述了软件如何利用持久内存的特性,来支持设计人员开发能够充分发挥NVM特性和性能的API。
PMDK同时提供Linux和Windows版本,并支持高级语言,旨在推动持久内存编程的普及。C和C++支持已经过全面验证。在本书编写之际,对其他语言(Java和Python)的支持也正在验证之中。预计其他语言也将采用编程模型,为开发人员提供原生的持久内存API。PMDK开发团队欢迎并鼓励大家在持久内存键值存储(pmemkv)的核心代码、新语言绑定或新存储引擎方面做出更多贡献。
本书假设你不了解持久内存硬件设备或软件开发,并经过了精心的编排设计,你可以按照自己希望的顺序随意浏览本书内容。尽管本书后面的内容以之前章节中介绍的概念和知识为基础,但是也无须按顺序阅读所有章节,同时为了方便起见,在内容中添加了对于相关章节的引用,以便你学习或回忆相关知识。
本书结构
本书共有19章,每章侧重于介绍不同的主题。全书由三个主要部分组成。第1~4章介绍了持久内存架构、硬件和操作系统支持。第5~16章旨在帮助开发人员了解PMDK库以及如何在应用程序中使用这些库。最后,第17~19章介绍了部分高级主题,比如RAS以及使用RDMA复制数据等。
第1章介绍持久内存,并通过一个简单的例子尝试,这个例子使用libpmemkv来存储持久键-值对。
第2章介绍持久内存架构,并重点介绍开发人员应知晓的硬件要求。
第3章介绍操作系统相关变更、新特性,以及操作系统如何发现持久内存。
第4章以前3章的内容为基础,介绍持久内存编程的基本概念。
第5章介绍PMDK,即一套帮助软件从业人员进行开发的库。
第6章介绍并展示如何使用PMDK的libpmem,即提供持久内存支持的底层库。
第7章使用PMDK的C原生对象存储库libpmemobj提供相关信息和示例。
第8章演示PMDK的C++ libpmemobj-cpp对象存储,它是在libpmemobj之上用C++头文件构建而成的。
第9章通过示例详细介绍第1章中提到的libpmemkv。
第10章主要面向希望充分利用持久内存但不需要对数据进行持久化存储的读者。libmemkind是构建在jemalloc之上的用户可扩展堆管理器,支持控制内存特性以及在不同类型的内存之间对堆进行分区。libvmemcache是一种可嵌入式轻量级内存缓存解决方案,它可以通过高效、可扩展的内存映射充分利用大容量存储,例如支持DAX(直接访问)的持久内存。
第11章详细介绍如何设计适用于持久内存的数据结构。
第12章介绍持久内存相关的工具,并举例说明软件开发人员如何调试支持持久内存的应用程序。
第13章探讨如何修改实际应用程序以使用持久内存特性。
第14章介绍如何实现应用程序中的并发性以便用于持久内存。
第15章介绍性能的概念,并展示如何使用英特尔VTune工具套件在代码更改前后对系统和应用程序进行分析。
第16章详细介绍PMDK设计、架构、算法和内存分配器实现。
第17章介绍如何通过硬件和操作系统层实现可靠性、可用性与可服务性(RAS)。
第18章探讨应用程序如何使用本地和远程持久内存在多个系统之间横向扩展。
第19章介绍非一致性内存访问(NUMA)、软件卷管理器的使用、mmap()的MAP_SYNC标记等高级主题。
附录部分单独提供了安装PMDK的步骤以及管理持久内存所需的程序,其中还介绍了Java更新和RDMA协议的未来。由于这些内容还有不确定性,因此没有将其列在本书的正文部分。
目标读者
本书主要面向具有一定经验的应用程序开发人员,同时我们也希望本书中的内容适用于更广泛的读者,如系统管理员和架构师、学生、讲师,以及学术研究人员等。系统设计人员、内核开发人员,以及任何对这项新兴技术感兴趣的人都可以在本书中找到实用的内容。
每位读者都将能够了解持久内存是什么、它的工作原理,以及操作系统和应用程序如何利用持久内存。持久内存的配置和管理因厂商而异,因此我们在附录中列出了部分参考资料,避免主要章节中的内容过于复杂。
应用程序开发人员可通过示例学习如何将持久内存集成到现有应用程序或新应用程序中。我们将在整本书中使用PMDK中提供的各种库,并提供大量的示例予以说明。本书也提供了使用各种编程语言(C、C++、JavaScript等)编写的示例代码。开发人员在自己的项目中可以自由地使用这些库。本书还提供了大量的资源链接,确保读者能够获得更多的帮助和信息。
系统管理员以及云、高性能计算和企业环境架构师都可以参考本书中的大部分内容,了解持久内存的特性和优势,以便为应用程序和开发人员提供支持。如果能够在每台物理服务器上部署更多虚拟机,或者为应用程序提供这种全新的内存/存储层,就可以让更多数据更靠近CPU,或显著缩短重启时间,同时保持数据的温缓存(warm cache)。
学生、讲师和学术研究人员也可以从本书的许多章节中受益。计算机科学专业的学生可以了解硬件、操作系统的特性以及编程技巧。讲师可以在课堂上自由讲授本书中的内容,或将其用作相关研究项目的基础,比如新的持久内存文件系统、算法或缓存实现等。
我们还介绍了各种用于分析服务器和应用程序的工具,以便大家更好地了解CPU、内存和磁盘IO访问模式。通过此类知识,我们展示了如何修改应用程序,以便通过PMDK获得持久性优势。
未来参考价值
本书的内容在未来多年都具备重要价值。除非规范中另有说明,ACPI、UEFI、SNIA非易失性编程模型等行业规范都会在新版本发布时保持向后兼容性。同时本书中介绍的编程方法也能够适用于新的设备外形。本书不局限于某一家特定的持久内存厂商或某一种实现方法。在需要描述特定于厂商的特性或实现方法的地方,我们会特意指出,因为在不同厂商或不同代产品之间可能会有差异。建议大家阅读厂商关于持久内存产品的文档以了解更多信息。
使用PMDK的开发人员将获得一个稳定的API。PMDK将在每次主要版本更新时提供新的特性和性能改进,并随着新的持久内存产品、CPU指令、平台设计、行业规范和操作系统特性支持的推出而不断演变。
源代码示例
本书中的概念和源代码示例遵循厂商中立的SNIA非易失性内存编程模型。SNIA是一个非营利性全球组织,致力于制定标准并提供相关的培训,来推动存储和信息技术的发展。该编程模型由SNIA NVM技术工作组(Technical Working Group,TWG)负责设计、开发与维护,该工作组汇聚了多家领先的操作系统、硬件和服务器厂商。你可以从https://www.snia.org/forums/sssi/nvmp加入该工作组或查找相关信息。
本书提供的代码示例均通过英特尔傲腾持久内存进行了测试和验证。由于PMDK具备厂商中立的特性,所以同样适用于NVDIMM-N设备。PMDK支持未来推出的所有持久内存产品。
在本书出版之际,书中所使用的代码示例均为最新版本。所有代码示例均通过了验证和测试,以确保在编译和执行时不会出现任何错误。为简单起见,本书中所使用的部分示例会使用assert()语句来指出意外出现的错误。任何生产代码都可以使用相应的错误处理操作来替换这些语句,包括易于理解的错误信息和相应的错误恢复操作。此外,部分代码示例使用不同的挂载点表示持久内存感知型文件系统,如“/daxfs”“/pmemfs”和“/mnt/pmemfs”。这说明我们可以为应用程序挂载并命名持久内存文件系统,类似于基于数据块的常规文件系统。源代码位于本书附带的代码库中—https://github.com/Apress/programming-persistent-memory。
由于这项技术仍在快速发展,本书所提到的软件和API参考可能会随时间发生变化。尽管我们努力确保其向后兼容,但有时软件必须不断演进,而令之前的版本失效。因此,部分代码示例可能无法在更新的硬件或操作系统上编译,需要进行相应的修改。
本书约定
本书使用几条约定以提醒你注意特定的信息。约定的使用取决于所展示信息的类型。
计算机命令
段落文本中出现的命令、编程库和API函数引用使用等宽字体。例如:
为了说明持久内存的用法,我们首先呈现一个示例程序,演示libpmemkv库提供的键值存储。
计算机终端输出
计算机终端输出通常直接截取自计算机终端,用等宽字体显示,例如下方演示的从GitHub项目克隆PMDK的示例:

源代码
从附带的GitHub存储库中截取的带有行号的源代码示例采用等宽字体显示。每个代码列表下方为行号或行号范围的引用,并附带简要说明。代码注释采用原生语言风格。大多数语言采用相同的语法。单行注释使用//,数据块或多行注释使用/*..*/。具体示例如列表1所示。
列表1 使用libpmemkv的示例程序

第45行:此处我们定义了一个小型辅助例程kvprint(),它会在调用时显示键值对。
备注
本书的备注、注意事项和提示均采用标准格式,以便提醒你关注要点,如下所示。
备注相当于当前讨论主题的提示、快捷方式或替代方法。忽视备注没有大的问题,但是你可能会错过某些实用信息。

上架指导

计算机\程序设计

封底文字

无论是初学者,还是经验丰富的程序员,都可以使用本书作为持久内存编程的综合指南,了解持久内存对软硬件的要求,以及持久内存在提升性能、缩短应用程序启动时间方面的巨大潜力。
相比当前的 DRAM 产品,持久内存在字节可寻址容量方面实现了巨大飞跃,这项革命性的新技术显著提升了应用程序的性能,以及可以利用的容量。它将使各种技术获益,包括内存和传统数据库、AI、分析、HPC、虚拟化、大数据等,为 IT 行业带来巨大变革。然而,要想使用持久内存,需要全新的思维方式和开发方式。
本书介绍了持久内存编程技术应用前景,涵盖持久内存的操作系统和硬件要求,以及如何使用模拟和真实的持久内存硬件创建开发环境。本书对持久内存的基本概念进行了解释,介绍了面向 C、C++、JavaScript 和其他语言的持久内存编程 API,探讨了采用持久内存的 RDMA,回顾了安全特性,并展示了许多示例。读者可以在自己的系统上运行本书提供的源代码和示例。

通过阅读本书,你将能够:
了解什么是持久内存、它的功能以及为行业提供的价值。
了解持久内存对操作系统和硬件的要求。
了解持久内存编程的基本概念,包括它和当前的编程方法有何不同,以及开发人员在进行持久内存编程时需要注意的事项。
通过示例了解如何使用持久内存开发套件(PMDK)进行持久内存应用程序开发。
设计与优化面向持久内存的数据结构。
了解如何修改真实的应用程序,以利用持久内存。
利用持久内存编程、应用程序性能分析和调试工具。

译者序

现今,有超过90%的企业已走上数字化转型之路,正致力于成为以数据为中心的企业。数据背后的价值日益凸显,企业也纷纷制定或优化其数字化转型战略,以期充分利用数据挖掘技术,获取深刻洞察并据此抢占市场先机。然而,呈爆发式增长和来源日趋多样的数据,也给企业数据中心从数据采集、存储、处理到业务决策等各个层面带来了更多也更为艰巨的挑战。企业要想充分利用数据驱动业务发展,除需要不断提升其数据中心基础设施的算力外,亦不可忽视高性能存储的重要作用,即把更多数据放在更接近CPU的位置进行处理。
传统的内存-存储架构是由内存加硬盘所组成的两级存储,大容量持久化存储主要由机械硬盘(HDD)或固态盘(SDD)来承担,高性能处理计算则交由动态随机访问内存(DRAM)担纲。然而,由于HDD/SSD和DRAM间的访问速度存在巨大落差,当将数据从DRAM存储到HDD/SSD时或者将数据从HDD/SSD装载到内存中时,都会给系统带来巨大的延迟和带宽损失。不断增加的数据量和对于快速访问更多数据的需求,则进一步放大了这一性能差距带来的弊端,这样会不可避免地要求企业不断增加DRAM的容量,以避免性能被存储拖慢。DRAM虽然速度足够快,可以将稳定的数据流提供给功能强大的处理器,但由于价格昂贵,已经在企业的数据中心中占据超过30%的总成本。英特尔?傲腾?持久内存的出现,则在真正意义上颠覆了传统的内存-存储架构。它不仅具备接近DRAM的性能,还具备HDD/SSD的数据持久性,将高性价比的大容量内存与数据持久性巧妙地结合在一起。可以很好地弥补DRAM和HDD/SSD之间的性能缺口,其相对于DRAM的大容量、低成本特性还能助力企业在容量与成本之间取得更好的平衡。
我们为什么要翻译这本书?持久内存技术是内存领域革命性的技术,从根本上颠覆了传统的内存-存储架构,对整个产业界和学术界产生了深远的影响。我们在推动持久内存在中国互联网行业应用时发现,即便是资深的计算机行业从业者和应用开发者也需要花费大量的精力去阅读大量的文献并进行大量的实践,才能充分掌握持久内存编程的核心概念,并将其应用到自身的领域中。在合作中,我们还发现有些开发者由于没有充分掌握持久内存编程的核心概念,开发出了影响数据正确性的代码,并且其性能也不佳。所以能够有一本细致讲述持久内存编程方方面面的书变得非常有必要。幸运的是,持久内存编程英文原版书籍已经出版,我们第一时间就开始着手翻译这本书。本书以工程实践为导向,通过大量的示例,详细阐述了持久内存架构、硬件及操作系统支持的整体技术细节,帮助开发人员了解持久内存编程的核心概念以及持久内存编程的开发库,帮助读者掌握持久内存编程和应用的系统方法。
本书的作者和译者基本都就职于英特尔公司,从事持久内存开发、验证和应用方面的前沿工作,具备丰富的理论知识和实践经验,并与相关产业的合作伙伴有着非常密切的合作。本书第1章至第6章由魏剑、杨锦文负责翻译,其余章节由我和我的团队共同完成翻译工作。全书由我和我的团队统稿。
在翻译过程中,由于中文和英文在表述方面有非常大的不同,翻译工作需要细致和耐心。针对一些有争议的术语、内容等,我们查阅了大量的资料,并和原书作者反复沟通,在翻译过程中也将原书中的一些错误做了纠正,并反馈给了原书作者。翻译完成以后,我们又进行了仔细的校对,即使如此,仍然难免存在疏忽、遗漏的地方,也可能存在一些翻译错误或不准确的地方,如果读者在阅读过程中发现了翻译中的问题,可以向出版社反馈。
翻译工作细致而且烦琐,能够完成此书,离不开很多人的辛勤付出,包括魏剑、杨锦文、吴少慧、胡风华、林翔、许春晔、李晓冉、斯佩峰、王龙、陶少玉和高明等,他们为整本书的翻译做出了很大的贡献。特别是吴少慧,组织了全书的审阅和校对,付出了巨大的努力。感谢胡寅玮、程从超、徐滨、王宝临、张旭、郑春阳、张玉晔、赵玉萍、李波、王荃、慕延峰、孙宇、高伟等提出宝贵意见。感谢John Withers、 周翔、李志明等对本书的大力支持。
谢谢出版社给予了我们无比的信任和翻译的机会,谢谢你们选择了这本书!希望这本书的内容及译文没有让你们失望。

2021年3月
吴国安 于上海

图书目录

译者序
前言
致谢
作者简介
贡献者简介
技术评审者简介
译者简介
第1章 持久内存编程简介 1
1.1 高级示例程序 2
1.1.1 有何区别 4
1.1.2 性能差异 5
1.1.3 程序复杂性 5
1.1.4 libpmemkv如何运行 5
1.2 后文提要 6
1.3 总结 7
第2章 持久内存架构 8
2.1 持久内存的特性 8
2.2 持久内存的平台支持 9
2.3 缓存层级 10
2.4 电源故障保护域 11
2.5 刷新、排序和屏障操作的需求 13
2.6 数据可见性 16
2.7 用于持久内存的英特尔机器指令 16
2.8 检测平台功能 17
2.9 应用程序启动与恢复 18
2.10 后文提要 20
2.11 总结 20
第3章 持久内存的操作系统支持 21
3.1 内存和存储的操作系统支持 21
3.2 持久内存用作块存储 22
3.3 持久内存感知型文件系统 23
3.4 内存映射文件 24
3.5 持久内存直接访问 30
3.6 总结 37
第4章 持久内存编程的基本概念 38
4.1 有何区别 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 针对硬件配置进行调优 41
4.7 总结 42
第5章 持久内存开发套件简介 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 总结 49
第6章 libpmem:底层持久内存支持 50
6.1 使用库 51
6.2 映射文件 51
6.3 复制到持久内存 52
6.4 分解刷新步骤 53
6.5 总结 54
第7章 libpmemobj:原生事务性对象存储 55
7.1 什么是libpmemobj 55
7.2 为什么不使用malloc() 55
7.3 组合操作 56
7.4 内存池 56
7.4.1 创建内存池 56
7.4.2 池对象指针和根对象 59
7.4.3 打开内存池并从内存池中读取数据 60
7.5 内存池集 61
7.5.1 串联池集 61
7.5.2 副本池集 62
7.6 管理内存池和池集 62
7.7 类型化对象标识符 63
7.8 分配内存 63
7.9 持久保存数据 63
7.9.1 原子操作 64
7.9.2 保留/发布API 66
7.9.3 事务API 68
7.9.4 可选标记 71
7.9.5 持久保存数据总结 71
7.10 libpmemobj的API可提供保障 71
7.11 管理库操作 72
7.12 调试与错误处理 72
7.13 总结 74
第8章 libpmemobj-cpp:自适应语言C++和持久内存 75
8.1 简介 75
8.2 元编程 75
8.2.1 持久指针 76
8.2.2 事务 76
8.2.3 创建快照 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 限制总结 85
8.4 简化持久性 85
8.5 生态系统 91
8.5.1 持久容器 91
8.5.2 持久容器示例 91
8.6 总结 94
第9章 pmemkv:持久内存键值存储 95
9.1 pmemkv架构 97
9.2 电话簿示例 99
9.3 让持久内存更靠近云 102
9.4 总结 103
第10章 持久内存编程的易失性用途 104
10.1 简介 104
10.2 背景 105
10.2.1 内存分配 105
10.2.2 工作原理 105
10.2.3 支持的内存“类型” 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 创建字符串向量 115
10.6 使用持久内存扩展易失性内存 116
10.7 libvmemcache:面向大容量持久内存的高效易失性键值缓存 120
10.7.1 libvmemcache概述 120
10.7.2 libvmemcache设计 122
10.7.3 使用libvmemcache 124
10.8 总结 126
第11章 设计适用于持久内存的数据结构 127
11.1 连续数据结构和碎片化 127
11.1.1 内部和外部碎片化 127
11.1.2 原子性和一致性 128
11.1.3 选择性持久化 131
11.1.4 示例数据结构 131
11.2 总结 140
第12章 调试持久内存应用程序 141
12.1 用于Valgrind的pmemcheck 142
12.1.1 栈溢出示例 142
12.1.2 内存泄漏示例 143
12.2 Intel Inspector?—?Persistence Inspector 144
12.2.1 栈溢出示例 144
12.2.2 内存泄漏示例 145
12.3 常见的持久内存编程问题 146
12.3.1 非持久存储 146
12.3.2 数据存储未添加到事务 157
12.3.3 将一个内存对象添加至两个不同的事务 160
12.3.4 内存覆写 165
12.3.5 非必要刷新 166
12.3.6 乱序写入 170
12.4 总结 179
第13章 实际应用程序中实现持久性 180
13.1 数据库示例 180
13.2 不同的持久内存实现方式 181
13.3 开发持久内存感知型MariaDB*存储引擎 181
13.3.1 了解存储层 182
13.3.2 创建存储引擎类 183
13.4 总结 191
第14章 并发和持久内存 192
14.1 事务与多线程 192
14.2 持久内存上的互斥体 196
14.3 原子操作与持久内存 198
14.4 持久内存的并发数据结构 198
14.4.1 并发有序映射 199
14.4.2 并发散列映射 202
14.5 总结 202
第15章 分析与性能 204
15.1 简介 204
15.2 性能分析概念 204
15.2.1 计算受限与内存受限 204
15.2.2 内存延时与内存容量 205
15.2.3 读取与写入性能 205
15.2.4 内存访问模式 205
15.2.5 I/O存储受限的工作负载 205
15.3 确定工作负载是否适合持久内存 206
15.3.1 易失性用例 206
15.3.2 需要持久性的用例 208
15.4 使用持久内存的工作负载性能分析 209
15.4.1 确定工作负载特性 210
15.4.2 内存带宽与延时 210
15.4.3 持久内存读写比率 211
15.4.4 工作集大小与内存占用空间大小 211
15.4.5 非一致内存架构行为 211
15.4.6 优化面向持久内存的软件 212
15.5 总结 215
第16章 PMDK内部组件:重要算法和数据结构 216
16.1 持久内存池:高层架构概览 216
16.2 内存映射的不确定性:持久内存对象标识符 218
16.3 持久化线程本地存储:使用通道 220
16.4 确保电源故障原子性:重做日志和撤销日志 220
16.4.1 事务重做日志 221
16.4.2 事务撤销日志 221
16.4.3 libpmemobj统一日志 222
16.5 持久分配:事务持久分配器的接口 223
16.6 持久内存堆管理:持久内存分配器设计 223
16.7 ACID事务:高效的底层持久事务 226
16.8 延迟重新初始化变量:将易失性状态存储在持久内存上 227
16.9 总结 228
第17章 可靠性、可用性与可维护性 229
17.1 处理不可纠正错误 229
17.1.1 已使用的不可纠正错误处理 230
17.1.2 未使用的不可纠正错误处理 231
17.1.3 清除不可纠正错误 234
17.2 设备状态 234
17.2.1 ACPI定义的设备状态函数(_NCH,_NBS) 236
17.2.2 特定供应商的设备状态(_DSM) 236
17.2.3 ACPI NFIT状态事件通知 236
17.3 不安全/异常关机 237
17.4 总结 238
第18章 远程持久内存 239
18.1 RDMA网络协议 240
18.2 初始远程持久内存架构的目标 242
18.3 确保远程持久性 242
18.3.1 通用远程复制方法 243
18.3.2 设备远程复制方法 244
18.4 一般软件架构 246
18.5 librpmem架构及其在复制中的使用 246
18.5.1 使用内存池集配置远程复制 249
18.5.2 性能注意事项 249
18.5.3 远程复制错误处理 250
18.5.4 向复制世界“问好” 251
18.6 总结 254
第19章 高级主题 256
19.1 非一致性内存访问 256
19.1.1 NUMACTL Linux程序 257
19.1.2 NDCTL Linux程序 258
19.1.3 英特尔内存延迟检查器程序 259
19.1.4 NUMASTAT程序 260
19.1.5 英特尔VTune Profiler —Platform Profiler 261
19.1.6 IPMCTL程序 261
19.1.7 BIOS调优选项 261
19.1.8 自动NUMA平衡 261
19.2 使用具有持久内存的卷管理器 263
19.3 mmap()的MAP_SYNC标记 264
19.4 总结 265
附录A 如何在Linux上安装NDCTL和DAXCTL 266
附录B 如何安装持久内存开发套件 271
附录C 如何在Linux和Windows上安装IPMCTL 277
附录D 面向持久内存的Java 282
附录E 远程持久内存复制的未来 289
术语表 292

教学资源推荐
作者: (美)Mary Campione,Kathy Walrath,Alison Huml
作者: Kathryn E.Sanders, Andries Van Dam
作者: (美)Stuart Reges,Marty Stepp 著
作者: [美]布兰德利·N. 米勒(Bradley N. Miller) 大卫·L. 拉农(David L. Ranum) 朱莉·安德森(Julie Anderson) 著
参考读物推荐