技术与生活 性能之重 持久内存编程指南—乱译连载 (序言)

持久内存编程指南—乱译连载 (序言)

这本书介绍了持久内存技术,并提供了关键问题的答案。对于软件开发人员来说,这些问题包括:什么是持久内存?我怎么用?有哪些API和库可用?它能为我的应用提供什么好处?我需要学习哪些新的编程方法?如何设计应用程序以使用持久内存?在哪里可以找到信息、文档和帮助?

参考资料

本书代码:

https://github.com/Apress/programming-persistent-memory

另外的参考资料:

http://pmem.io

【声明】由于是非正式翻译,只是自学之用,所以未对原作者简介、致谢等章节进行翻译。望原作者见谅。

0      序言

0.1    关于本书

持久内存通常被称为非易失性存储器(NVM)或存储类存储器(SCM)。在这本书中,我们有目的地使用持久性内存作为一个包罗万象的术语来表示当前和未来属于这一伞下的所有内存技术。这本书介绍了持久内存技术,并提供了关键问题的答案。对于软件开发人员来说,这些问题包括:什么是持久内存?我怎么用?有哪些API和库可用?它能为我的应用提供什么好处?我需要学习哪些新的编程方法?如何设计应用程序以使用持久内存?在哪里可以找到信息、文档和帮助?

系统和云架构师将得到以下问题的答案:什么是持久内存?它是如何工作的?它与DRAM或SSD/NVMe存储设备有何不同?硬件和操作系统的要求是什么?哪些应用程序需要或可能从持久内存中受益?我现有的应用程序可以使用持久内存而不需修改吗?

对于软件应用程序来说,持久内存不是即插即用的技术。尽管它看起来和感觉上很像传统的DRAM内存,但需要对应用程序进行修改,才能充分利用持久内存的持久特性。这并不是说应用程序不能在安装了持久内存的系统上未经修改而运行,实际上可以这么做,但如果不修改代码,程序就无法利用持久内存所提供的全部潜力。

值得庆幸的是,服务器和操作系统供应商在设计阶段很早就进行了合作,并且已经在市场上推出了产品。Linux和Microsoft Windows已经为持久内存技术提供了原生支持。许多流行的虚拟化技术也支持持久内存。

对于ISV和整个开发社区来说,这段旅程才刚刚开始。一些软件已针对持久内存修改,并且可以在市场上买到。然而,企业和云计算行业需要时间来采用这些硬件并将提供给通用市场。ISV和软件开发人员需要时间来理解需要对现有应用程序进行哪些更改并加以实现。

为了简化所需的开发工作,Intel开发并开源了持久内存开发工具包(PMDK),见https://pmem.io/pmdk/。我们将在第5章中更详细地介绍PMDK,并在随后的章节中介绍大多数可用的库。每一章都提供了深入的指导,以便开发人员能够理解要使用的库。PMDK是一组基于存储网络行业协会(SNIA)NVM编程模型的开源库和工具,由50多个行业合作伙伴设计和实现。最新的NVM编程模型文档在https://www.snia.org/ tech_activities/standards/curr_standards/npm。该模型描述了软件如何利用持久内存特性,并使设计人员能够开发利用NVM特性和性能API。

可用于Linux和Windows,PMDK通过高级语言支持促进持久内存编程的采用。对C和C++的支持已得到充分验证。在编写本书时,对其他语言(如Java和Python)的支持正在进行中。其他语言也将采用编程模型,并为开发人员提供原生持久内存API。PMDK开发团队欢迎并鼓励对核心代码、新语言绑定或持久内存键值存储(pmemkv)的新存储引擎做出新的贡献。

本书假定您没有持久内存硬件设备或软件开发的知识。书籍布局允许您按所需顺序自由浏览内容。虽然本书确实建立在前几章所描述概念和知识的基础上,但并不要求按顺序阅读所有章节。在这种情况下,我们会提供前后相关章节的引用,方便您学习或加强记忆。

0.2    本书结构

