持久記憶體編程

持久記憶體編程

《持久記憶體編程》是2021年機械工業出版社出版的圖書,作者是史蒂夫·斯卡格爾(Steve Scargall),吳國安,魏劍,楊錦文等 譯。本書介紹了持久記憶體編程技術套用前景,涵蓋持久記憶體的作業系統和硬體要求,以及如何使用模擬和真實的持久記憶體硬體創建開發環境。

基本介紹

  • 中文名:持久記憶體編程
  • 作者:史蒂夫·斯卡格爾
  • 譯者:吳國安、魏劍、楊錦文
  • 出版社:機械工業出版社
  • ISBN:9787111676744 
內容簡介,圖書目錄,作者簡介,

內容簡介

本書介紹了持久記憶體編程技術套用前景,涵蓋持久記憶體的作業系統和硬體要求,以及如何使用模擬和真實的持久記憶體硬體創建開發環境。本書對持久記憶體的基本概念進行了解釋,介紹了面向 C、C++、JavaScript 和其他語言的持久記憶體編程 API,探討了採用持久記憶體的 RDMA,回顧了安全特性,並展示了許多示例。讀者可以在自己的系統上運行本書提供的原始碼和示例。

圖書目錄

第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

作者簡介

【作者簡介】
Steve Scargall是英特爾公司的一名持久記憶體軟體/雲架構師。作為一名技術宣傳官,Steve Scargall負責提供技術的啟動與開發支持工作,以便將持久記憶體技術集成到軟體棧、應用程式和硬體架構中,包括在專有和開源開發工作方面與獨立軟體開發商(ISV)進行合作,以及與原始設備製造商(OEM)和雲服務提供商(CSP)等合作。
Steve曾在英國雷丁大學潛心學習神經網路、人工智慧和機器人等知識,獲得了計算機科學和控制論專業學士學位。他曾負責為Solaris Kernel、ZFS和UFS檔案系統提供x86架構與SPARC性能分析支持,擁有超過19年的豐富經驗。在Sun Microsystems和Oracle工作期間,他負責企業和雲環境中的DTrace調試工作。
【譯者簡介】
吳國安(Dennis)2005年於上海交通大學碩士研究生畢業。目前是英特爾持久記憶體工程部經理,在IA架構、性能最佳化、軟體協同硬體開發方面有多年工作經驗。目前主要支持客戶套用英特爾數據中心級持久化記憶體進行軟體開發和套用適配,提供IA架構上的客戶方案技術諮詢和支持。在2012年加入英特爾之前,任職意法半導體,負責數位電視軟體開發和集成的工作。
魏劍(Terry Wei)是英特爾傲騰技術方案專家,在英特爾供職16年,曾擔任硬體開發、客戶技術支持等多種職位,目前主要致力於傲騰存儲技術在中國用戶環境的技術適配和套用推廣方面的工作。
楊錦文(Jinwen Yang)負責英特爾中國區雲計算和網際網路行業的戰略規劃和數據中心產品線的市場導入,並整合內部和外部技術資源,不斷最佳化數據中心的全棧式解決方案,專注於服務客戶的多樣化需求。
吳少慧(Shaohui Wu)目前是英特爾持久記憶體工程師,擁有清華大學工程物理系的工程學士學位以及北京有色金屬研究總院金屬材料及熱處理專業的工程碩士學位。2018年入職英特爾之前,從事半導體晶片的產品開發與製造方面的工作,目前主要致力於傲騰持久記憶體生態環境的建立,並推廣持久記憶體在中國區的套用。
許春曄(Chunye Xu)是英特爾公司的持久記憶體套用工程師,致力於客戶持久記憶體技術支持和工作負載調試工作,曾在英特爾通信和設備部門負責系統調試和自動化測試工作。他畢業於河北大學,擁有計算機套用碩士學位。
林翔(Xiang Lin)是英特爾公司的平台套用工程師,目前主要致力於持久記憶體的套用和研究工作,包括工作負載的套用和性能最佳化,同時還負責客戶支持方面的工作。此外,他對圖形圖像處理領域有著濃厚的興趣。
王龍(Long Wang)是英特爾公司的軟體工程師,當前主要致力於持久記憶體相關的資料庫開發與性能最佳化,同時還參與PMDK項目,例如遠程持久記憶體訪問的集成開發工作。
李曉冉(Xiaoran Li)2018年畢業於日本北海道大學信息與科學學院,目前就職於英特爾數據中心部門,從事傲騰持久記憶體研發工作,對系統存儲、雲計算、並行計算有濃厚興趣。
斯佩峰(Peifeng Si)是英特爾數據中心部門資深軟體工程師。長期從事x86伺服器的固件開發和軟體性能調優,目前專注於持久記憶體對資料庫及存儲類套用的最佳化。
陶少玉(Shaoyu Tao)在英特爾任職軟體工程師超過5年,在加入英特爾的前幾年,他主要從事Linux核心、系統調試相關工作,目前專注於基於持久記憶體的資料庫最佳化相關工作。
高明(Ming Gao)是英特爾公司中國區行業解決方案部網際網路行業技術總監,他主要負責英特爾與中國網際網路公司的技術戰略合作,助力中國網際網路公司利用英特爾的產品和技術構建雲計算解決方案,對包括人工智慧在內的各類工作負載進行性能最佳化。高明獲得了北京郵電大學計算機科學與技術專業碩士學位。
崔峰 2015年5月起就職於京天石易通信息技術有限公司,至今從業超過15年,2004年畢業於英國諾桑比亞大學,獲商業管理學士學位。

相關詞條

熱門詞條

聯絡我們