本书共19章,每一章都集中在不同的主题上。本书有三个主要部分。第1-4章介绍了持久内存体系结构、硬件和操作系统支持。第5-16章旨在让开发人员理解PMDK库以及如何在应用程序中使用它们。最后,第17-19章提供了一些高级主题的信息,比如RAS(可靠性、可用性、可服务性)和使用RDMA复制数据。

  • 第1章,持久内存编程简介 — 介绍持久内存,并用一个简单的使用libpmemkv库的持久键值存储示例试水;
  • 第2章,持久性内存架构 — 描述持久内存架构,并聚焦于开发人员应该知道的硬件需求;
  • 第3章,操作系统对持久内存的支持 — 提供有关操作系统更改、新功能以及操作系统如何看待持久内存的信息;
  • 第4章,持久内存编程基础概念 — 建立在前三章的基础上,描述了持久内存编程的基本概念;
  • 第5章,持久内存开发工具包(PMDK)— 介绍持久内存开发工具包(PMDK),这是一套帮助软件开发人员使用持久内存的库;
  • 第6章,libpmem:低层持久内存支持 — 描述并演示如何使用PMDK中的libpmem,一个提供持久内存支持的低层库;
  • 第7章,libpmemobj:本地事务性对象存储 — 提供使用libpmemobj(PMDK中的C原生对象存储库)的信息和示例;
  • 第8章,libpmemobj-cpp版本:适于C++和持久内存 — 演示来自PMDK的C++ libpmemobj-cpp对象存储,使用libpmemobj之上的C++头文件构建;
  • 第9章,pmemkv:持久内存KV库 — 在第1章libpmemkv介绍的基础上进行了扩展,并使用示例进行了更深入的讨论;
  • 第10章,持久性内存的易失性使用 — 本章适用于那些希望利用持久性内存但不需要持久性存储数据的人。libmemkind是一个构建在jemalloc之上的用户可扩展堆管理器,它可以控制内存特性,并在不同类型的内存(包括持久内存)之间对堆进行分区。libvmemcache是一个可嵌入的轻量级内存缓存解决方案。它的设计是为了充分利用大容量内存,例如带有DAX的持久内存,通过高效和可扩展的内存映射;
  • 第11章,为持久内存设计数据结构 — 为持久内存设计数据结构提供了丰富的信息;
  • 第12章,调试持久内存应用程序-介绍工具,以及几个软件开发人员如何调试启用持久内存的应用程序的示例;
  • 第13章,真实应用启用持久内存 — 讨论如何修改真实应用程序以启用持久性内存功能;
  • 第14章,并发性和持久性内存 — 描述应用程序中的并发性应如何实现,以便与持久性内存一起使用;
  • 第15章,性能分析与性能 — 讲授性能概念,并演示如何使用“Intel VTune工具套件”在更改代码之前和之后评测系统与应用程序;
  • 第16章,PMDK内部:重要算法和数据结构 — 带领我们深入了解PMDK的设计、体系结构、算法和内存分配器的实现;
  • 第17章,可靠性、可用性和可服务性(RAS)— 描述硬件和操作系统层的可靠性、可用性和可维护性(RAS)的实现;
  • 第18章,远程持久内存—讨论应用程序如何使用本地和远程持久内存跨多个系统扩展;
  • 第19章,高级主题 — 描述诸如NUMA、使用软件卷管理器和mmap()映射同步标志等内容。

附录中有安装PMDK的单独过程和管理持久内存所需的实用程序。我们还包括了Java的更新和RDMA协议的未来。所有这些内容都被认为是暂时的现状,所以我们不想把它包括在书的主体部分。

0.3    预期读者

这本书是为有经验的应用程序开发人员而写的,我们希望内容对更广泛的读者有用,例如系统管理员、架构师、学生、讲师和学术研究人员等等。系统设计师、内核开发人员,以及任何对这项新兴技术有兴趣的人,都会从本书中受益。

每个读者都将了解什么是持久内存、它如何工作,以及操作系统和应用程序如何利用它。供应和管理持久内存是特定于供应商的,因此我们在附录部分包含一些资源,以避免过度复杂化主要章节的内容。

应用程序开发人员将通过示例来学习如何将持久内存集成到现有的或新的应用程序中。在本书中,我们使用了持久内存开发工具包(PMDK)中提供的各种库来广泛地使用示例。示例代码以各种编程语言(如C、C++、JavaScript等)提供。我们希望开发人员能够在自己的项目中使用这些库。本书提供了大量的资源链接,在那里你可以找到帮助和信息。

云计算、高性能计算和企业环境的系统管理员和架构师可以使用本书的大部分内容来理解持久性内存特性以及支持应用程序和开发人员的好处。想象一下,能够在每台物理服务器上部署更多的虚拟机,或者为应用程序提供这个新的内存/存储层,这样它们就可以将更多的数据保存在离CPU更近的地方,或者在保留数据的热缓存的情况下,在更短时间内重新启动。

学生、讲师和学术研究人员也将从本书的许多章节中受益。计算机科学课程可以学习硬件、操作系统特性和编程技术。讲师可以在学生课程中自由使用这些内容,或者形成研究项目的基础,例如新的持久性内存文件系统、算法或缓存实现。

我们将介绍一些工具来分析服务器和应用程序,以便更好地理解CPU、内存和磁盘IO访问模式。利用这些知识,我们将展示如何使用持久内存开发工具包(PMDK)修改应用程序以充分利用持久性。

0.4    未来参考

 本书的内容多年来一直是为了提供价值而写的。行业规范(如ACPI、UEFI和SNIA非易失性编程模型)将在新版本发布时保持向后兼容,除非规范中另有说明。如果引入了新的形式因子,编程的方法将保持不变,我们不局限于一个特定的持久性内存供应商或实现。在需要描述特定于供应商的特性或实现的地方,我们会特别指出可能在供应商之间或产品代之间发生变化的地方。我们鼓励您阅读持久内存产品的供应商文档以了解更多信息。

使用持久内存开发工具包(PMDK)的开发人员将获得一个稳定的API接口。PMDK将在每个主要版本中提供新的特性和性能改进。它将随着新的持久内存产品、CPU指令、平台设计、行业规范和操作系统功能支持而发展。

0.5    源码样例

本书中的概念和源代码示例遵循与供应商无关的SNIA非易失性内存编程模型。SNIA是存储网络行业协会(Storage Networking Industry Association),是一个非盈利的全球性组织,致力于制定标准和教育计划,以促进存储和信息技术的发展。该模型由SNIA-NVM技术工作组(TWG)设计、开发和维护,该工作组包括许多领先的操作系统、硬件和服务器供应商。您可以加入此群或在https://www.snia.org/forums/sssi/nvmp上寻找信息。

本书提供的代码示例已使用Intel Optane DC持久内存进行了测试和验证。由于PMDK是厂商中立的,因此它们也可以在NVDIMM-N设备上工作。PMDK将支持任何未来进入市场的持久内存产品。

本书中使用的代码示例在出版时是最新的。所有代码示例都经过了验证和测试,以确保它们编译和执行时没有错误。为简洁起见,本书中的一些示例使用assert()语句来指示意外错误。任何生产代码都可能用适当的错误处理操作来代替这些操作,这些操作将包括更友好的错误消息和适当的错误恢复操作。另外,一些代码示例使用不同的装载点来表示持久内存感知文件系统,例如“/daxfs”、“/pmemfs”和“/mnt/pmemfs”。这演示了可以为应用程序正确地装载和命名持久内存文件系统,就像普通的基于块的文件系统一样。源代码来自本书附带的存储库-https://github.com/Apress/programming-persistent-memory。

由于这是一种快速发展的技术,本书中的软件和API引用可能会随着时间的推移而改变。尽管尽一切努力实现向后兼容,但有时软件必须进化并使以前的版本失效。因此,预计某些代码示例可能无法在较新的硬件或操作系统上编译,因此可能需要进行相应的更改。

0.6    本书惯例

本书使用了几种惯例来引起你对特定信息的注意。使用的约定取决于显示的信息类型。

计算机命令

命令、编程库和API函数引用可以使用等宽字体按照段落文本显示。例如:为了演示如何使用持久性内存,让我们从一个示例程序开始,演示一个名为libpmemkv的库提供的键值存储。

计算机终端输出

计算机终端输出通常直接取自以单行距字体显示的计算机终端,例如以下示例演示如何从GitHub项目克隆持久内存开发工具包(PMDK):

$ git clone https://github.com/pmem/pmdk 
Cloning into 'pmdk'... 
remote: Enumerating objects: 12, done. 
remote: Counting objects: 100% (12/12), done. 
remote: Compressing objects: 100% (10/10), done. 
remote: Total 100169 (delta 2), reused 7 (delta 2), pack-reused 100157 
Receiving objects: 100% (100169/100169), 34.71 MiB | 4.85 MiB/s, done. 
Resolving deltas: 100% (83447/83447), done.

源代码

从附带的GitHub存储库中获取的源代码示例以等宽字体显示相关行号。在每个代码列表的下面是对行号或行号范围的引用,并有一个简短的描述。代码注释使用语言本机样式。大多数语言使用相同的语法。单行注释将使用//,块/多行注释应使用/*…*/。清单1显示了一个示例。

Listing 1. A sample program using libpmemkv
37  #include <iostream>    
38  #include "libpmemkv.h"    
39      
40  using namespace pmemkv;    
41      
42  /*    
43   * kvprint -- print a single key-value pair    
44   */    
45  void kvprint(const string& k, const string& v) {    
46      std::cout << "key: " << k << ", value: " << v << "\n";    
47  }
  • 第45行:这里我们定义了一个小的助手例程kvprint(),它在调用时打印一个键值对。

注意

例如,当我们想让您的注意力集中在某个重要的问题上时,我们会使用标准格式来记录注释、注意事项和提示。

注意: 注释是指向当前讨论主题的提示、快捷方式或其他方法。忽略一个注意事项应该不会有负面的后果,但是你可能会错过一条让你的生活更轻松的信息。

后续:1.持久内存编程介绍

作者: charlie_chen

编程是一生最爱: >> 架构与设计; >> 软件工程; >> 项目管理; >> 产品研发。
联系我们

联系我们

022-XXXXXXXX

在线咨询: QQ交谈

邮箱: 1549889473@qq.com

欢迎交流。
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部